Saf css üzerinde sabit başlık ve sabit sütunlu tablo


104

Sabit bir başlık ve sabit bir ilk sütun içeren bir html tablosu (veya benzer görünümlü bir şey) oluşturmam gerekiyor.

Şimdiye kadar gördüğüm her çözüm Javascript kullanıyor veya jQueryscrollTop / scrollLeft'i ayarlamak için kullanıyor, ancak mobil tarayıcılarda sorunsuz çalışmıyor, bu yüzden saf bir CSS çözümü arıyorum.

Burada sabit bir sütun için bir çözüm buldum: jsfiddle.net/C8Dtf/20/ ancak başlığı da düzeltmek için onu nasıl geliştirebileceğimi bilmiyorum.

Webkit tarayıcılarda çalışmasını veya bazı css3özellikleri kullanmasını istiyorum , ancak tekrar ediyorum Javascript, kaydırma için kullanmak istemiyorum .

DÜZENLEME: Bu, elde etmek istediğim davranışın örneğidir: https://web.archive.org/web/20130829032141/http://datatables.net/release-datatables/extras/FixedColumns/css_size.html


Şu an için <thead> sabit başlığına sahip <html> <table> css-level-3 ile nerede ilgisi olduğunu anlamıyorum. Başka neyin var ? Şimdiye kadar ne denedin?
Milche Patern

positionSatırlara ve hücrelere karmaşık davranışlar uygulamaya çalıştım , ancak bunun nerede uygulanabileceğini tam olarak anlamıyorum.
panfil

Yanıtlar:


153

Sabit bir başlık satırı ve ilk sütuna sahip gerçek bir saf CSS çözümü

Saf CSS kullanarak hem sabit bir başlık hem de sabit bir ilk sütun içeren bir tablo oluşturmak zorunda kaldım ve buradaki yanıtların hiçbiri istediğim gibi değildi.

position: stickyMülkiyet (Ben en çok kullanılan gördüğümüz gibi) ve Chrome, Firefox ve Kenar modern sürümlerinde tarafına üstüne hem yapışmasını desteklemektedir. Bu, sayfanızın herhangi bir yerine yerleştirilebilecek sabit başlıklara sahip bir tablo verme özelliğine divsahip olan bir ile birleştirilebilir overflow: scroll:

Masanızı bir kaba yerleştirin:

<div class="container">
  <table></table>
</div>

overflow: scrollKaydırmayı etkinleştirmek için kapsayıcınızda kullanın :

div.container {
  overflow: scroll;
}

As Dagmar Açıklamalarda belirttiği, konteyner ayrıca gerektirir max-widthve max-height.

Kullanım position: stickykenarına tablo hücrelerini olması sopa ve top, rightveya leftsopa hangi kenar seçmek için:

thead th {
  position: -webkit-sticky; /* for Safari */
  position: sticky;
  top: 0;
}

tbody th {
  position: -webkit-sticky; /* for Safari */
  position: sticky;
  left: 0;
}

As MarredCheese yorum olarak bahsedilen ilk sütun içeriyorsa, <td>yerine unsurları <th>unsurları kullanabilirsiniz tbody td:first-childCSS'nizde yerinetbody th

İlk sütundaki başlığın solda kalması için şunu kullanın:

thead th:first-child {
  left: 0;
  z-index: 1;
}

https://jsfiddle.net/qwubvg9m/1/


22
Bu en iyi cevap gibi görünüyor.
user1190132

9
@PirateApp widthİlk sütununuzu biliyorsanız, position: stickyikinci sütununuzdaki hücrelerde leftilk sütununuza eşit bir değer kullanabilirsiniz width: jsfiddle.net/wvypo83c/794
Matthew Schlachter

4
Bu cevap, sonuna kadar okumaya değer olduğunu kanıtlıyor!
mlerley

4
Bu, kapsayıcıda maksimum genişlik ve maksimum yükseklik ayarı olmadan çalışmaz.
Dagmar

10
Bu cevap, burada, SO'da ve web'de şaşırtıcı derecede kendine güvenen, şaşırtıcı bir şekilde yükseltilmiş posterlerden bize arızalı, aşırı karmaşık, zaman kaybettiren yanıtların sonsuz denizinde evimize rehberlik eden bir deniz feneri. İlk sütununuz <td>öğeler yerine <th>öğeler içeriyorsa , tbody td:first-childbunun yerine CSS'nizde kullanabileceğinizi unutmayın tbody th.
MarredCheese

