Tabel HTML dengan lebar 100%, dengan gulir vertikal di dalam tubuh

423

Bagaimana saya bisa mengatur <table>lebar 100% dan hanya menempatkan di dalam <tbody>gulir vertikal untuk ketinggian tertentu?

gulir vertikal di dalam tubuh

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>

Saya ingin menghindari menambahkan beberapa div tambahan, semua yang saya inginkan adalah tabel sederhana seperti ini dan ketika saya mencoba mengubah tampilan table-layout,, positiondan banyak lagi hal-hal di tabel CSS tidak berfungsi dengan baik dengan lebar 100% hanya dengan lebar tetap di px.

Marko S
sumber
Saya tidak begitu yakin apa yang ingin Anda capai. lihat ini: jsfiddle.net/CrSpu dan katakan bagaimana Anda ingin berperilaku
x4rf41
2
saya tahu tetapi lihat .. th dan td tidak ditampilkan lebar penuh .. postimg.org/image/mgd630y61
Marko S
Terkait: stackoverflow.com/questions/1019938/…
Christophe Roussy

Jawaban:

675

Untuk membuat <tbody>elemen dapat digulir, kita perlu mengubah cara itu ditampilkan pada halaman yaitu menggunakan display: block;untuk menampilkan itu sebagai elemen tingkat blok.

Karena kita mengubah displayproperti tbody, kita harus mengubah properti itu untuk theadelemen juga untuk mencegah dari melanggar tata letak tabel.

Jadi kita punya:

thead, tbody { display: block; }

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

Browser web menampilkan theaddan tbodyelemen sebagai grup baris ( table-header-groupdan table-row-group) secara default.

Setelah kami mengubahnya, trelemen di dalamnya tidak mengisi seluruh ruang wadah mereka.

Untuk memperbaikinya, kita harus menghitung lebar tbodykolom dan menerapkan nilai yang sesuai ke theadkolom melalui JavaScript.

Kolom Lebar Otomatis

Berikut ini adalah versi jQuery dari logika di atas:

// 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]);
});    

Dan inilah outputnya (pada Windows 7 Chrome 32) :

gulir vertikal di dalam tubuh

DEMO KERJA .

Tabel Lebar Penuh, Kolom Lebar Relatif

Seperti yang dibutuhkan Poster Asli, kami dapat memperluas tablehingga 100% dari widthwadahnya, dan kemudian menggunakan relatif ( Persentase ) widthuntuk setiap kolom tabel.

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

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

Karena tabel memiliki (semacam) tata letak fluida , kita harus menyesuaikan lebar theadkolom ketika ukuran wadah.

Karena itu kita harus mengatur lebar kolom setelah jendela diubah ukurannya:

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

Outputnya adalah:

Fluid Table dengan scroll vertikal di dalam tubuh

DEMO KERJA .


Dukungan dan Alternatif Peramban

Saya telah menguji dua metode di atas pada Windows 7 melalui versi baru Browser Web utama (termasuk IE10 +) dan berhasil.

Namun, itu tidak berfungsi dengan baik pada IE9 dan di bawah.

Itu karena dalam tata letak tabel , semua elemen harus mengikuti sifat struktural yang sama.

Dengan menggunakan display: block;untuk <thead>dan <tbody>elemen, kita sudah rusak struktur tabel.

Mendesain ulang tata letak melalui JavaScript

Salah satu pendekatan adalah mendesain ulang tata letak tabel (keseluruhan). Menggunakan JavaScript untuk membuat tata letak baru dengan cepat dan menangani dan / atau menyesuaikan lebar / tinggi sel secara dinamis.

Sebagai contoh, lihat contoh berikut:

Meja bersarang

Pendekatan ini menggunakan dua tabel bersarang dengan div yang berisi. Yang pertama tablehanya memiliki satu sel yang memiliki div, dan tabel kedua ditempatkan di dalam divelemen itu.

Periksa tabel gulir Vertikal di Play CSS .

Ini berfungsi pada sebagian besar browser web. Kami juga dapat melakukan logika di atas secara dinamis melalui JavaScript.

Tabel dengan tajuk tetap pada gulir

