Chciałbym móc „dostosować” prezentację tabeli HTML, aby dodać jedną funkcję: podczas przewijania strony w dół, tak aby tabela była na ekranie, ale wiersze nagłówka były poza ekranem, chciałbym, aby nagłówki pozostały widoczne u góry obszaru wyświetlania.
Pod względem koncepcyjnym byłoby to podobne do funkcji „zamrażania okienek” w programie Excel. Jednak strona HTML może zawierać kilka tabel i chciałbym, aby miało to miejsce tylko w przypadku tabeli, która jest aktualnie wyświetlana, tylko wtedy, gdy jest w widoku.
Uwaga: widziałem jedno rozwiązanie, w którym obszar danych tabeli jest przewijalny, podczas gdy nagłówki się nie przewijają. To nie jest rozwiązanie, którego szukam.
html
html-table
Craig McQueen
źródło
źródło
Odpowiedzi:
Sprawdź jQuery.floatThead ( dostępne wersje demonstracyjne ), który jest bardzo fajny, może również współpracować z DataTables , a nawet może działać w
overflow: auto
kontenerze.źródło
Stworzyłem rozwiązanie typu proof-of-concept przy użyciu jQuery .
Zobacz próbkę tutaj.
Mam teraz ten kod w repozytorium bitbucket Mercurial . Główny plik to
tables.html
.Jestem świadomy jednego problemu z tym: jeśli tabela zawiera kotwice i jeśli otworzysz adres URL z określoną kotwicą w przeglądarce, po załadowaniu strony wiersz z kotwicą zostanie prawdopodobnie zasłonięty przez pływający nagłówek.
Aktualizacja 2017-12-11: Widzę, że to nie działa z obecnymi przeglądarkami Firefox (57) i Chrome (63). Nie wiem, kiedy i dlaczego to przestało działać lub jak to naprawić. Ale teraz myślę, że zaakceptowana przez Hendy Irawan odpowiedź jest lepsza.
źródło
floatingHeaderRow.css("top", Math.min(scrollTop - offset.top, $(this).height() - floatingHeaderRow.height()) + "px");
sięfloatingHeaderRow.css("top", scrollTop + "px");
jak w kodzie miałeś nagłówek tabeli skakał dalej w dół strony, aby w końcu zniknąć off stronę.// Copy cell widths from original header
elementu <th> (patrz część kodu). @Craig McQueen, edytuj swoją odpowiedź, aby nikt inny nie popełnił tego błędu.Craig, dopracowałem trochę twój kod (między innymi używa on teraz position: fixed) i zapakowałem go jako wtyczkę jQuery.
Wypróbuj tutaj: http://jsfiddle.net/jmosbech/stFcx/
Uzyskaj źródło tutaj: https://github.com/jmosbech/StickyTableHeaders
źródło
Jeśli celujesz w nowoczesne przeglądarki zgodne z css3 ( obsługa przeglądarek: https://caniuse.com/#feat=css-sticky ), możesz użyć
position:sticky
, które nie wymaga JS i nie złamie układu tabeli. i td w tej samej kolumnie. Nie wymaga też stałej szerokości kolumny do prawidłowego działania.Przykład dla pojedynczego wiersza nagłówka:
W przypadku łopatek z 1 lub 2 rzędami możesz użyć czegoś takiego:
Być może będziesz musiał trochę pobawić się z górną właściwością ostatniego dziecka, zmieniając liczbę pikseli w celu dopasowania do wysokości pierwszego wiersza (+ margines + obramowanie + wypełnienie, jeśli istnieje), więc drugi wiersz pozostaje tylko w dół poniżej pierwszy.
Oba rozwiązania działają również, jeśli masz więcej niż jedną tabelę na tej samej stronie:
th
element każdego z nich zaczyna być lepki, gdy jego górna pozycja jest wskazana w definicji css i po prostu znika, gdy cała tabela przewinie się w dół. Więc jeśli jest więcej tabel, wszystkie działają pięknie w ten sam sposób.Dlaczego w CSS używać last-child before i first-child after ?
Ponieważ reguły css są renderowane przez przeglądarkę w tej samej kolejności, w jakiej zapisujesz je w pliku css iz tego powodu, jeśli masz tylko 1 wiersz w elemencie thead, pierwszy wiersz jest jednocześnie ostatnim wierszem i wymaga reguły pierwszego potomka zastąpienie ostatniego dziecka. Jeśli nie, będziesz miał przesunięcie wiersza o 30 pikseli od górnego marginesu, czego przypuszczam, że nie chcesz.
Znany problem z pozycją: lepka polega na tym, że nie działa ona na elementach thead lub wierszach tabeli: musisz nacelować na elementy th. Hopping ten problem zostanie rozwiązany w przyszłych wersjach przeglądarek.
źródło
thead tr+tr th
aby kierować na drugi wiersz.Możliwe alternatywy
js-floating-table-headers
js-floating-table-headers (Google Code)
W Drupalu
Mam witrynę Drupal 6. Byłem na stronie „moduły” administratora i zauważyłem, że tabele mają dokładnie tę funkcję!
Patrząc na kod, wydaje się, że jest on zaimplementowany przez plik o nazwie
tableheader.js
. Stosuje tę funkcję na wszystkich stołach z klasąsticky-enabled
.W przypadku witryny Drupal chciałbym móc korzystać z tego
tableheader.js
modułu w takiej postaci, w jakiej jest do treści użytkowników.tableheader.js
nie wydaje się być obecny na stronach z treścią użytkownika w Drupalu. Opublikowałem wiadomość na forum, aby zapytać, jak zmodyfikować motyw Drupala, aby był dostępny. Zgodnie z odpowiedzią,tableheader.js
można dodać do motywu Drupala, używającdrupal_add_js()
w motywie wtemplate.php
następujący sposób:źródło
Niedawno napotkałem ten problem. Niestety musiałem zrobić 2 tabele, jedną dla nagłówka i jedną dla ciała. Prawdopodobnie nie jest to najlepsze podejście w historii, ale oto:
To zadziałało dla mnie, prawdopodobnie nie jest to elegancki sposób, ale działa. Zbadam, czy mogę zrobić coś lepszego, ale pozwala to na wiele tabel.
Przeczytaj o właściwościach przepełnienia, aby sprawdzić, czy pasuje do twoich potrzeb
źródło
To naprawdę trudne, aby mieć lepki nagłówek na stole. Miałem te same wymagania, ale z asp: GridView, a potem stwierdziłem, że naprawdę pomyślałem, że ma lepki nagłówek w widoku siatki. Dostępnych jest wiele rozwiązań i wypróbowanie wszystkich zajęło mi 3 dni, ale żadne z nich nie było satysfakcjonujące.
Głównym problemem, z którym miałem do czynienia w przypadku większości tych rozwiązań, był problem z wyrównaniem. Kiedy próbujesz sprawić, by nagłówek był pływający, w jakiś sposób wyrównanie komórek nagłówka i komórek treści znika z właściwej ścieżki.
W przypadku niektórych rozwiązań pojawił się również problem z nakładaniem się nagłówka na kilka pierwszych rzędów treści, co powoduje, że wiersze treści są ukrywane za pływającym nagłówkiem.
Więc teraz musiałem zaimplementować własną logikę, aby to osiągnąć, chociaż też nie uważam tego za idealne rozwiązanie, ale może to też być pomocne dla kogoś,
Poniżej znajduje się przykładowa tabela.
Uwaga : Tabela jest opakowana w DIV z atrybutem klasy równym „table-holder”.
Poniżej znajduje się skrypt JQuery, który dodałem w nagłówku mojej strony html.
i na koniec poniżej jest klasa CSS do trochę kolorowania.
Więc cała idea tej logiki polega na umieszczeniu tabeli w div tabeli i utworzeniu klonu tego uchwytu po stronie klienta po załadowaniu strony. Teraz ukryj korpus tabeli w uchwycie klonu i umieść pozostałą część nagłówka nad oryginalnym nagłówkiem.
To samo rozwiązanie działa również dla asp: gridview, musisz dodać jeszcze dwa kroki, aby to osiągnąć w widoku siatki,
W zdarzeniu OnPrerender obiektu gridview na Twojej stronie internetowej ustaw sekcję tabeli w wierszu nagłówka na wartość TableHeader.
I zawiń swoją siatkę w
<div class="table-holder"></div>
.Uwaga : jeśli twój nagłówek ma klikalne elementy sterujące, może być konieczne dodanie więcej skryptu jQuery, aby przekazać zdarzenia wywołane w sklonowanym nagłówku do oryginalnego nagłówka. Ten kod jest już dostępny we wtyczce jQuery sticky-header stworzonej przez jmosbech
źródło
Korzystanie
display: fixed
zthead
sekcji powinno działać, ale aby działać tylko na bieżącej tabeli, będziesz potrzebować pomocy JavaScript. I będzie to trudne, ponieważ będzie musiał znaleźć przewijane miejsca i położenie elementów względem widoku, który jest jednym z głównych obszarów niezgodności przeglądarek.Spójrz na popularne frameworki JavaScript (jQuery, MooTools, YUI itp.), Aby sprawdzić, czy mogą albo robić to, co chcesz, albo ułatwić robienie tego, co chcesz.
źródło
position: fixed
. Przepraszamy, to nie działa w Chrome.Jeśli używasz tabeli pełnoekranowej, być może jesteś zainteresowany ustawieniem wyświetlania th: fixed; i góra: 0; lub wypróbuj bardzo podobne podejście poprzez css.
Aktualizacja
Po prostu szybko utwórz działające rozwiązanie za pomocą ramek iframe (html4.0). Ten przykład NIE JEST zgodny ze standardem, jednak z łatwością będziesz w stanie to naprawić:
external.html
test.html
źródło
Najprostsza odpowiedź tylko przy użyciu CSS: D !!!
źródło
Ten dowód słuszności koncepcji był świetny! Jednak znalazłem również tę wtyczkę jQuery, która wydaje się działać bardzo dobrze. Mam nadzieję, że to pomoże!
źródło
To frustrujące, że to, co działa świetnie w jednej przeglądarce, nie działa w innych. Poniższe działa w przeglądarce Firefox, ale nie w Chrome ani IE:
źródło
px
? Czy to ta starsza jednostka używana przez ludzi w 90. wieku, kiedy używano wyświetlacza o rozdzielczości 72 dpi?