33

Günümüzde bu , yalnızcaposition: sticky özellik ile CSS kullanarak elde etmek mümkündür .

İşte bir pasaj:

(jsFiddle: https://jsfiddle.net/hbqzdzdt/5/ )

.grid-container {
  display: grid; /* This is a (hacky) way to make the .grid element size to fit its content */
  overflow: auto;
  height: 300px;
  width: 600px;
}
.grid {
  display: flex;
  flex-wrap: nowrap;
}
.grid-col {
  width: 150px;
  min-width: 150px;
}

.grid-item--header {
  height: 100px;
  min-height: 100px;
  position: sticky;
  position: -webkit-sticky;
  background: white;
  top: 0;
}

.grid-col--fixed-left {
  position: sticky;
  left: 0;
  z-index: 9998;
  background: white;
}
.grid-col--fixed-right {
  position: sticky;
  right: 0;
  z-index: 9998;
  background: white;
}

.grid-item {
  height: 50px;
  border: 1px solid gray;
}
<div class="grid-container">
  <div class="grid">
    <div class="grid-col grid-col--fixed-left">
      <div class="grid-item grid-item--header">
        <p>HEAD</p>
      </div>
      <div class="grid-item">
        <p>Hello</p>
      </div>
      <div class="grid-item">
        <p>Hello</p>
      </div>
      <div class="grid-item">
        <p>Hello</p>
      </div>
      <div class="grid-item">
        <p>Hello</p>
      </div>
      <div class="grid-item">
        <p>Hello</p>
      </div>
      <div class="grid-item">
        <p>Hello</p>
      </div>
      <div class="grid-item">
        <p>Hello</p>
      </div>
      <div class="grid-item">
        <p>Hello</p>
      </div>
      <div class="grid-item">
        <p>Hello</p>
      </div>
      <div class="grid-item">
        <p>Hello</p>
      </div>
    </div>

    <div class="grid-col">
      <div class="grid-item grid-item--header">
        <p>HEAD</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
    </div>

    <div class="grid-col">
      <div class="grid-item grid-item--header">
        <p>HEAD</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
    </div>

    <div class="grid-col">
      <div class="grid-item grid-item--header">
        <p>HEAD</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
    </div>

    <div class="grid-col">
      <div class="grid-item grid-item--header">
        <p>HEAD</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
    </div>

    <div class="grid-col">
      <div class="grid-item grid-item--header">
        <p>HEAD</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
    </div>

    <div class="grid-col">
      <div class="grid-item grid-item--header">
        <p>HEAD</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
    </div>

    <div class="grid-col">
      <div class="grid-item grid-item--header">
        <p>HEAD</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
    </div>

    <div class="grid-col">
      <div class="grid-item grid-item--header">
        <p>HEAD</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
    </div>

    <div class="grid-col">
      <div class="grid-item grid-item--header">
        <p>HEAD</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
    </div>

    <div class="grid-col">
      <div class="grid-item grid-item--header">
        <p>HEAD</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
    </div>

    <div class="grid-col grid-col--fixed-right">
      <div class="grid-item grid-item--header">
        <p>HEAD</p>
      </div>
      <div class="grid-item">
        <p>9</p>
      </div>
      <div class="grid-item">
        <p>9</p>
      </div>
      <div class="grid-item">
        <p>9</p>
      </div>
      <div class="grid-item">
        <p>9</p>
      </div>
      <div class="grid-item">
        <p>9</p>
      </div>
      <div class="grid-item">
        <p>9</p>
      </div>
      <div class="grid-item">
        <p>9</p>
      </div>
      <div class="grid-item">
        <p>9</p>
      </div>
      <div class="grid-item">
        <p>9</p>
      </div>
      <div class="grid-item">
        <p>9</p>
      </div>
    </div>

  </div>
</div>

Uyumlulukla ilgili olarak. Tüm büyük tarayıcılarda çalışır, ancak IE'de çalışmaz. Bir polyfill var position: stickyama ben hiç denemedim.


2
Bu harika, bayıldım!
Kaptan Lu

3
<div> ile değil <table> -tags ile bunu başarmanın herhangi bir yolu
Andreas

1
Bir uygulama geliştiriyorsanız ve bu tabloyu yazdırmak için kayıtlar arasında döngü yapmanız gerekiyorsa, bunun iyi bir performans göstermeyeceğini düşünüyorum çünkü tablodaki her sütun için tüm kayıt dizisinde döngü yapmanız gerekir. Bu HTML, sütun sütun çalışır.
igasparetto

@igasparetto Aslında satırları / sütunları başka bir şekilde düzenleyebilirsiniz ve çözüm yine de işe yarayacaktır. Daha sonra biraz zamanım olursa, ızgara sıralı satır -> sütunu ile bir pasaj oluşturabilirim.
Alvaro

2
<table> ve ilişkili etiketleri kullanmadan tablo şeklindeki verilerin görüntülenmemesini tavsiye ederim. Erişilebilirlik de dahil olmak üzere, bu şekilde amaçlanan HTML kullanımını bozmanın birkaç sorunu vardır. Ayrıca bakınız: w3.org/WAI/tutorials/tables
Ben Morris

15

Bu kolay bir başarı değil.

Aşağıdaki bağlantı, çalışan bir demoya yöneliktir:

Bağlantı lanoxx'un yorumuna göre güncellendi

http://jsfiddle.net/C8Dtf/366/

Bunları eklemeyi unutmayın:

<script type="text/javascript" charset="utf-8" src="http://datatables.net/release-datatables/media/js/jquery.js"></script>
<script type="text/javascript" charset="utf-8" src="http://datatables.net/release-datatables/media/js/jquery.dataTables.js"></script>
<script type="text/javascript" charset="utf-8" src="http://datatables.net/release-datatables/extras/FixedColumns/media/js/FixedColumns.js"></script>

Bunu başarmanın başka bir yolunu görmüyorum. Özellikle sadece css kullanarak değil.

Bu, geçilmesi gereken çok şey. Bu yardımcı olur umarım :)