Karena tujuan menambahkan scroll bar vertikal ke <tbody>yang menampilkan tabel sundulan di bagian atas setiap baris, kita bisa memposisikan satu theadelemen untuk tinggal fixeddi bagian atas layar sebagai gantinya.

Berikut adalah Demo Kerja dari pendekatan ini yang dilakukan oleh Julien .
Ini memiliki dukungan browser web yang menjanjikan.

Dan di sini sebuah CSS murni implementasi oleh Willem Van Bockstal .


Solusi CSS Murni

Inilah jawaban lama. Tentu saja saya telah menambahkan metode baru dan memperhalus deklarasi CSS.

Tabel dengan Lebar Tetap

Dalam hal ini, tableharus memiliki tetap width (termasuk jumlah lebar kolom dan lebar bilah gulir vertikal) .

Setiap kolom harus memiliki spesifik lebar dan kolom terakhir dari theadelemen membutuhkan lebih lebar yang sama dengan yang lain width + yang lebar dari scroll-bar vertikal.

Karenanya, CSS adalah:

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 */
}

Berikut hasilnya:

Tabel dengan Lebar Tetap

DEMO KERJA .

Meja dengan Lebar 100%

Dalam pendekatan ini, tablememiliki lebar 100%dan untuk masing-masing thdan td, nilai widthproperti harus kurang dari 100% / number of cols.

Juga, kita perlu mengurangi lebar dari theadsebagai nilai lebar dari scroll-bar vertikal.

Untuk melakukan itu, kita perlu menggunakan calc()fungsi CSS3 , sebagai berikut:

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

Ini Demo Online .

Catatan: Pendekatan ini akan gagal jika konten masing-masing kolom melanggar garis, yaitu konten setiap sel harus cukup pendek .


Berikut ini, ada dua contoh sederhana dari solusi CSS murni yang saya buat pada saat saya menjawab pertanyaan ini.

Ini adalah Demo jsFiddle v2 .

Versi lama: jsFiddle Demo v1

Hashem Qolami
sumber
17
Dengan display: blockAnda kehilangan properti tabel sebagai lebar kolom dibagi antara thead dan tbody. Saya tahu Anda telah memperbaiki ini dengan menetapkan width: 19.2%tetapi jika kami tidak tahu lebar setiap kolom sebelumnya, ini tidak akan berhasil.
samb
10
Kode ini sepertinya menganggap sel-sel tubuh akan selalu lebih luas daripada sel-sel header.
Adam Donahue
2
Tidak berfungsi saat height: 100%(saat Anda ingin tabel melebar ke bagian bawah halaman).
AlikElzin-kilaka
2
Ini juga bekerja secara fantastis dengan ng-repeattabel AngularJS . Tidak yakin mengapa ada semua perpustakaan dengan tajuk tabel tetap dan apa yang tidak ketika ada solusi ini.
chakeda
2
Anda dapat meningkatkan ini sedikit lebih dengan box-sizingproperti sehingga memiliki batas dua ketebalan yang berbeda tidak menghilangkan penjajaran kolom.
Ricca
89

Dalam solusi berikut, tabel menempati 100% dari wadah induk, tidak diperlukan ukuran absolut. Ini murni CSS, tata letak fleksibel digunakan.

Berikut tampilannya: masukkan deskripsi gambar di sini

Kerugian yang mungkin:

  • scrollbar vertikal selalu terlihat, terlepas dari apakah itu diperlukan;
  • tata letak tabel diperbaiki - kolom tidak mengubah ukuran sesuai dengan lebar konten (Anda masih dapat mengatur lebar kolom apa pun yang Anda inginkan secara eksplisit);
  • ada satu ukuran absolut - lebar scrollbar, yaitu sekitar 0,9em untuk browser saya bisa memeriksa.

HTML (disingkat):

<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>

CSS, dengan beberapa dekorasi dihilangkan untuk kejelasan:

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

kode lengkap di jsfiddle

Kode yang sama dalam KURANG sehingga Anda dapat mencampurnya dalam:

.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%;
    }
  }
}
tsayen
sumber
2
Terima kasih atas solusinya! Ada sedikit bug .... Anda menetapkan lebar untuk thead dua kali, dan saya menemukan bahwa mengurangi 1.05em dari garis lebar naik sedikit lebih baik: jsfiddle.net/xuvsncr2/170
TigerBear
1
bagaimana dengan jumlah konten karakter? itu kacau ketika menambahkan lebih banyak karakter atau kata-kata di dalam sel baris de
Limon
Saya pikir menetapkan beberapa kebijakan pembungkus yang cocok tdakan membantu
tsayen
Adakah solusi seperti ini tetapi menjatuhkan kebutuhan akan lebar 100%?
Alexandre Pereira Nunes
2
@tsayen Bagaimana Anda menghentikannya dari mengerut dan tumpang tindih ketika Anda mengubah ukuran jendela?
clearshot66
31

Di browser modern, Anda cukup menggunakan css:

th {
  position: sticky;
  top: 0;
  z-index: 2;
}
Gauss
sumber
8
Mantra ini tidak lengkap ... Mau memposting contoh, atau setidaknya menguraikan?
Liam
bekerja dengan baik, tetapi hanya berlaku untuk th. Jika kita mengatur posisi lengket pada thead maka itu tidak berfungsi.
Vishal
Memperbaiki thead harus menambahkan ke W3C!
sonichy
2
Jawaban ini berfungsi saat Anda membungkusnya <table> dengan <div>yang memiliki overflow-y: auto;dan beberapa max-height. Sebagai contoh:<div style="overflow-y: auto; max-height: 400px;"><table>...</table></div>
Minwork
Pada 2020, ini akan menjadi jawaban yang dipilih (bersama pembaruan @Minwork)
Christophe Vidal
18

Saya menggunakan display:blockuntuk theaddan tbody. Karena itu lebar theadkolom berbeda dari lebar tbodykolom.

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

Untuk memperbaikinya saya menggunakan jQuerykode kecil tetapi hanya bisa dilakukan JavaScript.

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

Ini demo kerja saya: http://jsfiddle.net/gavroche/N7LEF/

Tidak berfungsi di IE 8

gavroche
sumber
Ini adalah solusi terbaik / paling sederhana yang saya temukan yang memungkinkan lebar kolom tidak tetap (mis. Kontrol NET DataGrid). Untuk "produksi", colNumbervariabel dapat diganti dengan kode yang beralih melalui sel-sel aktual yang ditemukan sebagai gantinya, dan perhatikan bahwa itu tidak mengatasi dengan benar jika ada colspankode (juga dapat ditingkatkan dalam kode, jika perlu, tetapi tidak mungkin pada jenis tabel kemungkinan menginginkan fitur gulir ini).
JonBrave
Ini berfungsi (dengan cara), tetapi tidak mengatasi ketika ukuran jendela lebih kecil dari tabel (karena mengabaikan lebar bilah gulir).
Hilang Coding
Ya tajuk dan sel tidak lagi cocok jika lebar tabel Anda terbatas pada lebar yang ditentukan
Craig
jawaban terbaik di sini, paling sederhana juga
Charles Okwuagwu
18

Hanya CSS

untuk Chrome, Firefox, Ujung (dan lainnya evergreen browser)

Cukup elemen position: sticky; top: 0;Anda th:

/* 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>

PS: jika Anda membutuhkan batas untuk elemen TH th {box-shadow: 1px 1px 0 #000; border-top: 0;}akan membantu (karena batas default tidak dicat dengan benar pada gulir).

Untuk varian di atas yang hanya menggunakan sedikit JS untuk mengakomodasi IE11 lihat jawaban ini https://stackoverflow.com/a/47923622/383904

Roko C. Buljan
sumber
Jika Anda memiliki batas untuk elemen th, menggunakan "border-collapse: collapse" akan menempel perbatasan ke tubuh alih-alih ke header. Untuk menghindari masalah ini, Anda harus menggunakan "border-collapse: terpisah". Lihat stackoverflow.com/a/53559396
mrod
@mrod saat menggunakan separateAnda menambahkan minyak ke api. jsfiddle.net/RokoCB/o0zL4xyw dan lihat solusinya DI SINI: tambahkan batas untuk memperbaiki TH - Saya dipersilakan untuk saran OFC jika saya melewatkan sesuatu.
Roko C. Buljan
11

Buat dua tabel satu demi satu, letakkan tabel kedua di div ketinggian tetap dan atur properti overflow ke otomatis. Juga simpan semua td di dalam thead di tabel kedua kosong.

<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>
Sushil Kumar
sumber
8
Dalam hal ini, kolom tabel kedua tidak dapat mengikuti lebar tabel pertama.
kat1330
2
Tidak baik! Anda kehilangan sinkronisasi lebar untuk kolom pada dua tabel.
Zafar
1
untuk menyelesaikan solusi ini, kita perlu menambahkan skrip @Hashem Qolami ( jelaskan di atas ) untuk menyinkronkan lebar kolom header
Elhay Avichzer
6

Saya akhirnya benar dengan CSS murni dengan mengikuti instruksi ini:

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

Langkah pertama adalah mengatur <tbody>tampilan: blok sehingga limpahan dan ketinggian dapat diterapkan. Dari sana baris-baris yang <thead>perlu diatur ke posisi: relatif dan tampilan: blok sehingga mereka akan duduk di atas yang sekarang dapat digulir <tbody>.

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

Karena <thead>relatif diposisikan setiap sel tabel membutuhkan lebar eksplisit

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

Namun sayangnya itu tidak cukup. Ketika scrollbar hadir, browser mengalokasikan ruang untuknya, oleh karena itu, <tbody>ujungnya memiliki lebih sedikit ruang daripada <thead>. Perhatikan sedikit ketidaksejajaran ini membuat ...

Satu-satunya solusi yang bisa saya lakukan adalah menetapkan lebar minimum pada semua kolom kecuali yang terakhir.

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

Seluruh codepen contoh di bawah ini:

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: Solusi alternatif untuk lebar tabel 100% (di atas sebenarnya untuk lebar tetap dan tidak menjawab pertanyaan):

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

Mikael Lepistö
sumber
1
Pertanyaannya secara spesifik menginginkan tabel lebar 100%, yang tidak dilakukan contoh yang dirujuk oleh contoh Anda .
Hilang Coding
@ TrueBlueAussie Tangkapan yang bagus: D Menambahkan solusi alternatif untuk lebar 100%.
Mikael Lepistö
Anda tidak menganggap bujur konten baris sel
Limon
2

Solusi Css untuk memaksa kolom ditampilkan dengan benar dengan badan 'blok'

Solusi ini masih membutuhkan thlebar untuk dihitung dan ditetapkan oleh jQuery

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

Dan 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
Emmanuel
sumber
@Craig pada tahun 2019, tidak masalah untuk tidak peduli tentang IE sama sekali.
Automagisch
2

coba pendekatan di bawah ini, sangat sederhana mudah diimplementasikan

Di bawah ini adalah tautan jsfiddle

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)
Nandha
sumber
2
Solusi ini tidak mengatasi jendela yang lebih sempit dari lebar tabel. Seharusnya memungkinkan pengguliran horizontal ketika itu terjadi. Judul juga tidak selaras persis dengan sel data (Chrome).
Hilang Pengkodean
Ini tidak berfungsi saat ini
MrHIDEn
2

Menambahkan lebar tetap ke td, th setelah membuat blok display tbody & thead berfungsi dengan baik dan kita juga dapat menggunakan plugin slimscroll untuk membuat bilah gulir indah.

masukkan deskripsi gambar di sini

<!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>

codegeek
sumber
1

Ini adalah kode yang berfungsi bagi saya untuk membuat sticky thead di atas meja dengan scrollable tbody:

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;
}
Max Alexander Hanna
sumber
1

Untuk menggunakan "overflow: gulir" Anda harus mengatur "display: block" pada thead dan tbody. Dan itu mengacaukan lebar kolom di antara mereka. Tapi kemudian Anda bisa mengkloning baris thead dengan Javascript dan menempelkannya di tbody sebagai baris tersembunyi untuk menjaga lebar col yang tepat.

$('.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;
}
Julesezaar
sumber
0

Coba jsfiddle ini . Ini menggunakan jQuery dan dibuat dari jawaban Hashem Qolami. Pada awalnya, buatlah tabel biasa lalu buatlah itu dapat digulir.

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");

};
lechat
sumber