% 100 genişlikli HTML tablosu, tbody içinde dikey kaydırma


423

<table>% 100 genişlik için nasıl ayarlayabilirim ve <tbody>bir yükseklik için yalnızca dikey kaydırmanın içine nasıl koyabilirim ?

tbody içinde dikey kaydırma

table {
    width: 100%;
    display:block;
}
thead {
    display: inline-block;
    width: 100%;
    height: 20px;
}
tbody {
    height: 200px;
    display: inline-block;
    width: 100%;
    overflow: auto;
}
  
<table>
  <thead>
    <tr>
    	<th>Head 1</th>
    	<th>Head 2</th>
    	<th>Head 3</th>
    	<th>Head 4</th>
    	<th>Head 5</th>
    </tr>
  </thead>
  <tbody>
    <tr>
    	<td>Content 1</td>
    	<td>Content 2</td>
    	<td>Content 3</td>
    	<td>Content 4</td>
    	<td>Content 5</td>
    </tr>
  </tbody>
</table>

Ben, değişim ekranına çalışırken bazı ek div eklemekten kaçının istiyorum, tek istediğim bu gibi basit bir tablodur ve table-layout, positionve CSS tabloda çok daha şeyler sadece px sabit genişliğe sahip% 100 genişlik ile iyi çalışmıyor.


Gerçekten ne elde etmek istediğinizden emin değilim. şuna bak: jsfiddle.net/CrSpu ve nasıl davranmasını istediğinizi söyleyin
x4rf41 12:13

2
biliyorum ama bak .. inci ve td tam genişlik gösterilmiyor .. postimg.org/image/mgd630y61
Marko S


Yanıtlar:


675

<tbody>Öğeyi kaydırılabilir yapmak için, sayfada görüntülenme biçimini değiştirmemiz gerekir; örneğin display: block;bunu bir blok düzeyi öğesi olarak görüntülemek için kullanılır .

Değiştirmemiz yana displayözelliği tbody, biz bu özelliğini değiştirmek gerekir theadelemanı yanı tablo düzeni kırılmasını önlemek için.

Böylece sahibiz:

thead, tbody { display: block; }

tbody {
    height: 100px;       /* Just for the demo          */
    overflow-y: auto;    /* Trigger vertical scroll    */
    overflow-x: hidden;  /* Hide the horizontal scroll */
}

Web tarayıcıları theadve tbodyöğelerini satır grubu ( table-header-groupvetable-row-group varsayılan ) olarak görüntüler.

Bunu değiştirdiğimizde, içi tr elemanlar konteynerlerinin tüm alanını doldurmaz.

Bunu düzeltmek için tbodysütunların genişliğini hesaplamamız ve karşılık gelen değerithead JavaScript aracılığıyla sütunlara .

Otomatik Genişlik Sütunları

Yukarıdaki mantığın jQuery sürümü:

// Change the selector if needed
var $table = $('table'),
    $bodyCells = $table.find('tbody tr:first').children(),
    colWidth;

// Get the tbody columns width array
colWidth = $bodyCells.map(function() {
    return $(this).width();
}).get();

// Set the width of thead columns
$table.find('thead tr').children().each(function(i, v) {
    $(v).width(colWidth[i]);
});    