Filtreyi değiştirmek için şunları kullanın: "bFilter": false
lanoxx

6
O ise sadece css ile bunu başarmak mümkün. Kolay değil ama mümkün.
Jimmy T.

yaklaşık 10 çözüm arasından işe yarayan tek çözüm buydu. Btw, "57 kayıttan 1 ila 57 tanesi gösteriliyor" aramaya eklemek "bInfo" : falseiçin.dataTable()
hansaplast

datatables == "harika"
billynoah

kötü olduğu için bu çözüme olumsuz oy vermek. theaddeğişikliklerine bağlı değildir, kendi tablosu içinde bulunursa, tdbir hücre metin uzunsa, yani elemanların thgenişliği uygun şekilde ayarlanır olmaz.
vsync

14

Bu önerilerin tümü harika ve hepsi, ancak ya yalnızca başlığı ya da bir sütunu düzeltiyorlar, ikisini birden değil ya da javascript kullanıyorlar. Nedeni - saf CSS ile yapılabileceğine inanmıyor. Sebep:

Bunu yapmak mümkün olsaydı, her biri farklı yönde bir kaydırma içeren birkaç kaydırılabilir div'i birbirinin içine yerleştirmeniz gerekirdi. Ardından tablonuzu üç bölüme ayırmanız gerekir - sabit başlık, sabit sütun ve verilerin geri kalanı.

İnce. Ama şimdi sorun - birini kaydırdığınızda birisinin yerinde kalmasını sağlayabilirsiniz, ancak diğeri ilk kaydırma alanının içine yerleştirilmiştir ve bu nedenle gözden uzak bir şekilde kaydırılabilir, bu nedenle yerinde sabitlenemez ekran. 'Ah-ha' diyorsunuz 'ama bunu yapmak için bir şekilde mutlak veya sabit pozisyon kullanabilirim' - hayır yapamazsınız. Bunu yaptığınız anda o konteyneri kaydırma yeteneğini kaybedersiniz. Bu bir tavuk ve yumurta durumu - ikisine birden sahip olamazsınız, birbirlerini iptal ederler.

Tek çözümün javascript aracılığıyla olduğuna inanıyorum. Üç öğeyi tamamen ayırmanız ve konumlarını javascript aracılığıyla senkronize etmeniz gerekir. Bu sayfadaki diğer yazılarda güzel örnekler var. Bu da bir göz atmaya değer:

http://tympanus.net/codrops/2014/01/09/sticky-table-headers-columns/


9

Jsfiddle'da bazı değişiklikler yaptım. Yapmaya çalıştığınız şey bu olabilir.

http://jsfiddle.net/C8Dtf/81/

Başlıkları şu şekilde kodladım:

<table id="left_table" class="freeze_table">
    <tr class='tblTitle'>
         <th>Title 1</th>
         <th>Title 2</th>
    </tr>
</table>

Ve bazı stiller de ekledim.

.tblTitle{
   position:absolute;
    top:0px;
    margin-bottom:30px;
    background:lightblue;
}
td, th{
    padding:5px;
    height:40px;
    width:40px;
    font-size:14px;
}

Umarım istediğin budur :)


1
İçeriğiyle birlikte kaydırmak için sağ tablonun başlığına ihtiyacım var.
panfil

İşte URL: jsfiddle.net/C8Dtf/84 . İki tabloyu hizalamak için sağ masanın stiliyle oynamanız yeterlidir.
Phillip-juan

Hayır. Tam olarak anlamıyorsun. Sağ tablonun başlığının en üste sabitlenmesine ihtiyacım var, böylece tablo yukarı ve aşağı kaydırıldığında hala görülebilir, ancak tablo sağa veya sola kaydırıldığında başlık sağa veya sola kaydırmalı, ancak yine de üstte sabit olmalıdır. Kötü İngilizce becerilerim için özür dilerim.
panfil

Sağdaki tablonun başlığının dikey olarak kaydırılırken sabitlenmesini ve yatay kaydırırken kaydırılmasını mı istiyorsunuz?
Phillip-juan

Bu, elde etmek istediğim davranışa bir örnek: datatables.net/release-datatables/extras/FixedColumns/…
panfil

9

Yalnızca CSS kullanan bir örnek:

.table {
  table-layout: fixed;
  width: 500px;
  border-collapse: collapse;
}

.header th {
  font-family: Calibri;
  font-size: small;
  font-weight: lighter;
  border-left: 1px solid #000;
  background: #d0d0d0;
}

.body_panel {
  display: inline-block;
  width: 520px;
  height: 300px;
  overflow-y: scroll;
}

.body tr {
  border-bottom: 1px solid #d0d0d0;
}

.body td {
  border-left: 1px solid #d0d0d0;
  padding-left: 3px;
  font-family: Calibri;
  font-size: small;
  overflow: hidden;
  white-space: nowrap;
  text-overflow: ellipsis;
}
<body>

  <table class="table">

    <thead class="header">

      <tr>
        <th style="width:20%;">teste</th>
        <th style="width:30%;">teste 2</th>
        <th style="width:50%;">teste 3</th>
      </tr>

    </thead>
  </table>

  <div class="body_panel">

    <table class="table">
      <tbody class="body">

        <tr>
          <td style="width:20%;">asbkj k kajsb ksb kabkb</td>
          <td style="width:30%;">2</td>
          <td style="width:50%;">3</td>
        </tr>

        <tr>
          <td style="width:20%;">2</td>
          <td style="width:30%;">2</td>
          <td style="width:50%;">3</td>
        </tr>

        <tr>
          <td style="width:20%;">2</td>
          <td style="width:30%;">2</td>
          <td style="width:50%;">3</td>
        </tr>

        <tr>
          <td style="width:20%;">2</td>
          <td style="width:30%;">2</td>
          <td style="width:50%;">3</td>
        </tr>

        <tr>
          <td style="width:20%;">2</td>
          <td style="width:30%;">2</td>
          <td style="width:50%;">3</td>
        </tr>

        <tr>
          <td style="width:20%;">2</td>
          <td style="width:30%;">2</td>
          <td style="width:50%;">3</td>
        </tr>

        <tr>
          <td style="width:20%;">2</td>
          <td style="width:30%;">2</td>
          <td style="width:50%;">3</td>
        </tr>

        <tr>
          <td style="width:20%;">2</td>
          <td style="width:30%;">2</td>
          <td style="width:50%;">3</td>
        </tr>

        <tr>
          <td style="width:20%;">2</td>
          <td style="width:30%;">2</td>
          <td style="width:50%;">3</td>
        </tr>

        <tr>
          <td style="width:20%;">2</td>
          <td style="width:30%;">2</td>
          <td style="width:50%;">3</td>
        </tr>

        <tr>
          <td style="width:20%;">2</td>
          <td style="width:30%;">2</td>
          <td style="width:50%;">3</td>
        </tr>

        <tr>
          <td style="width:20%;">2</td>
          <td style="width:30%;">2</td>
          <td style="width:50%;">3</td>
        </tr>

        <tr>
          <td style="width:20%;">2</td>
          <td style="width:30%;">2</td>
          <td style="width:50%;">3</td>
        </tr>

        <tr>
          <td style="width:20%;">2</td>
          <td style="width:30%;">2</td>
          <td style="width:50%;">3</td>
        </tr>

        <tr>
          <td style="width:20%;">2</td>
          <td style="width:30%;">2</td>
          <td style="width:50%;">3</td>
        </tr>

        <tr>
          <td style="width:20%;">2</td>
          <td style="width:30%;">2</td>
          <td style="width:50%;">3</td>
        </tr>

        <tr>
          <td style="width:20%;">2</td>
          <td style="width:30%;">2</td>
          <td style="width:50%;">3</td>
        </tr>

        <tr>
          <td style="width:20%;">2</td>
          <td style="width:30%;">2</td>
          <td style="width:50%;">3</td>
        </tr>

      </tbody>
    </table>

  </div>

