Bagaimana saya bisa mengatur <table>
lebar 100% dan hanya menempatkan di dalam <tbody>
gulir vertikal untuk ketinggian tertentu?
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
,, position
dan banyak lagi hal-hal di tabel CSS tidak berfungsi dengan baik dengan lebar 100% hanya dengan lebar tetap di px.
html
css
vertical-scrolling
Marko S
sumber
sumber
Jawaban:
Untuk membuat
<tbody>
elemen dapat digulir, kita perlu mengubah cara itu ditampilkan pada halaman yaitu menggunakandisplay: block;
untuk menampilkan itu sebagai elemen tingkat blok.Karena kita mengubah
display
propertitbody
, kita harus mengubah properti itu untukthead
elemen juga untuk mencegah dari melanggar tata letak tabel.Jadi kita punya:
Browser web menampilkan
thead
dantbody
elemen sebagai grup baris (table-header-group
dantable-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 kethead
kolom melalui JavaScript.Kolom Lebar Otomatis
Berikut ini adalah versi jQuery dari logika di atas:
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% dariwidth
wadahnya, dan kemudian menggunakan relatif ( Persentase )width
untuk setiap kolom tabel.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:
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 memilikidiv
, dan tabel kedua ditempatkan di dalamdiv
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 satuthead
elemen untuk tinggalfixed
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 tetapwidth
(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:
Berikut hasilnya:
DEMO KERJA .
Meja dengan Lebar 100%
Dalam pendekatan ini,
table
memiliki lebar100%
dan untuk masing-masingth
dantd
, nilaiwidth
properti harus kurang dari100% / 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: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
sumber
display: block
Anda kehilangan properti tabel sebagai lebar kolom dibagi antara thead dan tbody. Saya tahu Anda telah memperbaiki ini dengan menetapkanwidth: 19.2%
tetapi jika kami tidak tahu lebar setiap kolom sebelumnya, ini tidak akan berhasil.height: 100%
(saat Anda ingin tabel melebar ke bagian bawah halaman).ng-repeat
tabel AngularJS . Tidak yakin mengapa ada semua perpustakaan dengan tajuk tabel tetap dan apa yang tidak ketika ada solusi ini.box-sizing
properti sehingga memiliki batas dua ketebalan yang berbeda tidak menghilangkan penjajaran kolom.Dalam solusi berikut, tabel menempati 100% dari wadah induk, tidak diperlukan ukuran absolut. Ini murni CSS, tata letak fleksibel digunakan.
Berikut tampilannya:
Kerugian yang mungkin:
HTML (disingkat):
CSS, dengan beberapa dekorasi dihilangkan untuk kejelasan:
kode lengkap di jsfiddle
Kode yang sama dalam KURANG sehingga Anda dapat mencampurnya dalam:
sumber
td
akan membantuDi browser modern, Anda cukup menggunakan css:
sumber
<table>
dengan<div>
yang memilikioverflow-y: auto;
dan beberapamax-height
. Sebagai contoh:<div style="overflow-y: auto; max-height: 400px;"><table>...</table></div>
Saya menggunakan
display:block
untukthead
dantbody
. Karena itu lebarthead
kolom berbeda dari lebartbody
kolom.Untuk memperbaikinya saya menggunakan
jQuery
kode kecil tetapi hanya bisa dilakukanJavaScript
.Ini demo kerja saya: http://jsfiddle.net/gavroche/N7LEF/
Tidak berfungsi di IE 8
Tampilkan cuplikan kode
sumber
colNumber
variabel dapat diganti dengan kode yang beralih melalui sel-sel aktual yang ditemukan sebagai gantinya, dan perhatikan bahwa itu tidak mengatasi dengan benar jika adacolspan
kode (juga dapat ditingkatkan dalam kode, jika perlu, tetapi tidak mungkin pada jenis tabel kemungkinan menginginkan fitur gulir ini).Hanya CSS
untuk Chrome, Firefox, Ujung (dan lainnya evergreen browser)
Cukup elemen
position: sticky; top: 0;
Andath
: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
sumber
separate
Anda 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.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.
sumber
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 eksplisitNamun 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.
Seluruh codepen contoh di bawah ini:
CSS:
Html:
EDIT: Solusi alternatif untuk lebar tabel 100% (di atas sebenarnya untuk lebar tetap dan tidak menjawab pertanyaan):
HTML:
CSS:
Demo: http://codepen.io/anon/pen/bNJeLO
sumber
Solusi Css untuk memaksa kolom ditampilkan dengan benar dengan badan 'blok'
Solusi ini masih membutuhkan
th
lebar untuk dihitung dan ditetapkan oleh jQueryDan Jquery / Javascript
sumber
coba pendekatan di bawah ini, sangat sederhana mudah diimplementasikan
Di bawah ini adalah tautan jsfiddle
http://jsfiddle.net/v2t2k8ke/2/
HTML:
CSS:
Jquery:
sumber
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.
sumber
Ini adalah kode yang berfungsi bagi saya untuk membuat sticky thead di atas meja dengan scrollable tbody:
sumber
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.
http://jsfiddle.net/Julesezaar/mup0c5hk/
Css:
sumber
Coba jsfiddle ini . Ini menggunakan jQuery dan dibuat dari jawaban Hashem Qolami. Pada awalnya, buatlah tabel biasa lalu buatlah itu dapat digulir.
sumber