- Bei Tabellen mit vielen Zeilen vergisst man beim Scrollen leicht die Bedeutung der Spalten, was das Lesen der Daten erschwert
- Wenn man zu
thead nur position: sticky; und top: 0; hinzufügt, lässt sich ein fixierter Header umsetzen
sticky wird weltweit von rund 96 % der Browser unterstützt und ist damit kaum noch als experimentelle Funktion zu betrachten
- Auch wenn man weiter unten liegende Zeilen wie den 300. Eintrag betrachtet, bleiben die Spaltenüberschriften sichtbar, was die Navigation in der Tabelle verbessert
- Die Umsetzung ist klein, aber der Effekt groß; für Webseiten mit langen Tabellen ist das eine sinnvolle grundlegende Verbesserung der Usability
Das Problem verschwindender Header in langen Tabellen
- Bei großen Datensätzen oder Tabellen mit Hunderten von Zeilen verschwindet der Tabellenkopf nach dem Scrollen aus dem sichtbaren Bereich
- Wenn man bis zum 300. Eintrag heruntergeht, kann es schwierig werden, erneut nachzuvollziehen, wofür die Daten in den einzelnen Spalten stehen
- Je unbekannter die Tabelle ist, desto stärker muss man sich beim Lesen die Bedeutung der Spalten merken, was die Navigation mühsamer macht
sticky auf thead anwenden
- Die Lösung besteht darin,
thead zwei CSS-Eigenschaften hinzuzufügen
position: sticky;
top: 0;
- Wenn
position: sticky und top: 0 zusammen verwendet werden, lässt sich der Header auch während des Scrollens am oberen Bildschirmrand fixieren
sticky hat eine weltweite Unterstützung von etwa 96 % und kann daher in vielen Browsern verwendet werden
- Die tatsächliche Funktionsweise lässt sich im CodePen-Beispiel ansehen
1 Kommentare
Hacker-News-Kommentare
Einen fixierten Header auf einer Achse akzeptiere ich ja noch, aber ich warte immer noch auf den Tag, an dem CSS beide Achsen unterstützt: https://github.com/w3c/csswg-drafts/issues/8286
overflow-x: autoverwenden, aber stattdessen soll man sich für eines von beidem entscheidenEhrlich gesagt habe ich kaum CSS-Kenntnisse und baue trotzdem Web-Apps, die mehr oder weniger funktionieren. Neulich wollte ich bei einer Monster-Tabelle mit etwa 20.000 Zeilen den Header fixieren: https://www.datasciencemeta.com/rpackages Ich hatte zuerst erwartet, dass es bei den Bootstrap-Tabellenklassen so etwas wie
class="table table-header-sticky"gibt, aber das gab es nicht, und nach 20 Minuten mit Stack Overflow, GPT und CodePen-Vorschlägen hatte ich nur seltsame Nebenwirkungen Mit dem CodePen aus diesem Artikel lief es dagegen in zwei Minuten, und ich rolle es gerade in Produktion ausEinen Tabellenkopf zu fixieren wirkt mit
position: sticky;einfach, aber sobald man anfängt, der Tabelle weitere Funktionen zu geben, wird es sofort kompliziert Ich hatte einmal in einer Tabelle mit fixiertem Header eine Funktion eingebaut, die den Index der ersten sichtbaren Zeile speichert, wenn ein Nutzer durch den Inhalt scrollt und dann die Seite verlässt, und ihn bei der Rückkehr wiederherstellt. Dabei wurde immer etwa eine Zeile zu weit unten wiederhergestellt. Es stellte sich heraus, dass Zeile 5 tatsächlich ganz oben in der Tabelle war, aber durch das darüberliegendetheadsah Zeile 6 wie die erste Zeile aus Also habe ich die Scroll-Position unter Berücksichtigung derthead-Höhe angepasst, aber gelegentlich war es immer noch um ein paar Pixel verschoben, und weil es eine große Tabelle war, mit Lazy Loading im Scroll-Event und dem Standard-Autolayout der Tabelle, wurden Header-Zellen umbrochen, wodurch sich die gesamte Header-Höhe änderte. Am Ende habe ich antheadeinen ResizeObserver gehängt und die Scroll-Position dynamisch angepasst, wenn sich die Höhe änderte [1] https://developer.mozilla.org/en-US/docs/Web/API/ResizeObser...Wenn du das umsetzt und möchtest, dass auch die Rahmenlinie des Headers fixiert bleibt, kannst du es über
table thead:beforeundtable thead:afterlösen, indem duposition: absolute,width: 100%,top: 0/bottom: 0sowieborder-top/border-bottomsetztEigentlich sollten Tabellenköpfe von Haus aus so funktionieren. Wenn ein Entwickler überhaupt die entsprechenden Tags benutzt und zusätzlichen Aufwand betreibt, ist die Wahrscheinlichkeit hoch, dass genau dieses Verhalten gewünscht ist
stattund mit 45-fach verschachteltenin jedemauf, daher würde das dort vermutlich nicht funktionierenIn der Kommandozeile schickt man den Header nach stderr und den Inhalt nach stdout Andernfalls ergibt
heights | sort -k2 -nrdie ReihenfolgeGeorge 186,Wally 173,NAME HEIGHT, aber wenn der Header stdout umgeht, wird darausNAME HEIGHT,George 186,Wally 173heights | (sed -u 1q; sort -k2 -nr)funktioniert korrekt Quelle: https://stackoverflow.com/a/56151840heightseine Datei ist, kann man etwa% head -1 heights ; sed 1,1d heights | sort -k2 -nrverwenden, und wennheightsein ausführbares Programm ist, das teuer ist, zweimal zu starten, dann etwa% heights > /tmp/heights ; head -1 /tmp/heights ; sed 1,1d /tmp/heights | sort -k2 -nr. Man kann auch perawkweiterpipen Andere Optionen sind weniger bequem, aber dafür weniger überraschend und funktionieren auch dann, wenn der Autor des Programms etwas anderes im Sinn hatteDas hat lange Zeit nicht funktioniert. Chrome hatte früher
position: stickyaufthead- undtr-Elementen deaktiviert: https://issues.chromium.org/issues/41303743 Ich erinnere mich, dass die Browser-Support-Tabelle fast überall grün aussah, es in Chromes Tabellen aber ausgerechnet nicht gingEs gibt auch die Fraktion, die lieber sagen würde: „Bitte bloß nicht“: https://news.ycombinator.com/item?id=32998091
stickyschlecht?Im CodePen sieht es besser aus, wenn man
topum die Rahmenbreite versetzt. Zum Beispiel-1pxstatt0, damit der Tabellenkörper nicht oberhalb des Headers durchscheint Vergleich: https://codepen.io/bradleytaunt/pen/bGZyJBj Anpassung: https://codepen.io/alokmenghrajani/pen/ExMBQowStatt eines fixierten Headers wird ein begrenzter Viewport in der Höhe vorgeschlagen, sodass der Header immer sichtbar bleibt So wie bei DataGridXL(https://datagridxl.com). Zur Transparenz: Das habe ich gebaut