</body>


3
Sadece heder sabitlemeye değil, ilk sütuna da ihtiyacım vardı.
panfil

Bu örnek, html'de iki tablo içeren bir yaklaşımı gösterir: bir tablo yalnızca başlığı işler; ikinci tablo yalnızca satırları işler ancak bunu a içinde yapar div. Öyle divaynı yerde başlık kalır iken satır kaydırmayı izin verdiğini. Bu yaklaşım ihtiyaçlarım için çalıştı.
David Tansey

Yatay kaydırma da varsa, tabloların kaydırma konumlarını senkronize etmek için biraz JS'ye ihtiyacınız vardır.
Zoltán Tamási

4

Sorun için Paul O'Brien'dan mükemmel bir çözüm buldum ve bağlantıyı paylaşmak istiyorum: https://codepen.io/paulobrien/pen/LBrMxa

Altbilgi stilini kaldırdım:

html {
  box-sizing: border-box;
}
*,
*:before,
*:after {
  box-sizing: inherit;
}
.intro {
  max-width: 1280px;
  margin: 1em auto;
}
.table-scroll {
  position: relative;
  width:100%;
  z-index: 1;
  margin: auto;
  overflow: auto;
  height: 350px;
}
.table-scroll table {
  width: 100%;
  min-width: 1280px;
  margin: auto;
  border-collapse: separate;
  border-spacing: 0;
}
.table-wrap {
  position: relative;
}
.table-scroll th,
.table-scroll td {
  padding: 5px 10px;
  border: 1px solid #000;
}
.table-scroll thead th {
  position: -webkit-sticky;
  position: sticky;
  top: 0;
}

th:first-child {
  position: -webkit-sticky;
  position: sticky;
  left: 0;
  z-index: 2;
  background: #ccc;
}
thead th:first-child {
  z-index: 5;
}

4

Hem Başlıkları hem de Sütunları düzeltmek için aşağıdaki eklentiyi kullanabilirsiniz:


Temmuz 2019'da güncellendi

Yakın zamanda , her bir öğeye (ana kapsayıcıları yerine ) uygulanan CSS özelliğine dayanan ( bununla ilgili daha fazla ayrıntı için burada) saf bir CSS çözümü de ortaya çıktıposition: sticky;TH


1
İlk bağlantı koptu. İkincisi jQuery kullanır.
PussInBoots

Ölü bağlantıyı kaldırmak için güncellenmiş yanıt
Luca Detomi 07

2

Son zamanlarda sabit bir başlık grubu ve sabit bir ilk sütun içeren bir çözüm oluşturmak zorunda kaldım. Tablomu div'lere böldüm ve jquery kullanarak pencere kaydırmayı yakaladım.

http://jsfiddle.net/TinT/EzXub/2346/

var prevTop = 0;
var prevLeft = 0;

