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 display
properti tbody
, kita harus mengubah properti itu untuk thead
elemen 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 thead
dan tbody
elemen sebagai grup baris ( table-header-group
dan table-row-group
) secara default.
Setelah kami mengubahnya, tr
elemen di dalamnya tidak mengisi seluruh ruang wadah mereka.
Untuk memperbaikinya, kita harus menghitung lebar tbody
kolom dan menerapkan nilai yang sesuai ke thead
kolom 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) :
DEMO KERJA .
Tabel Lebar Penuh, Kolom Lebar Relatif
Seperti yang dibutuhkan Poster Asli, kami dapat memperluas table
hingga 100% dari width
wadahnya, dan kemudian menggunakan relatif ( Persentase ) width
untuk 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 thead
kolom 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:
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 table
hanya memiliki satu sel yang memiliki div
, dan tabel kedua ditempatkan di dalam div
elemen 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 thead
elemen untuk tinggal fixed
di 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, table
harus memiliki tetap width
(termasuk jumlah lebar kolom dan lebar bilah gulir vertikal) .
Setiap kolom harus memiliki spesifik lebar dan kolom terakhir dari thead
elemen 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:
DEMO KERJA .
Meja dengan Lebar 100%
Dalam pendekatan ini, table
memiliki lebar 100%
dan untuk masing-masing th
dan td
, nilai width
properti harus kurang dari 100% / number of cols
.
Juga, kita perlu mengurangi lebar dari thead
sebagai 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