Ve işte çıktı (Windows 7 Chrome 32'de) :

tbody içinde dikey kaydırma

ÇALIŞMA DEMOSU .

Tam Genişlik Tablosu, Göreceli Genişlik Sütunları

Orijinal Poster gerektiğinde, kabının table% 100'üne kadar genişletebilir widthve ardından tablonun her sütunu için göreli ( Yüzde ) kullanabilirsiniz width.

table {
    width: 100%; /* Optional */
}

tbody td, thead th {
    width: 20%;  /* Optional */
}

Tablonun (bir çeşit) sıvı düzenithead olduğundan, kap yeniden boyutlandırıldığında sütun genişliğini ayarlamalıyız .

Bu nedenle, pencere yeniden boyutlandırıldıktan sonra sütunların genişliklerini ayarlamalıyız:

// Adjust the width of thead cells when *window* resizes
$(window).resize(function() {
    /* Same as before */ 
}).resize(); // Trigger the resize handler once the script runs

Çıktı:

Gövde içinde dikey kaydırma ile Sıvı Tablosu

ÇALIŞMA DEMOSU .


Tarayıcı Desteği ve Alternatifleri

Yukarıdaki iki yöntemi Windows 7'de büyük Web Tarayıcılarının (IE10 + dahil) yeni sürümleri aracılığıyla test ettim ve işe yaradı.

Ancak, gelmez işe düzgün IE9 üzerinde ve altında.

Bunun nedeni , bir tablo düzeninde , tüm öğelerin aynı yapısal özellikleri izlemesi gerektiğidir.

Kullanarak display: block;için <thead>ve <tbody>elemanları, biz masa yapısını kırdım.

JavaScript ile düzeni yeniden tasarlayın

Bir yaklaşım, (tüm) tablo düzenini yeniden tasarlamaktır. Anında yeni bir düzen oluşturmak ve / veya hücrelerin genişliklerini / yüksekliklerini dinamik olarak ayarlamak için JavaScript kullanma.

Örneğin, aşağıdaki örneklere göz atın:

Yerleştirme tabloları

Bu yaklaşım, div içeren iki iç içe tablo kullanır. Birincisinde a tableolan tek bir hücre vardır divve ikinci tablo bu divöğenin içine yerleştirilir .

Kontrol Dikey kaydırma tablolar de CSS Oynat .

Bu, çoğu web tarayıcısında çalışır. Yukarıdaki mantığı JavaScript ile dinamik olarak da yapabiliriz.

Sabit başlıklı tablo

Dikey kaydırma çubuğu ekleme amacı her satırın üstünde <tbody>tablo üstbilgisini görüntülediğinden , öğeyi kalacak şekilde konumlandırabiliriztheadfixed ekranın üstünde .

İşte Julien tarafından gerçekleştirilen bu yaklaşımın bir Çalışma Demosu . Umut verici bir web tarayıcısı desteği var.

Ve burada bir saf CSS ile uygulama Willem Van Bockstal .


Saf CSS Çözümü

İşte eski cevap. Elbette yeni bir yöntem ekledim ve CSS bildirimlerini geliştirdim.

Sabit Genişlikli Masa

Bu durumda, tablesabit olmalıdır width (sütun genişliklerinin toplamı ve dikey kaydırma çubuğunun genişliği dahil) .

Her bir sütun, bir spesifik olmalıdır genişliği ve son sütun ait theadelemanının daha büyük bir ihtiyaç genişliği diğerleri eşittir genişliği + genişlik dikey kaydırma çubuğu arasında.

Bu nedenle, CSS şöyle olur:

table {
    width: 716px; /* 140px * 5 column + 16px scrollbar width */
    border-spacing: 0;
}

tbody, thead tr { display: block; }

tbody {
    height: 100px;
    overflow-y: auto;
    overflow-x: hidden;
}

tbody td, thead th {
    width: 140px;
}

thead th:last-child {
    width: 156px; /* 140px + 16px scrollbar width */
}

İşte çıktı:

Sabit Genişlikli Masa

ÇALIŞMA DEMOSU .

% 100 Genişliğe Sahip Masa

Bu yaklaşımda, tablebir genişliğe sahiptir 100%ve her biri için thve tddeğeri, widthözelliği en az olmalıdır 100% / number of cols.

Ayrıca, azaltmak için gereken genişlikte bir theaddeğeri olarak genişliği dikey kaydırma çubuğu arasında.

Bunu yapmak için CSS3 calc()işlevini aşağıdaki gibi kullanmamız gerekir :

table {
    width: 100%;
    border-spacing: 0;
}

thead, tbody, tr, th, td { display: block; }

thead tr {
    /* fallback */
    width: 97%;
    /* minus scroll bar width */
    width: -webkit-calc(100% - 16px);
    width:    -moz-calc(100% - 16px);
    width:         calc(100% - 16px);
}

tr:after {  /* clearing float */
    content: ' ';
    display: block;
    visibility: hidden;
    clear: both;
}

tbody {
    height: 100px;
    overflow-y: auto;
    overflow-x: hidden;
}

tbody td, thead th {
    width: 19%;  /* 19% is less than (100% / 5 cols) = 20% */
    float: left;
}

İşte Online Demo .

Not: Her sütunun içeriği çizgiyi kırarsa bu yaklaşım başarısız olur, yani her hücrenin içeriği yeterince kısa olmalıdır .


Aşağıda, bu soruyu cevapladığım sırada oluşturduğum iki basit saf CSS çözümü örneği var .

İşte jsFiddle Demo v2 .

Eski versiyon: jsFiddle Demo v1


17
İle display: blocktablonun özelliklerini kaybederler sütunun genişliği thead ve tbody arasında paylaşılan olarak. Bunu ayarlayarak düzelttiğinizi biliyorum, width: 19.2%ancak her sütunun genişliğini önceden bilmiyorsak, bu işe yaramaz.
samb

10
Bu kod, vücut hücrelerinin her zaman başlık hücrelerinden daha geniş olacağını varsayar.
Adam Donahue

2
Ne height: 100%zaman çalışmıyor (tablonun sayfanın altına genişlemesini istediğinizde).
AlikElzin-kilaka

2
Bu, AngularJS ng-repeattablolarıyla da fevkalade çalışır . Sabit tablo başlıklarına sahip tüm kitaplıkların neden olduğundan emin değilim ve bu çözüm varken neden olmasın.
chakeda

2
box-sizingİki farklı kalınlıktaki kenarlara sahip olmak sütun hizalamasını atmamak için bunu özellikle biraz daha geliştirebilirsiniz .
Ricca

89

Aşağıdaki çözümde, tablo ana kabın% 100'ünü kaplar, mutlak boyut gerekmez. Saf CSS, esnek düzen kullanılır.

İşte böyle görünüyor: resim açıklamasını buraya girin

Olası dezavantajlar:

  • dikey kaydırma çubuğu gerekip gerekmediğine bakılmaksızın her zaman görülebilir;
  • tablo düzeni sabittir - sütunlar içerik genişliğine göre yeniden boyutlandırılmaz (yine de istediğiniz sütun genişliğini istediğiniz gibi ayarlayabilirsiniz);
  • Mutlak bir boyut var - kaydırma çubuğunun genişliği, kontrol edebildiğim tarayıcılar için yaklaşık 0.9em.

HTML (kısaltılmış):

<div class="table-container">
    <table>
        <thead>
            <tr>
                <th>head1</th>
                <th>head2</th>
                <th>head3</th>
                <th>head4</th>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td>content1</td>
                <td>content2</td>
                <td>content3</td>
                <td>content4</td>
            </tr>
            <tr>
                <td>content1</td>
                <td>content2</td>
                <td>content3</td>
                <td>content4</td>
            </tr>
            ...
        </tbody>
    </table>
</div>

Açıklık için bazı süslemeler çıkarılmış olan CSS:

.table-container {
    height: 10em;
}
table {
    display: flex;
    flex-flow: column;
    height: 100%;
    width: 100%;
}
table thead {
    /* head takes the height it requires, 
    and it's not scaled when table is resized */
    flex: 0 0 auto;
    width: calc(100% - 0.9em);
}
table tbody {
    /* body takes all the remaining available space */
    flex: 1 1 auto;
    display: block;
    overflow-y: scroll;
}
table tbody tr {
    width: 100%;
}
table thead, table tbody tr {
    display: table;
    table-layout: fixed;
}

jsfiddle üzerinde tam kod

Daha az karıştırabilmeniz için LESS ile aynı kod:

.table-scrollable() {
  @scrollbar-width: 0.9em;
  display: flex;
  flex-flow: column;

  thead,
  tbody tr {
    display: table;
    table-layout: fixed;
  }

  thead {
    flex: 0 0 auto;
    width: ~"calc(100% - @{scrollbar-width})";
  }

  tbody {
    display: block;
    flex: 1 1 auto;
    overflow-y: scroll;

    tr {
      width: 100%;
    }
  }
}

2
Çözüm için teşekkürler! Küçük bir hata vardı .... iki kez thead için genişliği ayarladım ve genişlik çizgilerinden 1.05em çıkarmanın
TigerBear

1
karakterin içerik sayısı ne olacak? de row hücrelerinin içine daha fazla karakter veya kelime eklerken karışıyor
Limon

Bence bazı uygun ambalajlama politikalarını belirlemek tdyardımcı olacaktır
13'te tsayen

% 100 genişliğe olan ihtiyacı düşüren böyle bir çözüm var mı?
Alexandre Pereira Nunes

2
@tsayen Pencereyi yeniden boyutlandırdığınızda çizilmesini ve çakışmasını nasıl önlersiniz?
clearshot66

31

Modern tarayıcılarda css kullanabilirsiniz:

th {
  position: sticky;
  top: 0;
  z-index: 2;
}

8
Bu büyü tamamlanmadı ... Bir örnek yayınlamak mı yoksa en azından ayrıntılı mı?
Liam

iyi çalışıyor, ancak sadece th için geçerlidir. Eğer pozisyonu yapışkan üzerine koyarsak işe yaramaz.
Vishal

Sabit disk W3C'ye eklenmelidir!
sonichy

2
Bu cevap, <table>sahip <div>olan overflow-y: auto;ve bazılarını sardığınızda çalışır max-height. Örneğin:<div style="overflow-y: auto; max-height: 400px;"><table>...</table></div>
Minwork

2020 itibariyle, bu seçilen cevap olacaktır (@Minwork'ün güncellenmesi boyunca)
Christophe Vidal

18

Ben kullanıyorum display:blockiçin theadve tbody. Bu nedenle theadsütunların genişliği tbodysütunların genişliğinden farklıdır .

table {
    margin:0 auto; 
    border-collapse:collapse;
}
thead {
    background:#CCCCCC;
    display:block
}
tbody {
    height:10em;overflow-y:scroll;
    display:block
}

Bunu düzeltmek için küçük jQuerykod kullanıyorum, ancak JavaScriptsadece yapılabilir .

var colNumber=3 //number of table columns    

for (var i=0; i<colNumber; i++) {
  var thWidth=$("#myTable").find("th:eq("+i+")").width();
  var tdWidth=$("#myTable").find("td:eq("+i+")").width();      
  if (thWidth<tdWidth)                    
      $("#myTable").find("th:eq("+i+")").width(tdWidth);
  else
      $("#myTable").find("td:eq("+i+")").width(thWidth);           
}  

İşte benim çalışma demom: http://jsfiddle.net/gavroche/N7LEF/

IE 8'de çalışmıyor


Bu, sabit olmayan sütun genişliklerine (ör. .NET DataGrid denetimi) izin veren en iyi / en basit çözümdür. "Üretim" için, colNumberdeğişken, bunun yerine bulunan gerçek hücreler üzerinden yinelenen kod ile değiştirilebilir ve herhangi bir s varsa doğru bir şekilde başa çıkmayacağını unutmayın colspan(gerekirse kodda da geliştirilebilir, ancak tablonun bu kaydırma özelliğini istemesi muhtemeldir).
JonBrave

Bu çalışır (bir şekilde), ancak pencere boyutu tablodan daha küçük olduğunda (kaydırma çubuğu genişliğini yoksayar) başa çıkmaz.
Kodlama gitti

Tablonuzun genişliği ayarlanmış bir genişlikle sınırlıysa, evet, başlık ve hücreler artık
Craig

burada en basit cevap, en basit
Charles Okwuagwu

18

CSS okunur

için Chrome, Firefox, Kenar (ve diğer dökmeyen tarayıcılar)

Basitçe position: sticky; top: 0;senin thelemanlar:

/* Fix table head */
.tableFixHead    { overflow-y: auto; height: 100px; }
.tableFixHead th { position: sticky; top: 0; }

/* Just common table stuff. */
table  { border-collapse: collapse; width: 100%; }
th, td { padding: 8px 16px; }
th     { background:#eee; }
<div class="tableFixHead">
  <table>
    <thead>
      <tr><th>TH 1</th><th>TH 2</th></tr>
    </thead>
    <tbody>
      <tr><td>A1</td><td>A2</td></tr>
      <tr><td>B1</td><td>B2</td></tr>
      <tr><td>C1</td><td>C2</td></tr>
      <tr><td>D1</td><td>D2</td></tr>
      <tr><td>E1</td><td>E2</td></tr>
    </tbody>
  </table>
</div>

Not: TH öğeleri için sınırlara ihtiyacınız varsath {box-shadow: 1px 1px 0 #000; border-top: 0;} yardımcı olacaktır (varsayılan sınırlar kaydırmada doğru şekilde boyanmadığından).

IE11'e uyum sağlamak için sadece biraz JS kullanan yukarıdakilerin bir çeşidi için bu cevaba bakın https://stackoverflow.com/a/47923622/383904


Bu öğeler için kenarlıklarınız varsa, "border-collapse: collapse" kullanıldığında kenarlık üstbilgi yerine gövdeye yapışır. Bu sorunu önlemek için "border-collapse: separal" kullanmalısınız. Bkz. Stackoverflow.com/a/53559396
Mrod

mrod kullanırken separateateşe yağ ekliyorsunuz. jsfiddle.net/RokoCB/o0zL4xyw ve bir çözüm BURAYA bakın : sabit TH'ye sınırlar ekleyin - Bir şey kaçırırsam OFC önerilerine hoş geldiniz.
Roko C. Buljan

11

Birbiri ardına iki tablo oluşturun, ikinci tabloyu sabit yükseklikte bir div içine koyun ve overflow özelliğini auto olarak ayarlayın. Ayrıca ikinci tablodaki tüm td'leri boş bırakın.

<div>
    <table>
        <thead>
            <tr>
                <th>Head 1</th>
                <th>Head 2</th>
                <th>Head 3</th>
                <th>Head 4</th>
                <th>Head 5</th>
            </tr>
        </thead>
    </table>
</div>

<div style="max-height:500px;overflow:auto;">
    <table>
        <thead>
            <tr>
                <th></th>
                <th></th>
                <th></th>
                <th></th>
                <th></th>
            </tr>
        </thead>
        <tbody>
        <tr>
            <td>Content 1</td>
            <td>Content 2</td>
            <td>Content 3</td>
            <td>Content 4</td>
            <td>Content 5</td>
        </tr>
        </tbody>
    </table>    
</div>

8
Bu durumda, ikinci tablo sütunları ilk tablonun genişliğini izleyemez.
kat1330

2
İyi değil! İki tablodaki sütunlar için genişlik eşitlemesini kaybedersiniz.
Zafar

1
Bu çözümü tamamlamak için başlık sütun genişliğini senkronize etmek için @Hashem Qolami komut dosyasını ( yukarıda açıklayın )
eklememiz gerekiyor

6

Sonunda şu talimatları izleyerek saf CSS ile doğru anladım:

http://tjvantoll.com/2012/11/10/creating-cross-browser-scrollable-tbody/

İlk adım, <tbody>display: block'u bir taşma ve yükseklik uygulanabilmesi için ayarlamaktır. Oradan <thead>konum: göreli ve display: bloğuna ayarlanması gereken satırlar , şimdi kaydırılabilir olanın üzerine oturacaklar <tbody>.

tbody, thead { display: block; overflow-y: auto; }

Çünkü <thead>nispeten konumlandırılmış, her tablo hücresi, açık bir genişliği ihtiyaçları

td:nth-child(1), th:nth-child(1) { width: 100px; }
td:nth-child(2), th:nth-child(2) { width: 100px; }
td:nth-child(3), th:nth-child(3) { width: 100px; }

Ama ne yazık ki bu yeterli değil. Bir kaydırma çubuğu bulunduğunda, tarayıcılar bunun için yer ayırır, bu nedenle <tbody>uçlar <thead>. Bunun yarattığı hafif yanlış hizalamaya dikkat edin ...

Gelebileceğim tek geçici çözüm, sonuncusu hariç tüm sütunlarda bir min genişlik ayarlamaktı.

td:nth-child(1), th:nth-child(1) { min-width: 100px; }
td:nth-child(2), th:nth-child(2) { min-width: 100px; }
td:nth-child(3), th:nth-child(3) { width: 100px; }

Aşağıdaki kod örneği örneği:

CSS:

.fixed_headers {
  width: 750px;
  table-layout: fixed;
  border-collapse: collapse;
}
.fixed_headers th {
  text-decoration: underline;
}
.fixed_headers th,
.fixed_headers td {
  padding: 5px;
  text-align: left;
}
.fixed_headers td:nth-child(1),
.fixed_headers th:nth-child(1) {
  min-width: 200px;
}
.fixed_headers td:nth-child(2),
.fixed_headers th:nth-child(2) {
  min-width: 200px;
}
.fixed_headers td:nth-child(3),
.fixed_headers th:nth-child(3) {
  width: 350px;
}
.fixed_headers thead {
  background-color: #333333;
  color: #fdfdfd;
}
.fixed_headers thead tr {
  display: block;
  position: relative;
}
.fixed_headers tbody {
  display: block;
  overflow: auto;
  width: 100%;
  height: 300px;
}
.fixed_headers tbody tr:nth-child(even) {
  background-color: #dddddd;
}
.old_ie_wrapper {
  height: 300px;
  width: 750px;
  overflow-x: hidden;
  overflow-y: auto;
}
.old_ie_wrapper tbody {
  height: auto;
}

Html:

<!-- IE < 10 does not like giving a tbody a height.  The workaround here applies the scrolling to a wrapped <div>. -->
<!--[if lte IE 9]>
<div class="old_ie_wrapper">
<!--<![endif]-->

<table class="fixed_headers">
  <thead>
    <tr>
      <th>Name</th>
      <th>Color</th>
      <th>Description</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Apple</td>
      <td>Red</td>
      <td>These are red.</td>
    </tr>
    <tr>
      <td>Pear</td>
      <td>Green</td>
      <td>These are green.</td>
    </tr>
    <tr>
      <td>Grape</td>
      <td>Purple / Green</td>
      <td>These are purple and green.</td>
    </tr>
    <tr>
      <td>Orange</td>
      <td>Orange</td>
      <td>These are orange.</td>
    </tr>
    <tr>
      <td>Banana</td>
      <td>Yellow</td>
      <td>These are yellow.</td>
    </tr>
    <tr>
      <td>Kiwi</td>
      <td>Green</td>
      <td>These are green.</td>
    </tr>
    <tr>
      <td>Plum</td>
      <td>Purple</td>
      <td>These are Purple</td>
    </tr>
    <tr>
      <td>Watermelon</td>
      <td>Red</td>
      <td>These are red.</td>
    </tr>
    <tr>
      <td>Tomato</td>
      <td>Red</td>
      <td>These are red.</td>
    </tr>
    <tr>
      <td>Cherry</td>
      <td>Red</td>
      <td>These are red.</td>
    </tr>
    <tr>
      <td>Cantelope</td>
      <td>Orange</td>
      <td>These are orange inside.</td>
    </tr>
    <tr>
      <td>Honeydew</td>
      <td>Green</td>
      <td>These are green inside.</td>
    </tr>
    <tr>
      <td>Papaya</td>
      <td>Green</td>
      <td>These are green.</td>
    </tr>
    <tr>
      <td>Raspberry</td>
      <td>Red</td>
      <td>These are red.</td>
    </tr>
    <tr>
      <td>Blueberry</td>
      <td>Blue</td>
      <td>These are blue.</td>
    </tr>
    <tr>
      <td>Mango</td>
      <td>Orange</td>
      <td>These are orange.</td>
    </tr>
    <tr>
      <td>Passion Fruit</td>
      <td>Green</td>
      <td>These are green.</td>
    </tr>
  </tbody>
</table>

<!--[if lte IE 9]>
</div>
<!--<![endif]-->

EDIT:% 100 tablo genişliği için alternatif çözüm (aslında sabit genişlik içindir ve soruya cevap vermedi):

HTML:

<table>
  <thead>
    <tr>
      <th>Name</th>
      <th>Color</th>
      <th>Description</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Apple</td>
      <td>Red</td>
      <td>These are red.</td>
    </tr>
    <tr>
      <td>Pear</td>
      <td>Green</td>
      <td>These are green.</td>
    </tr>
    <tr>
      <td>Grape</td>
      <td>Purple / Green</td>
      <td>These are purple and green.</td>
    </tr>
    <tr>
      <td>Orange</td>
      <td>Orange</td>
      <td>These are orange.</td>
    </tr>
    <tr>
      <td>Banana</td>
      <td>Yellow</td>
      <td>These are yellow.</td>
    </tr>
    <tr>
      <td>Kiwi</td>
      <td>Green</td>
      <td>These are green.</td>
    </tr>
  </tbody>
</table>

CSS:

table {
  width: 100%;
  text-align: left;
  min-width: 610px;
}
tr {
  height: 30px;
  padding-top: 10px
}
tbody { 
  height: 150px; 
  overflow-y: auto;
  overflow-x: hidden;
}
th,td,tr,thead,tbody { display: block; }
td,th { float: left; }
td:nth-child(1),
th:nth-child(1) {
  width: 20%;
}
td:nth-child(2),
th:nth-child(2) {
  width: 20%;
  float: left;
}
td:nth-child(3),
th:nth-child(3) {
  width: 59%;
  float: left;
}
/* some colors */
thead {
  background-color: #333333;
  color: #fdfdfd;
}
table tbody tr:nth-child(even) {
  background-color: #dddddd;
}

Demo: http://codepen.io/anon/pen/bNJeLO


1
Soru,% 100 genişlik tablosu istedi, bu da referans verdiğiniz örneğin yapmadığı tek şey .
Kodlama

@TrueBlueAussie İyi yakalama: D% 100 genişlik için alternatif çözüm eklendi.
Mikael Lepistö

satırı içeriği boylamını dikkate almazsınız
Limon

2

Sütunları 'blok' tbody ile doğru görüntülemeye zorlamak için Css geçici çözümü

Bu çözüm hala thjQuery tarafından genişliklerin hesaplanmasını ve ayarlanmasını gerektirir

table.scroll tbody,
table.scroll thead { display: block; }

table.scroll tbody {
    overflow-y: auto;
    overflow-x: hidden;
    max-height: 300px;
}

table.scroll tr {
    display: flex;
}

table.scroll tr > td {
    flex-grow: 1;
    flex-basis: 0;
}

Ve Jquery / Javascript

var $table = $('#the_table_element'),
    $bodyCells = $table.find('tbody tr:first').children(),
    colWidth;

$table.addClass('scroll');

// Adjust the width of thead cells when window resizes
$(window).resize(function () {

    // Get the tbody columns width array
    colWidth = $bodyCells.map(function () {
        return $(this).width();
    }).get();

    // Set the width of thead columns
    $table.find('thead tr').children().each(function (i, v) {
        $(v).width(colWidth[i]);
    });

}).resize(); // Trigger resize handler

2019'da @Craig, IE'yi hiç umursamamak tamamen iyi.
Automagisch

2

aşağıda deneyin yaklaşım, çok basit uygulamak kolay

Aşağıda jsfiddle bağlantısı

http://jsfiddle.net/v2t2k8ke/2/

HTML:

<table border='1' id='tbl_cnt'>
<thead><tr></tr></thead><tbody></tbody>

CSS:

 #tbl_cnt{
 border-collapse: collapse; width: 100%;word-break:break-all;
 }
 #tbl_cnt thead, #tbl_cnt tbody{
 display: block;
 }
 #tbl_cnt thead tr{
 background-color: #8C8787; text-align: center;width:100%;display:block;
 }
 #tbl_cnt tbody {
 height: 100px;overflow-y: auto;overflow-x: hidden;
 }