$(window).scroll(function(event){
  var currentTop = $(this).scrollTop();
  var currentLeft = $(this).scrollLeft();

  if(prevLeft !== currentLeft) {
    prevLeft = currentLeft;
    $('.header').css({'left': -$(this).scrollLeft()})
  }
  if(prevTop !== currentTop) {
    prevTop = currentTop;
    $('.leftCol').css({'top': -$(this).scrollTop() + 40})
  }
});

1

Bir iş arkadaşım ve ben, tablonuzu sabit başlıklar ile süslemek için kullanabileceğiniz bir Angular yönergesi sağlayan yeni bir GitHub projesi yayınladık: https://github.com/objectcomputing/FixedHeader

Bazı divler ekleyen bir yönerge ile yalnızca css ve angular'a dayanır. JQuery gerekli değildir.

Bu uygulama, diğer bazı uygulamalar kadar tam özellikli değildir, ancak ihtiyacınız sadece sabit tablolar eklemekse, bunun iyi bir seçenek olabileceğini düşünüyoruz.


1

Internet Explorer 9 + Chrome + Firefox (Windows) ve Safari (Mac) ile iki gün savaştıktan sonra, bir sistem buldum

  • Tüm bu tarayıcılarla uyumlu
  • JavaScript kullanmadan
  • Yalnızca une div ve bir tablo kullanma
  • Kaydırılabilir gövdeli sabit üstbilgi ve altbilgi (IE hariç). Aynı sütun genişliğine sahip başlık ve gövde

Sonuç: görüntü açıklamasını buraya girin

HTML:

  <thead>
    <tr>
      <th class="nombre"><%= f.label :cost_center %></th>
      <th class="cabecera cc">Personal</th>
      <th class="cabecera cc">Dpto</th>
    </tr>
  </thead>
  <tbody>
    <% @cost_centers.each do |cc| %>
    <tr>
      <td class="nombre"><%= cc.nombre_corto %></td>
      <td class="cc"><%= cc.cacentrocoste %></td>
      <td class="cc"><%= cc.cacentrocoste_dpto %></td>
    </tr>
    <% end %>
  </tbody>
  <tfoot>
    <tr>
      <td colspan="3"><a href="#">Mostrar mas usuarios</a></td>
    </tr>
  </tfoot>
</table>

CSS:

div.cost_center{
  width:320px;
  font-size:75%;
  margin-left:5px;
  margin-top:5px;
  margin-bottom: 2px;
  float: right;
  display: inline-block;
  overflow-y: auto;
  overflow-x: hidden;
  max-height:300px;  
}

div.cost_center label { 
  float:none;
  font-size:14px;
}

div.cost_center table{
  width:300px;
  border-collapse: collapse; 
  float:right;
  table-layout:fixed;
}

div.cost_center table tr{
  height:16px;
}
div.cost_center th{
  font-weight:normal;
}

div.cost_center table tbody{
  display: block;
  overflow: auto;
  max-height:240px;
}

div.cost_center table thead{
  display:block;
}

div.cost_center table tfoot{
  display:block;
}
div.cost_center table tfoot td{
  width:280px;
}
div.cost_center .cc{
  width:60px;
  text-align: center; 
  border: 1px solid #999;
}

div.cost_center .nombre{
  width:150px;
}
div.cost_center tbody .nombre{
  border: 1px solid #999;
}

div.cost_center table tfoot td{
 text-align:center;  
 border: 1px solid #999; 
} 

div.cost_center table th, 
div.cost_center table td { 
  padding: 2px;
  vertical-align: middle; 
}

div.cost_center table tbody td {
  white-space: normal;
  font:  .8em/1.4em Verdana, sans-serif;
  color: #000;
  background-color: white;
}
div.cost_center table th.cabecera { 
  font:  0.8em/1.4em Verdana, sans-serif;
  color: #000;
  background-color: #FFEAB5;
}

İyi deneme, ama benim için pek işe yaramıyor. Bu örnekte ( jsfiddle.net/5ka6e ), başlık doğru şekilde yeniden boyutlandırılmıyor. Bu tür bir hata, sonunda veri ve başlık uyumsuzluğuna neden olabilir.
darkzangel

1
Eklemeyi unuttunuz div.cost_center table{border-collapse: collapse;}ve üçüncü başlık 60 piksele uyan bir şey olmalı (bu örnekte)
Albert Català

1

Mevcut cevaplar çoğu kişiye uyacaktır, ancak sabit başlığın altına ve ilk (sabit) sütunun sağına gölge eklemek isteyenler için işte bir çalışma örneği (saf css):

