Saya ingin dapat "men-tweak" presentasi tabel HTML untuk menambahkan fitur tunggal: ketika menggulir ke bawah melalui halaman sehingga tabel ada di layar tetapi baris header di luar layar, saya ingin header tetap ada terlihat di bagian atas area tampilan.
Ini akan secara konseptual seperti fitur "panel beku" di Excel. Namun, halaman HTML mungkin berisi beberapa tabel di dalamnya dan saya hanya ingin itu terjadi untuk tabel yang saat ini dalam tampilan, hanya saat sedang dalam tampilan.
Catatan: Saya telah melihat satu solusi di mana area data tabel dibuat dapat digulir sementara header tidak menggulir. Itu bukan solusi yang saya cari.
html
html-table
Craig McQueen
sumber
sumber
Jawaban:
Lihat jQuery.floatThead ( demo tersedia ) yang sangat keren, dapat bekerja dengan DataTables juga, dan bahkan dapat bekerja di dalam sebuah
overflow: auto
wadah.sumber
Saya telah membuat solusi proof-of-concept menggunakan jQuery .
Lihat sampel di sini.
Saya sekarang mendapatkan kode ini dalam repositori bitbucket Mercurial . File utamanya adalah
tables.html
.Saya mengetahui satu masalah dengan ini: jika tabel berisi jangkar, dan jika Anda membuka URL dengan jangkar yang ditentukan di browser, saat halaman dimuat, baris dengan jangkar mungkin akan dikaburkan oleh header mengambang.
Pembaruan 2017-12-11: Saya melihat ini tidak berfungsi dengan Firefox saat ini (57) dan Chrome (63). Tidak yakin kapan dan mengapa ini berhenti bekerja, atau bagaimana cara memperbaikinya. Tapi sekarang, saya pikir jawaban yang diterima oleh Hendy Irawan lebih unggul.
sumber
floatingHeaderRow.css("top", Math.min(scrollTop - offset.top, $(this).height() - floatingHeaderRow.height()) + "px");
untukfloatingHeaderRow.css("top", scrollTop + "px");
seperti dengan kode Anda memiliki header tabel melompat di bagian bawah halaman untuk akhirnya menghilang dari halaman.// Copy cell widths from original header
bagian dari kode). @Craig McQueen, harap edit jawaban Anda sehingga tidak ada orang lain yang melakukan kesalahan ini.Craig, saya sedikit memperbaiki kode Anda (di antara beberapa hal lainnya sekarang menggunakan posisi: diperbaiki) dan membungkusnya sebagai plugin jQuery.
Cobalah di sini: http://jsfiddle.net/jmosbech/stFcx/
Dan dapatkan sumbernya di sini: https://github.com/jmosbech/StickyTableHeaders
sumber
Jika Anda menargetkan peramban modern yang memenuhi standar css3 ( Dukungan peramban: https://caniuse.com/#feat=css-sticky ), Anda dapat menggunakan
position:sticky
, yang tidak memerlukan JS dan tidak akan merusak tata letak tabel yang tidak selaras dan td dari kolom yang sama. Juga tidak membutuhkan lebar kolom tetap untuk berfungsi dengan benar.Contoh untuk satu baris tajuk:
Untuk theads dengan 1 atau 2 baris, Anda dapat menggunakan sesuatu seperti ini:
Anda mungkin perlu bermain sedikit dengan properti teratas anak terakhir yang mengubah jumlah piksel agar sesuai dengan ketinggian baris pertama (+ margin + perbatasan + padding, jika ada), sehingga baris kedua menempel tepat di bawah di bawah yang pertama.
Kedua solusi juga berfungsi bahkan jika Anda memiliki lebih dari satu tabel di halaman yang sama:
th
elemen dari masing-masing mulai lengket ketika posisi atasnya adalah yang ditunjukkan dalam definisi css dan hilang begitu saja ketika semua tabel bergulir ke bawah. Jadi, jika ada lebih banyak tabel, semuanya bekerja dengan indah dengan cara yang sama.Mengapa menggunakan anak terakhir sebelum dan anak pertama setelah di css?
Karena aturan css di-render oleh browser dalam urutan yang sama ketika Anda menuliskannya ke dalam file css dan karena ini jika Anda hanya memiliki 1 baris ke dalam elemen thead, baris pertama secara bersamaan juga merupakan baris terakhir dan aturan anak-anak perlu untuk menimpa anak terakhir. Jika tidak, Anda akan memiliki offset baris 30 px dari margin atas yang saya kira tidak Anda inginkan.
Masalah yang diketahui dari posisi: sticky adalah bahwa itu tidak berfungsi pada elemen thead atau baris tabel: Anda harus menargetkan elemen th. Hopping masalah ini akan diselesaikan pada versi browser yang akan datang.
sumber
thead tr+tr th
untuk menargetkan baris kedua.Alternatif yang mungkin
js-floating-table-header
js-floating-table-header (Google Code)
Di Drupal
Saya punya situs Drupal 6. Saya berada di halaman "modul" admin, dan melihat tabel memiliki fitur yang tepat ini!
Melihat kode itu, tampaknya diimplementasikan oleh file bernama
tableheader.js
. Ini menerapkan fitur pada semua tabel dengan kelassticky-enabled
.Untuk situs Drupal, saya ingin dapat menggunakan
tableheader.js
modul apa adanya untuk konten pengguna.tableheader.js
tampaknya tidak ada di halaman konten pengguna di Drupal. Saya memposting pesan forum untuk bertanya bagaimana memodifikasi tema Drupal sehingga tersedia. Menurut tanggapan,tableheader.js
dapat ditambahkan ke tema Drupal menggunakandrupal_add_js()
dalam tematemplate.php
sebagai berikut:sumber
Saya mengalami masalah ini baru-baru ini. Sayangnya, saya harus melakukan 2 tabel, satu untuk header dan satu untuk tubuh. Ini mungkin bukan pendekatan terbaik yang pernah ada tetapi begini:
Ini bekerja untuk saya, itu mungkin bukan cara yang elegan tetapi tidak berhasil. Saya akan menyelidiki jadi lihat apakah saya bisa melakukan sesuatu yang lebih baik, tetapi memungkinkan untuk beberapa tabel.
Bacalah kepatutan melimpah untuk melihat apakah itu sesuai dengan kebutuhan Anda
sumber
Ini benar-benar hal yang sulit untuk memiliki header yang lengket di meja Anda. Saya memiliki persyaratan yang sama tetapi dengan asp: GridView dan kemudian saya menemukan itu benar-benar dianggap memiliki header yang lengket di gridview. Ada banyak solusi yang tersedia dan saya butuh 3 hari untuk mencoba semua solusi tetapi tidak ada satupun yang bisa memuaskan.
Masalah utama yang saya hadapi dengan sebagian besar solusi ini adalah masalah penyelarasan. Saat Anda mencoba membuat tajuk melayang, entah bagaimana penyelarasan sel tajuk dan sel tubuh keluar jalur.
Dengan beberapa solusi, saya juga mendapat masalah tumpang tindih tumpang tindih dengan beberapa baris tubuh pertama, yang menyebabkan baris tubuh tersembunyi di belakang tajuk mengambang.
Jadi sekarang saya harus menerapkan logika saya sendiri untuk mencapai ini, meskipun saya juga tidak menganggap ini sebagai solusi yang sempurna tetapi ini juga bisa bermanfaat bagi seseorang,
Di bawah ini adalah tabel sampel.
Catatan : Tabel ini dibungkus menjadi DIV dengan atribut kelas yang sama dengan 'table-holder'.
Di bawah ini adalah skrip JQuery yang saya tambahkan di header halaman html saya.
dan akhirnya di bawah ini adalah kelas CSS untuk tujuan pewarnaan.
Jadi seluruh ide dari logika ini adalah untuk menempatkan tabel ke dalam div pemegang tabel dan membuat klon dari pemegang itu di sisi klien ketika halaman dimuat. Sekarang sembunyikan isi tabel di dalam pemegang klon dan posisikan bagian tajuk yang tersisa ke tajuk asli.
Solusi yang sama juga berfungsi untuk asp: gridview, Anda perlu menambahkan dua langkah lagi untuk mencapai ini di gridview,
Dalam acara OnPrerender objek gridview di halaman web Anda, setel bagian tabel dari baris header sama dengan TableHeader.
Dan bungkus grid Anda menjadi
<div class="table-holder"></div>
.Catatan : jika tajuk Anda memiliki kontrol yang dapat diklik maka Anda mungkin perlu menambahkan beberapa skrip jQuery untuk meneruskan peristiwa yang dibesarkan dalam tajuk yang dikloning ke tajuk asli. Kode ini sudah tersedia di plugin sticky-header jQuery yang dibuat oleh jmosbech
sumber
Menggunakan
display: fixed
padathead
bagian harus berfungsi, tetapi untuk itu hanya bekerja pada tabel saat ini dalam tampilan, Anda akan memerlukan bantuan JavaScript. Dan itu akan rumit karena perlu mencari tahu tempat menggulir dan lokasi elemen relatif terhadap viewport, yang merupakan salah satu area utama ketidakcocokan browser.Lihatlah kerangka kerja JavaScript yang populer (jQuery, MooTools, YUI, dll.) Untuk melihat apakah mereka dapat melakukan apa yang Anda inginkan atau membuatnya lebih mudah untuk melakukan apa yang Anda inginkan.
sumber
position: fixed
. Maaf itu tidak berfungsi di Chrome.Jika Anda menggunakan tabel layar penuh Anda mungkin tertarik untuk mengatur th untuk menampilkan: diperbaiki; dan atas: 0; atau coba pendekatan yang sangat mirip melalui css.
Memperbarui
Cukup cepat buat solusi yang berfungsi dengan iframe (html4.0). Contoh ini BUKAN kesesuaian standar, namun Anda dapat dengan mudah memperbaikinya:
outer.html
test.html
sumber
Jawaban paling sederhana hanya menggunakan CSS: D !!!
sumber
Itu bukti dari konsep Anda membuat rasanya! Namun saya juga menemukan plugin jQuery ini yang tampaknya berfungsi dengan sangat baik. Semoga ini bisa membantu!
sumber
Ini membuat frustasi karena apa yang berfungsi dengan baik di satu browser tidak bekerja di browser lain. Berikut ini berfungsi di Firefox, tetapi tidak di Chrome atau IE:
sumber
px
? Apakah unit warisan itu digunakan oleh orang-orang pada tanggal 90 ketika perangkat layar digunakan untuk memiliki 72 dpi?