jQuery:

 var data = [
    {
    "status":"moving","vehno":"tr544","loc":"bng","dri":"ttt"
    }, {
    "status":"stop","vehno":"tr54","loc":"che", "dri":"ttt"
    },{    "status":"idle","vehno":"yy5499999999999994","loc":"bng","dri":"ttt"
    },{
    "status":"moving","vehno":"tr544","loc":"bng", "dri":"ttt"
    }, {
    "status":"stop","vehno":"tr54","loc":"che","dri":"ttt"
    },{
    "status":"idle","vehno":"yy544","loc":"bng","dri":"ttt"
    }
    ];
   var sth = '';
   $.each(data[0], function (key, value) {
     sth += '<td>' + key + '</td>';
   });
   var stb = '';        
   $.each(data, function (key, value) {
       stb += '<tr>';
       $.each(value, function (key, value) {
       stb += '<td>' + value + '</td>';
       });
       stb += '</tr>';
    });
      $('#tbl_cnt thead tr').append(sth);
      $('#tbl_cnt tbody').append(stb);
      setTimeout(function () {
      var col_cnt=0 
      $.each(data[0], function (key, value) {col_cnt++;});    
      $('#tbl_cnt thead tr').css('width', ($("#tbl_cnt tbody") [0].scrollWidth)+ 'px');
      $('#tbl_cnt thead tr td,#tbl_cnt tbody tr td').css('width',  ($('#tbl_cnt thead tr ').width()/Number(col_cnt)) + 'px');}, 100)