http://jsbin.com/nayifepaxo/1/edit?html,output

İşe bu almakla ana hile kullanıyor ::afterbirinci Her sağındaki gölgeler eklemek için tdher tr:

tr td:first-child:after {
  box-shadow: 15px 0 15px -15px rgba(0, 0, 0, 0.05) inset;
  content: "";
  position:absolute;
  top:0;
  bottom:0;
  right:-15px;
  width:15px;
}

Her şeyin çalışması için biraz zaman aldı (çok uzun ...) bu yüzden benzer durumda olanlar için paylaşacağımı düşündüm.


Bunu başka birinin cevabına dayandırıp gölgeyi ekledin mi?
PussInBoots

1

üstbilgi altbilgisini düzeltmeniz gerekiyor


0

Bunun gibi bir şey sizin için işe yarayabilir ... Muhtemelen başlık satırınız için sütun genişliklerini ayarlamanızı gerektirecektir.

thead { 
    position: fixed;
}

http://jsfiddle.net/vkhNC/

Güncelleme:

Verdiğiniz örneğin sadece CSS ile mümkün olduğuna ikna olmadım. Birinin yanıldığımı kanıtlamasını isterim. İşte şimdiye kadar sahip olduğum şeyler . Bitmiş ürün değil ama sizin için bir başlangıç ​​olabilir. Umarım bu, nerede olursa olsun size yardımcı bir yön gösterir.


Sadece başlığa değil, ilk sütunun da düzeltilmesine ihtiyacım var.
panfil

5
Sorun, başlıkların genişliğini kaybetmesidir. Farklı başlık sütun boyutu ve veri sütun boyutu ile çirkin görünüyor.
Akash Kava


0

Saf CSS Örneği:

<div id="cntnr">
    <div class="tableHeader">
        <table class="table-header table table-striped table-bordered">
            <thead>
                <tr>
                    <th>this</th>
                    <th>transmission</th>
                    <th>is</th>
                    <th>coming</th>
                    <th>to</th>
                    <th>you</th>
                </tr>
            </thead>
            <tbody>
                <tr>
                    <td>we've got it...</td>
                    <td>alright you are go</td>
                    <td>uh, we see the Earth now</td>
                    <td>we've got it...</td>
                    <td>alright you are go</td>
                    <td>uh, we see the Earth now</td>
                </tr>
            </tbody>
        </table>
    </div>


    <div class="tableBody">
        <table class="table-body table table-striped table-bordered">
            <thead>
                <tr>
                    <th>this</th>
                    <th>transmission</th>
                    <th>is</th>
                    <th>coming</th>
                    <th>to</th>
                    <th>you</th>
                </tr>
            </thead>
            <tbody>
                <tr>
                    <td>we've got it...</td>
                    <td>alright you are go</td>
                    <td>uh, we see the Earth now</td>
                    <td>we've got it...</td>
                    <td>alright you are go</td>
                    <td>uh, we see the Earth now</td>
                </tr>
            </tbody>
        </table>
    </div>

</div>

#cntnr {
    width: auto;
    height: 200px;
    border: solid 1px #444;
    overflow: auto;
}

.tableHeader {
    position: fixed;
    height: 40px;
    overflow: hidden;
    margin-right: 18px;
    background: white;
}

.table-header tbody {
    height: 0;
    visibility: hidden;
}

.table-body thead {
    height: 0;
    visibility: hidden;
}

http://jsfiddle.net/cCarlson/L98m854d/

Dezavantaj: Sabit başlık yapısı / mantığı oldukça belirli boyutlara bağlıdır, bu nedenle soyutlama muhtemelen geçerli bir seçenek değildir .


Hem sabit başlık hem de sabit ilk sütun gerekir.
panfil

Ah ... bunu gösterdiğin için teşekkürler, panfil. Bir düzenleme yapacağım. Şerefe
Cody

0

Konum: yapışkan, Chrome'daki (thead) gibi bazı öğeler ve safari gibi diğer webkit tarayıcıları için çalışmaz.

Ama (th) ile iyi çalışıyor

body {
  background-color: rgba(0, 255, 200, 0.1);
}

.intro {
  color: rgb(228, 23, 23);
}

.wrapper {
  overflow-y: scroll;
  height: 300px;
}

