Es ist noch gar nicht so lange her, da habe ich mich im Blogbeitrag A table with both a sticky header and a sticky first column mit Sticky Headern und Footern in HTML-<table>s beschäftigt. Damals habe ich position: sticky nicht auf <thead>-, <tfoot>- oder <tr>-Elemente angewendet, weil dies zwar in Safari und Firefox funktionierte, aber nicht in Chrome. Allerdings funktionierte es für Tabellenzellen wie <th> und <td>, was eine ausreichend gute Notlösung war.
Nun, das hat sich geändert.
Es klingt, als wäre viel Aufwand in die vollständige Überarbeitung von Tabellen in der Rendering-Engine in Chromium geflossen, um Tabellen auf den neuesten Stand zu bringen. Es ist nicht nur die Sticky-Funktionalität, die behoben wurde, sondern alle möglichen Dinge. Ich konzentriere mich nur auf die Sticky-Funktion, da das das ist, womit ich mich beschäftigt habe.
Die wichtigste Neuerung ist meiner Meinung nach, dass <thead> und <tfoot> sticky sein können. Das scheint hier der häufigste Anwendungsfall zu sein.
table thead,
table tfoot {
position: sticky;
}
table thead {
inset-block-start: 0; /* "top" */
}
table tfoot {
inset-block-end: 0; /* "bottom" */
}
Das funktioniert in allen drei großen Browsern. Möglicherweise möchten Sie clever vorgehen und sie nur bei bestimmten Mindest-Viewport-Höhen oder ähnlichem sticky machen, aber die Hauptsache ist, dass es funktioniert.
Ich habe auch mehrere Fragen zu Tabellen*spalten* gehört. Mein ursprünglicher Artikel hatte eine sticky erste Spalte (das war sozusagen der Punkt). Obwohl es ein <col>-Tag für Tabellen gibt, ist es ... seltsam. Es umschließt keine Spalten, sondern ist eher ein Zeiger, um die Spalte bei Bedarf stylen zu können. Ich sehe es kaum verwendet, aber es ist da. Auf jeden Fall können Sie <col> *nicht* position: sticky; machen, aber Sie können sticky Spalten erstellen. Sie müssen alle Zellen in dieser Spalte auswählen und sie links oder rechts anheften. Hier ist das mit logischen Eigenschaften ...
table tr th:first-child {
position: sticky;
inset-inline-start: 0; /* "left" */
}
Hier ist eine etwas unverschämte Tabelle, bei der der <thead>, der <tfoot> *sowie* die erste und die letzte Spalte alle sticky sind.
Ich bin sicher, man könnte damit etwas Geschmackvolles machen. Zum Beispiel vielleicht
Ausgezeichnet. Könnten die Wikis das bitte hinzufügen?
Hallo, toller Artikel zuerst, aber können Sie mir sagen, was {font: 110%/1.4 system-ui} bedeutete und wie der Browser es liest?
Die
110%beziehen sich auf diefont-sizeDie
1.4bezieht sich auf dieline-heightDie
system-uibezieht sich auf diefont-familyDas alles in einer
font-Deklaration zusammenzufassen, nennt man Shorthand und ist absolut gültig! Mehr dazu erfahren Sie hier auf MDN.Funktioniert nicht auf Microsoft Edge 91.0.864.48.
Bestätigt.
Was sagt uns das? Ich denke, es sagt uns, dass Microsoft Edge, obwohl es auf Chromium basiert, die Releases nicht eins zu eins synchron hält. Die "neu geschriebenen" Tabellen werden wahrscheinlich in einer zukünftigen Version von Edge landen, nehme ich an.
Funktioniert jetzt zumindest.
Funktioniert immer noch nicht für display: table-header-group :(
Ich habe das noch nicht ausprobiert, habe es gerade gefunden, aber für diejenigen, die sagen, es funktioniert nicht in Edge, versuchen Sie die **
Edge-Dev**-Version. Edge läuft jetzt auf der gleichen "Grundlage" wie Chrome und Firefox, daher *sollte* es funktionieren...Ich habe heute Morgen Ihren ursprünglichen Artikel gelesen, um das zu erreichen, und er hat großartig funktioniert.
Jetzt wird es noch besser!
Danke dafür!
Scheint auch auf meinem mobilen Chrome nicht zu funktionieren.
Leider scheint es auf den meisten Seiten immer noch fast unmöglich zu sein, sowohl sticky Header/Footer-Zeilen als auch Spalten zu verwenden, da Tabellen die Breiten übergeordneter Elemente nicht berücksichtigen. Wenn Ihre Tabelle breiter als ihr übergeordnetes Element ist, wird sie am rechten Rand überlaufen (wodurch das horizontale Scrollen, bei dem sticky Spalten nützlich sind, verhindert wird), es sei denn, sie wird in einen Wrapper mit
overflow-x: auto(oderscroll) gesetzt. Aber wenn Sie das tun, erstellen Sie einen neuen Formatierungskontext und verlieren die Sticky-Funktionalität der Header/Footer-Zeilen.Siehe minimales Beispiel hier: https://jsfiddle.net/jye05wzc/
Ich schätze, die Verwendung eines
iframeals Wrapper ist eine Art Workaround, aber das ist eine ziemliche Verrenkung für ein grundlegendes Scrollverhalten.Eigentlich, vergessen Sie, was ich über
iframegesagt habe – ich dachte, ich hätte gesehen, wie eines der eingebetteten Beispiele korrekt am oberen Rand des Artikel-Fensters (statt seines eingebetteten Fensters) haftete, aber dann konnte ich es nicht wiederfinden. Bei genauerer Betrachtung sehe ich keinen Grund anzunehmen, dassiframehier überhaupt helfen würde.Damit sind wir wieder am Anfang: Unterstützen Tabellen einfach keine Art von Overflow-Scrolling, bei dem die Tabelle selbst und nicht ein Wrapper als Container für ihre Zellen betrachtet wird?
Ich habe mir das noch einmal angesehen und dachte, ich hätte eine Lösung in diesem CSS-Arbeitsgruppendokument gefunden und wollte es zusammenfassen.
overflow: clipist ein kürzlich eingeführter Wert, der sein Verhalten achsenspezifisch anwendbar macht. Er erstellt nicht allein einen Blockformatierungskontext, daher vermutete ich, dassoverflow-x: scrollmitoverflow-y: clipdas gewünschte Verhalten bieten könnte. Leider implementieren weder Chrome noch Firefox dies so – solangeoverflow-x: scrollvorhanden ist, wird unabhängig davon ein neuer Formatierungskontext (der für beide Dimensionen gilt) erstellt, und Spaltenüberschriften werden nicht mit der Seite gescrollt. Es scheint, dass das Arbeitsgruppendokument 865 speziell wegen dieses Anwendungsfalls offen bleibt, daher ist die Hoffnung meiner Meinung nach im Moment, dassposition: stickyUnterstützung für das gewünschte Verhalten in übergeordneten Elementen mitoverflow: hiddenoderoverflow: scrollerhält.Hallo Chris,
Was verhindert, dass ein sticky Header oder Footer für alle Tabellenspalten sticky ist? Wenn ich das von Ihnen beschriebene CSS verwende, ist mein Header für alle Spalten sticky, aber der Footer ist für alle außer der letzten Spalte sticky? Ich suche seit langem nach einer Lösung, auch auf Stackoverflow, ohne Erfolg.
Das funktioniert großartig, aber wenn ich es anwende, gibt es ein wenig zusätzlichen Tabelleninhalt sowohl oberhalb als auch unterhalb der Header/Footer-Zeilen. Das verursacht keine funktionellen Probleme, ist aber optisch hässlich.
Ich weiß nicht, wie ich das beheben kann, irgendwelche Ideen? Vermutlich wird die Korrektur auch den kleinen Abstand zwischen den Zeilen der 2-zeiligen tfoot hier beheben
https://staff.scheig.com/extraneous.png
Ich habe Edge Version 93.0.961.38 und es funktioniert wie Chrome. Endlich kann es überall verwendet werden :)