2
Bu çözüm, pencerenin tabla genişliğinden daha dar olmasıyla başa çıkmaz. Bu olduğunda yatay kaydırmayı etkinleştirmelidir. Ayrıca başlıklar veri hücreleriyle (Chrome) tam olarak hizalanmıyor.
kodlama gitti

Bugünlerde çalışmıyor
MrHIDEn

2

İçin sabit genişliğe ekleme , td inci yaptıktan sonra tbody & thead ekran bloğunu mükemmel çalışıyor ve aynı zamanda kullanabileceğimiz slimscroll kaydırma çubuğu güzel yapmak eklentisi.

resim açıklamasını buraya girin

<!DOCTYPE html>
<html>

<head>
    <title> Scrollable table </title>
    <style>
        body {
            font-family: sans-serif;
            font-size: 0.9em;
        }
        table {
            border-collapse: collapse;
            border-bottom: 1px solid #ddd;
        }
        thead {
            background-color: #333;
            color: #fff;
        }
        thead,tbody {
            display: block;
        }
        th,td {
            padding: 8px 10px;
            border: 1px solid #ddd;
            width: 117px;
            box-sizing: border-box;
        }
        tbody {
            height: 160px;
            overflow-y: scroll
        }
    </style>
</head>

<body>

    <table class="example-table">
        <thead>
            <tr>
                <th> Header 1 </th>
                <th> Header 2 </th>
                <th> Header 3 </th>
                <th> Header 4 </th>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td> Row 1- Col 1 </td>
                <td> Row 1- Col 2 </td>
                <td> Row 1- Col 3 </td>
                <td> Row 1- Col 4 </td>
            </tr>
            <tr>
                <td> Row 2- Col 1 </td>
                <td> Row 2- Col 2 </td>
                <td> Row 2- Col 3 </td>
                <td> Row 2- Col 4 </td>
            </tr>
            <tr>
                <td> Row 3- Col 1 </td>
                <td> Row 3- Col 2 </td>
                <td> Row 3- Col 3 </td>
                <td> Row 3- Col 4 </td>
            </tr>
            <tr>
                <td> Row 4- Col 1 </td>
                <td> Row 4- Col 2 </td>
                <td> Row 4- Col 3 </td>
                <td> Row 4- Col 4 </td>
            </tr>
            <tr>
                <td> Row 5- Col 1 </td>
                <td> Row 5- Col 2 </td>
                <td> Row 5- Col 3 </td>
                <td> Row 5- Col 4 </td>
            </tr>
            <tr>
                <td> Row 6- Col 1 </td>
                <td> Row 6- Col 2 </td>
                <td> Row 6- Col 3 </td>
                <td> Row 6- Col 4 </td>
            </tr>
            <tr>
                <td> Row 7- Col 1 </td>
                <td> Row 7- Col 2 </td>
                <td> Row 7- Col 3 </td>
                <td> Row 7- Col 4 </td>
            </tr>
            <tr>
                <td> Row 8- Col 1 </td>
                <td> Row 8- Col 2 </td>
                <td> Row 8- Col 3 </td>
                <td> Row 8- Col 4 </td>
            </tr>
            <tr>
                <td> Row 9- Col 1 </td>
                <td> Row 9- Col 2 </td>
                <td> Row 9- Col 3 </td>
                <td> Row 9- Col 4 </td>
            </tr>
            <tr>
                <td> Row 10- Col 1 </td>
                <td> Row 10- Col 2 </td>
                <td> Row 10- Col 3 </td>
                <td> Row 10- Col 4 </td>
            </tr>
            <tr>
                <td> Row 11- Col 1 </td>
                <td> Row 11- Col 2 </td>
                <td> Row 11- Col 3 </td>
                <td> Row 11- Col 4 </td>
            </tr>
            <tr>
                <td> Row 12- Col 1 </td>
                <td> Row 12- Col 2 </td>
                <td> Row 12- Col 3 </td>
                <td> Row 12- Col 4 </td>
            </tr>
            <tr>
                <td> Row 13- Col 1 </td>
                <td> Row 13- Col 2 </td>
                <td> Row 13- Col 3 </td>
                <td> Row 13- Col 4 </td>
            </tr>
            <tr>
                <td> Row 14- Col 1 </td>
                <td> Row 14- Col 2 </td>
                <td> Row 14- Col 3 </td>
                <td> Row 14- Col 4 </td>
            </tr>
            <tr>
                <td> Row 15- Col 1 </td>
                <td> Row 15- Col 2 </td>
                <td> Row 15- Col 3 </td>
                <td> Row 15- Col 4 </td>
            </tr>
            <tr>
                <td> Row 16- Col 1 </td>
                <td> Row 16- Col 2 </td>
                <td> Row 16- Col 3 </td>
                <td> Row 16- Col 4 </td>
            </tr>
        </tbody>
    </table>


    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jQuery-slimScroll/1.3.8/jquery.slimscroll.min.js"></script>
    <script>
        $('.example-table tbody').slimscroll({
            height: '160px',
            alwaysVisible: true,
            color: '#333'
        })
    </script>