.sticky {
  position: sticky;
  top: 0;
  color: black;
  background-color: white;
}
<div class="container intro">
  <h1>Sticky Table Header</h1>
  <p>Postion : sticky doesn't work for some elements like (thead) in chrome and other webkit browsers like safari. </p>
  <p>But it works fine with (th)</p>
</div>
<div class="container wrapper">
  <table class="table table-striped">
    <thead>
      <tr>
        <th class="sticky">Firstname</th>
        <th class="sticky">Lastname</th>
        <th class="sticky">Email</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td>James</td>
        <td>Vince</td>
        <td>james@example.com</td>
      </tr>
      <tr>
        <td>Jonny</td>
        <td>Bairstow</td>
        <td>jonny@example.com</td>
      </tr>
      <tr>
        <td>James</td>
        <td>Anderson</td>
        <td>james@example.com</td>
      </tr>
      <tr>
        <td>Stuart</td>
        <td>Broad</td>
        <td>stuart@example.com</td>
      </tr>
      <tr>
        <td>Eoin</td>
        <td>Morgan</td>
        <td>eoin@example.com</td>
      </tr>
      <tr>
        <td>Joe</td>
        <td>Root</td>
        <td>joe@example.com</td>
      </tr>
      <tr>
        <td>Chris</td>
        <td>Woakes</td>
        <td>chris@example.com</td>
      </tr>
      <tr>
        <td>Liam</td>
        <td>PLunkett</td>
        <td>liam@example.com</td>
      </tr>
      <tr>
        <td>Jason</td>
        <td>Roy</td>
        <td>jason@example.com</td>
      </tr>
      <tr>
        <td>Alex</td>
        <td>Hales</td>
        <td>alex@example.com</td>
      </tr>
      <tr>
        <td>Jos</td>
        <td>Buttler</td>
        <td>jos@example.com</td>
      </tr>
      <tr>
        <td>Ben</td>
        <td>Stokes</td>
        <td>ben@example.com</td>
      </tr>
      <tr>
        <td>Jofra</td>
        <td>Archer</td>
        <td>jofra@example.com</td>
      </tr>
      <tr>
        <td>Mitchell</td>
        <td>Starc</td>
        <td>mitchell@example.com</td>
      </tr>
      <tr>
        <td>Aaron</td>
        <td>Finch</td>
        <td>aaron@example.com</td>
      </tr>
      <tr>
        <td>David</td>
        <td>Warner</td>
        <td>david@example.com</td>
      </tr>
      <tr>
        <td>Steve</td>
        <td>Smith</td>
        <td>steve@example.com</td>
      </tr>
      <tr>
        <td>Glenn</td>
        <td>Maxwell</td>
        <td>glenn@example.com</td>
      </tr>
      <tr>
        <td>Marcus</td>
        <td>Stoinis</td>
        <td>marcus@example.com</td>
      </tr>
      <tr>
        <td>Alex</td>
        <td>Carey</td>
        <td>alex@example.com</td>
      </tr>
      <tr>
        <td>Nathan</td>
        <td>Coulter Nile</td>
        <td>nathan@example.com</td>
      </tr>
      <tr>
        <td>Pat</td>
        <td>Cummins</td>
        <td>pat@example.com</td>
      </tr>
      <tr>
        <td>Adam</td>
        <td>Zampa</td>
        <td>zampa@example.com</td>
      </tr>
    </tbody>
  </table>
</div>

Veya codepen örneğimi ziyaret edin :



-2

Yalnızca saf HTML ve CSS kullanmak istiyorsanız, sorununuz için bir çözüm bulabilirim:
Bu jsFiddle'da sabit bir başlığa sahip bir tablo sağlayan komut dosyası olmayan bir çözüm görebilirsiniz. İşaretlemeyi sabit bir ilk sütun için uyarlamak da sorun olmamalıdır. hWrapper-Div içindeki ilk sütun için mutlak konumlandırılmış bir tablo oluşturmanız ve -div'i yeniden konumlandırmanız gerekir vWrapper.
Dinamik içerik sağlamak, sunucu tarafı veya tarayıcı tarafı cazip motorları kullanırken bir sorun olmamalı, çözümüm tüm modern tarayıcılarda ve IE8'den itibaren eski tarayıcılarda iyi çalışıyor.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.