Apakah ada teknik CSS / JavaScript lintas-browser untuk menampilkan tabel HTML yang panjang sehingga tajuk kolom tetap terpasang di layar dan tidak menggulir dengan badan tabel. Pikirkan efek "panel beku" di Microsoft Excel.
Saya ingin dapat menggulir isi tabel, tetapi untuk selalu dapat melihat tajuk kolom di bagian atas.
javascript
css
html-table
Cheekysoft
sumber
sumber
thead th { position: sticky; top: 0; }
. Safari membutuhkan awalan vendor:-webkit-sticky
Jawaban:
Saya mencari solusi untuk sementara waktu dan menemukan sebagian besar jawaban tidak berfungsi atau tidak cocok untuk situasi saya, jadi saya menulis solusi sederhana dengan jQuery.
Ini adalah garis besar solusinya:
Di bawah ini adalah kode dalam demo yang dapat dijalankan.
Solusi ini berfungsi di Chrome dan IE. Karena didasarkan pada jQuery, ini juga bisa digunakan di browser lain yang didukung jQuery.
sumber
Ini dapat diselesaikan dengan rapi dalam empat baris kode.
Jika Anda hanya peduli dengan browser modern, header tetap dapat dicapai lebih mudah dengan menggunakan transformasi CSS. Kedengarannya aneh, tetapi bekerja dengan sangat baik:
Dukungan untuk transformasi CSS tersedia secara luas kecuali untuk Internet Explorer 8-.
Ini adalah contoh lengkap untuk referensi:
Tampilkan cuplikan kode
sumber
$(this).addClass('border')
mengubah sisa tabel fitur font, ukuran, warna yang saya lewati di kelas perbatasan. Tapi, tidak menambahkan baris ke header tetap. Hargai, masukan apa pun tentang cara memperbaikinyaSaya baru saja selesai menyusun plugin jQuery yang akan mengambil tabel tunggal yang valid menggunakan HTML yang valid (harus memiliki thead dan tbody) dan akan menampilkan tabel yang memiliki header tetap, footer tetap opsional yang bisa berupa header kloning atau konten yang Anda pilih (pagination, dll.). Jika Anda ingin memanfaatkan monitor yang lebih besar, itu juga akan mengubah ukuran tabel saat browser diubah ukurannya. Fitur lain yang ditambahkan adalah dapat menggulir ke samping jika kolom tabel tidak dapat semuanya terlihat.
http://fixedheadertable.com/
pada github: http://markmalek.github.com/Fixed-Header-Table/
Ini sangat mudah untuk diatur dan Anda dapat membuat gaya kustom Anda sendiri untuk itu. Ini juga menggunakan sudut bulat di semua browser. Perlu diingat saya baru saja merilisnya, jadi masih secara teknis beta dan ada sedikit masalah kecil yang saya setrika.
Ini bekerja di Internet Explorer 7, Internet Explorer 8, Safari, Firefox dan Chrome.
sumber
Saya juga membuat plugin yang membahas masalah ini. Proyek saya - jQuery.floatThead telah ada selama lebih dari 4 tahun sekarang dan sangat matang.
Tidak memerlukan gaya eksternal dan tidak mengharapkan meja Anda ditata dengan cara tertentu. Ini mendukung Internet Explorer9 + dan Firefox / Chrome.
Saat ini (2018-05) ia memiliki:
Banyak (tidak semua) jawaban di sini adalah peretasan cepat yang mungkin telah memecahkan masalah yang dialami satu orang, tetapi tidak akan berhasil untuk setiap tabel.
Beberapa plugin lain sudah tua dan mungkin bekerja sangat baik dengan Internet Explorer, tetapi akan rusak pada Firefox dan Chrome.
sumber
TL; DR
Jika Anda menargetkan peramban modern dan tidak memiliki kebutuhan penataan yang mewah: http://jsfiddle.net/dPixie/byB9d/3/ ... Meskipun versi empat besar cukup manis juga versi ini menangani lebar cairan jauh lebih baik.
Berita baik semuanya!
Dengan kemajuan HTML5 dan CSS3 ini sekarang mungkin, setidaknya untuk browser modern. Implementasi yang sedikit meretas yang saya buat dapat ditemukan di sini: http://jsfiddle.net/dPixie/byB9d/3/ . Saya telah mengujinya di FX 25, Chrome 31 dan IE 10 ...
HTML yang relevan (masukkan doctype HTML5 di bagian atas dokumen Anda):
Tapi bagaimana caranya?!
Sederhananya Anda memiliki header tabel, yang Anda sembunyikan secara visual dengan membuatnya tinggi 0px, yang juga mengandung div yang digunakan sebagai header tetap. Wadah tabel menyisakan cukup ruang di bagian atas untuk memungkinkan tajuk yang benar-benar diposisikan, dan tabel dengan bilah gulir muncul seperti yang Anda harapkan.
Kode di atas menggunakan kelas yang diposisikan untuk benar-benar memposisikan tabel (Saya menggunakannya dalam dialog gaya popup) tetapi Anda dapat menggunakannya dalam aliran dokumen juga dengan menghapus
positioned
kelas dari wadah.Tapi ...
Itu tidak sempurna. Firefox menolak untuk membuat baris tajuk 0px (setidaknya saya tidak menemukan cara apa pun) tetapi dengan keras kepala mempertahankannya pada minimum 4px ... Ini bukan masalah besar, tetapi tergantung pada gaya Anda, itu akan mengacaukan perbatasan Anda dll.
Tabel ini juga menggunakan pendekatan kolom palsu di mana warna latar belakang wadah itu sendiri digunakan sebagai latar belakang untuk header header, yang transparan.
Ringkasan
Semua dalam semua mungkin ada masalah styling yang tergantung pada kebutuhan Anda, terutama perbatasan atau latar belakang yang rumit. Mungkin juga ada masalah dengan kemampuan komputasi, saya belum memeriksanya di berbagai peramban (tolong beri komentar dengan pengalaman Anda jika Anda mencobanya), tetapi saya tidak menemukan yang seperti itu jadi saya pikir pantas untuk diposkan pokoknya ...
sumber
<section>
elemen, perlu dibatasi ketinggian hanya untuk memaksanya meluap dan menunjukkan gulir. Tata letak apa pun yang akan membuat wadah meluap akan berfungsi. Jika Anda menemukan suatu kasus di mana itu tidak silakan memposting tautan ke biola.padding-top
juga berarti bahwa jika teks judul tabel berada di lebih dari satu baris itu akan muncul di atas sel tabel. Kasihan, karena ini berfungsi seperti pesona sebagian besar waktu. Benar-benar baik trick dengandiv
dith
untuk berkeliling kolom ukuran isu yang paling solusi lain memiliki.Semua upaya untuk menyelesaikan ini dari luar spesifikasi CSS adalah bayangan pucat dari apa yang sebenarnya kita inginkan: Pengiriman pada janji yang tersirat dari THEAD.
Masalah beku-header-untuk-tabel ini telah menjadi luka terbuka dalam HTML / CSS untuk waktu yang lama.
Di dunia yang sempurna, akan ada solusi murni-CSS untuk masalah ini. Sayangnya, sepertinya tidak ada yang bagus.
Standar-diskusi yang relevan tentang topik ini meliputi:
UPDATE : Firefox dikirim
position:sticky
dalam versi 32. Semua orang menang!sumber
thead th { position: sticky; top: 0; }
. Bisakah kita memperbarui jawaban ini untuk menyatakan ini dengan jelas?Berikut ini adalah plugin jQuery untuk header tabel tetap. Ini memungkinkan seluruh halaman untuk menggulir, membekukan header ketika mencapai bagian atas. Ini berfungsi baik dengan tabel Bootstrap Twitter .
Repositori GitHub: https://github.com/oma/table-fixed-header
Itu tidak menggulir hanya konten tabel. Lihatlah alat-alat lain untuk itu, sebagai salah satu dari jawaban lain ini. Anda memutuskan yang paling cocok dengan kasus Anda.
sumber
Sebagian besar solusi yang diposting di sini memerlukan jQuery. Jika Anda mencari solusi kerangka kerja independen, coba Grid: http://www.matts411.com/post/grid/
Di-host di Github di sini: https://github.com/mmurph211/Grid
Tidak hanya mendukung header tetap, juga mendukung kolom dan footer kiri tetap, antara lain.
sumber
Properti CSS
position: sticky
memiliki dukungan besar di sebagian besar browser modern (Saya memiliki masalah dengan Edge, lihat di bawah).Ini memungkinkan kami memecahkan masalah header tetap dengan mudah:
Safari membutuhkan vendor awalan:
-webkit-sticky
.Untuk Firefox, saya harus menambahkan
min-height: 0
satu elemen induk. Saya lupa persis mengapa ini diperlukan.Paling disayangkan, implementasi Microsoft Edge tampaknya hanya semi-kerja. Setidaknya, saya memiliki beberapa sel tabel yang berkedip dan tidak sejajar dalam pengujian saya. Tabel itu masih bisa digunakan, tetapi memiliki masalah estetika yang signifikan.
sumber
position: sticky;
dengan tabel di dalam div yang memilikioverflow: scroll;
,overflow-x: scroll;
atauoverflow-y: scroll;
. tampaknya menjadi solusi terbaik dan paling sederhana untuk header dan kolom tabel tetap di browser modern. Jawaban ini perlu dipilih ke atas.Tabel gulir CSS murni yang lebih halus
Semua solusi CSS murni yang saya lihat sejauh ini - pintar meskipun mungkin - tidak memiliki tingkat poles tertentu, atau tidak berfungsi dengan benar dalam beberapa situasi. Jadi, saya memutuskan untuk membuat ...
Fitur:
Berikut adalah beberapa biola yang menunjukkan opsi lebar dan cairan:
Lebar dan Tinggi Cairan (menyesuaikan dengan ukuran layar): jsFiddle (Perhatikan bahwa bilah gulir hanya muncul bila diperlukan dalam konfigurasi ini, jadi Anda mungkin harus mengecilkan bingkai untuk melihatnya)
Lebar Otomatis, Tinggi Tetap (lebih mudah diintegrasikan dengan konten lain): jsFiddle
Lebar Otomatis, Konfigurasi Tinggi Tetap mungkin memiliki lebih banyak kasus penggunaan, jadi saya akan memposting kode di bawah ini.
Metode yang saya gunakan untuk membekukan baris tajuk mirip dengan d-Pixie, jadi lihat postingnya untuk penjelasan. Ada banyak bug dan batasan dengan teknik yang hanya bisa diperbaiki dengan tumpukan CSS tambahan dan satu atau dua wadah div tambahan.
sumber
Plugin jQuery sederhana
Ini adalah variasi pada solusi Mahes. Anda bisa menyebutnya seperti
$('table#foo').scrollableTable();
Idenya adalah:
thead
dantbody
menjaditable
elemen yang terpisahtable
dalam adiv.scrollable
div.scrollable
benar - benar menggulirCSS dapat berupa:
Peringatan
Yang mengatakan, itu berfungsi untuk keperluan saya dan Anda bebas untuk mengambil dan memodifikasinya.
Ini pluginnya:
sumber
:)
Tidak terlalu bersih, tetapi solusi HTML / CSS murni.
Diperbarui untuk contoh IE8 + JSFiddle
sumber
Dukungan untuk footer tetap
Saya memperluas fungsi Nathan untuk juga mendukung footer tetap dan tinggi maksimum. Selain itu, fungsi akan mengatur CSS itu sendiri, dan Anda hanya perlu mendukung lebar.
Pemakaian:
Tinggi tetap:
Tinggi maksimum (jika peramban mendukung opsi 'tinggi-tinggi' CSS):
Naskah:
sumber
Entah bagaimana akhirnya saya berhasil dengan
Position:Sticky
baik dalam kasus saya:sumber
Dua div, satu untuk header, satu untuk data. Buat div data dapat digulir, dan gunakan JavaScript untuk mengatur lebar kolom di header menjadi sama dengan lebar dalam data. Saya pikir lebar kolom data harus diperbaiki daripada dinamis.
sumber
Saya menyadari pertanyaannya memungkinkan JavaScript, tetapi di sini ada solusi CSS murni yang saya upayakan yang juga memungkinkan tabel diperluas secara horizontal. Itu diuji dengan Internet Explorer 10 dan browser Chrome dan Firefox terbaru. Tautan ke jsFiddle ada di bawah.
HTML:
Dan CSS:
http://jsfiddle.net/HNHRv/3/
sumber
Bagi mereka yang mencoba solusi bagus yang diberikan oleh Maximilian Hils, dan tidak berhasil membuatnya bekerja dengan Internet Explorer, saya memiliki masalah yang sama (Internet Explorer 11) dan mencari tahu apa masalahnya.
Di Internet Explorer 11 transformasi gaya (setidaknya dengan terjemahan) tidak berfungsi
<THEAD>
. Saya memecahkan ini dengan menerapkan gaya ke semua<TH>
dalam satu lingkaran. Itu berhasil. Kode JavaScript saya terlihat seperti ini:Dalam kasus saya, tabelnya adalah GridView di ASP.NET. Pertama saya pikir itu karena tidak ada
<THEAD>
, tetapi bahkan ketika saya memaksakan untuk memilikinya, itu tidak berhasil. Kemudian saya menemukan apa yang saya tulis di atas.Ini adalah solusi yang sangat bagus dan sederhana. Di Chrome itu sempurna, di Firefox sedikit tersentak-sentak, dan di Internet Explorer bahkan lebih tersentak-sentak. Namun semuanya merupakan solusi yang bagus.
sumber
Saya berharap saya telah menemukan solusi @ Mark sebelumnya, tetapi saya pergi dan menulis sendiri sebelum saya melihat pertanyaan SO ini ...
Mine adalah plugin jQuery yang sangat ringan yang mendukung header tetap, footer, spanning kolom (colspan), pengubahan ukuran, pengguliran horizontal, dan sejumlah baris pilihan untuk ditampilkan sebelum pengguliran dimulai.
jQuery.scrollTableBody (GitHub)
Selama Anda memiliki meja dengan tepat
<thead>
,<tbody>
dan (opsional)<tfoot>
, semua yang perlu Anda lakukan adalah ini:sumber
Saya menemukan solusi ini - memindahkan baris tajuk dalam tabel di atas tabel dengan data:
sumber
Dengan menerapkan plugin jQuery StickyTableHeaders ke tabel, header kolom akan menempel di bagian atas viewport saat Anda menggulir ke bawah.
Contoh:
sumber
Saya suka jawaban Maximillian Hils tetapi saya punya beberapa masalah:
Untuk menghilangkan flicker, saya menggunakan batas waktu untuk menunggu sampai pengguna selesai menggulir, kemudian saya menerapkan transformasi - sehingga header tidak terlihat selama pengguliran.
Saya juga menulis ini menggunakan jQuery, salah satu keuntungannya adalah bahwa jQuery harus menangani awalan vendor untuk Anda
Meja dibungkus dengan kelas
table-container-fixed
.Saya mengatur border-collapse untuk memisahkan karena jika tidak, kami kehilangan perbatasan selama terjemahan, dan saya menghapus perbatasan di atas meja untuk menghentikan konten yang muncul tepat di atas sel tempat perbatasan itu selama pengguliran.
Saya membuat
th
latar belakang putih untuk menutupi sel-sel di bawahnya, dan saya menambahkan perbatasan yang cocok dengan perbatasan tabel - yang ditata menggunakan Bootstrap dan digulirkan keluar dari pandangan.sumber
Gunakan versi terbaru jQuery, dan sertakan kode JavaScript berikut.
sumber
Ini bukan solusi tepat untuk baris tajuk tetap, tapi saya telah membuat metode yang agak cerdik mengulangi baris tajuk di seluruh tabel panjang, namun tetap menjaga kemampuan untuk menyortir.
Opsi kecil yang rapi ini membutuhkan plugin jQuery
tablesorter
. Begini cara kerjanya:HTML
Jelas, meja saya memiliki lebih banyak baris daripada ini. 193 tepatnya, tetapi Anda bisa melihat di mana baris tajuk berulang. Baris header berulang diatur oleh fungsi ini:
jQuery
sumber
Banyak orang sepertinya mencari jawaban ini. Saya menemukannya terkubur dalam jawaban untuk pertanyaan lain di sini: Menyinkronkan lebar kolom antara tabel dalam dua bingkai yang berbeda, dll
Dari lusinan metode yang saya coba ini adalah satu-satunya metode yang saya temukan yang berfungsi andal untuk memungkinkan Anda memiliki tabel di bawah dengan tabel header memiliki lebar yang sama.
Inilah cara saya melakukannya, pertama saya memperbaiki jsfiddle di atas untuk membuat fungsi ini, yang bekerja pada keduanya
td
danth
(dalam kasus yang membuat orang lain yang menggunakanth
untuk styling baris header mereka).Selanjutnya, Anda perlu membuat dua tabel, CATATAN tabel header harus memiliki tambahan
TD
untuk meninggalkan ruang di tabel atas untuk scrollbar, seperti ini:Kemudian lakukan sesuatu seperti:
Ini adalah satu-satunya solusi yang saya temukan di Stack Overflow yang berhasil dari banyak pertanyaan serupa yang telah diposting, yang berfungsi dalam semua kasus saya.
Misalnya, saya mencoba plugin jQuery stickytables yang tidak berfungsi dengan durandal, dan proyek Google Code di sini https://code.google.com/p/js-scroll-table-header/issues/detail?id=2
Solusi lain yang melibatkan kloning tabel, memiliki kinerja yang buruk, atau payah dan tidak berfungsi dalam semua kasus.
Tidak perlu untuk solusi yang terlalu rumit ini. Buat saja dua tabel seperti contoh di bawah ini dan panggil fungsi setHeaderTableWidth seperti dijelaskan di sini dan boom, Anda selesai .
Jika ini tidak berhasil untuk Anda, Anda mungkin bermain dengan properti ukuran kotak CSS Anda dan Anda harus mengaturnya dengan benar. Sangat mudah untuk mengacaukan konten CSS Anda secara tidak sengaja. Ada banyak hal yang bisa salah, jadi berhati-hatilah. Pendekatan ini bekerja untuk saya .
sumber
Inilah solusi yang akhirnya kami kerjakan (untuk menangani beberapa kasus tepi dan versi Internet Explorer yang lebih lama, kami akhirnya juga memudar bilah judul pada gulir kemudian memudar kembali ketika menggulir berakhir, tetapi di browser Firefox dan WebKit solusi ini hanya berfungsi Dengan asumsi border-collapse: collapse.
Kunci dari solusi ini adalah bahwa sekali Anda menerapkan border-collapse , CSS mengubah pekerjaan pada header, jadi itu hanya masalah mencegat acara gulir dan mengatur transformasi dengan benar. Anda tidak perlu menduplikasi apa pun. Pendek dari perilaku ini diterapkan dengan benar di browser, sulit untuk membayangkan solusi yang lebih ringan.
JSFiddle: http://jsfiddle.net/podperson/tH9VU/2/
Diimplementasikan sebagai plugin jQuery sederhana. Anda cukup membuat lengket thead dengan panggilan seperti $ ('thead'). Sticky (), dan mereka akan berkeliaran. Ini berfungsi untuk beberapa tabel pada halaman dan bagian kepala di tengah meja besar.
sumber
border: 2px solid red;
keth
, gulir, dan Anda akan melihat masalahnya. Saya datang dengan solusi yang lebih mendasar ini sendiri: jsfiddle.net/x6pLcor9/19Ini jawaban yang lebih baik untuk jawaban yang diposting oleh Maximilian Hils .
Yang ini bekerja di Internet Explorer 11 tanpa berkedip sama sekali:
sumber
Saya mengembangkan plug-in jQuery ringan dan sederhana untuk mengubah tabel HTML yang diformat dengan baik menjadi tabel yang dapat digulir dengan header dan kolom tabel tetap.
Plugin berfungsi dengan baik untuk mencocokkan penempatan pixel-ke-pixel bagian tetap dengan bagian yang dapat digulir. Selain itu, Anda juga dapat membekukan jumlah kolom yang akan selalu terlihat saat menggulir secara horizontal.
Demo & Dokumentasi: http://meetselva.github.io/fixed-table-rows-cols/
Repositori GitHub: https://github.com/meetselva/fixed-table-rows-cols
Di bawah ini adalah penggunaan tabel sederhana dengan header tetap,
sumber
sumber
Tambahan untuk jawaban @Daniel Waltrip. Tabel perlu dilampirkan dengan div
position: relative
untuk bekerja dengannyaposition:sticky
. Jadi saya ingin memposting kode sampel saya di sini.CSS
HTML
Demo
sumber