</body>

</html>


1

Bu, kaydırılabilir bir tbody ile bir tabloda yapışkan bir thead oluşturmak için çalışan kod:

table ,tr td{
    border:1px solid red
}
tbody {
    display:block;
    height:50px;
    overflow:auto;
}
thead, tbody tr {
    display:table;
    width:100%;
    table-layout:fixed;/* even columns width , fix width of table too*/
}
thead {
    width: calc( 100% - 1em )/* scrollbar is average 1em/16px width, remove it from thead width */
}
table {
    width:400px;
}

1

"Taşma: kaydırma" özelliğini kullanmak için, baş ve gövdede "display: block" ayarlamanız gerekir. Ve bu, aralarındaki sütun genişliğini bozar. Ama sonra thead satırını Javascript ile klonlayabilir ve tam col genişliklerini korumak için tbody'a gizli bir satır olarak yapıştırabilirsiniz.

$('.myTable thead > tr').clone().appendTo('.myTable tbody').addClass('hidden-to-set-col-widths');

http://jsfiddle.net/Julesezaar/mup0c5hk/

<table class="myTable">
    <thead>
        <tr>
            <td>Problem</td>
            <td>Solution</td>
            <td>blah</td>
            <td>derp</td>
        </tr>
    </thead>
    <tbody></tbody>
</table>
<p>
  Some text to here
</p>

Css:

table {
  background-color: #aaa;
  width: 100%;
}

thead,
tbody {
  display: block; // Necessary to use overflow: scroll
}

tbody {
  background-color: #ddd;
  height: 150px;
  overflow-y: scroll;
}

tbody tr.hidden-to-set-col-widths,
tbody tr.hidden-to-set-col-widths td {
  visibility: hidden;
  height: 0;
  line-height: 0;
  padding-top: 0;
  padding-bottom: 0;
}

td {
  padding: 3px 10px;
}

0

Bu jsfiddle'ı deneyin . Bu jQuery kullanıyor ve Hashem Qolami'nin cevabından yapılmıştır. İlk önce, normal bir tablo yapın ve sonra kaydırılabilir yapın.

const makeScrollableTable = function (tableSelector, tbodyHeight) {
  let $table = $(tableSelector);
  let $bodyCells = $table.find('tbody tr:first').children();
  let $headCells = $table.find('thead tr:first').children();
  let headColWidth = 0;
  let bodyColWidth = 0;

  headColWidth = $headCells.map(function () {
    return $(this).outerWidth();
  }).get();
  bodyColWidth = $bodyCells.map(function () {
    return $(this).outerWidth();
  }).get();

  $table.find('thead tr').children().each(function (i, v) {
    $(v).css("width", headColWidth[i]+"px");
    $(v).css("min-width", headColWidth[i]+"px");
    $(v).css("max-width", headColWidth[i]+"px");
  });
  $table.find('tbody tr').children().each(function (i, v) {
    $(v).css("width", bodyColWidth[i]+"px");
    $(v).css("min-width", bodyColWidth[i]+"px");
    $(v).css("max-width", bodyColWidth[i]+"px");
  });

  $table.find('thead').css("display", "block");
  $table.find('tbody').css("display", "block");

  $table.find('tbody').css("height", tbodyHeight+"px");
  $table.find('tbody').css("overflow-y", "auto");
  $table.find('tbody').css("overflow-x", "hidden");

};
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.