Wir haben bereits behandelt, dass einzelne <table>-Zellen, <th> und <td> position: sticky sein können. Es ist ziemlich einfach, den Kopfzeilenbereich einer Tabelle beim Scrollen durch viele Zeilen am oberen Bildschirmrand haften zu lassen (wie in dieser Demo).
Aber Haftung ist nicht nur für den oberen Bildschirmrand gedacht, Sie können Elemente in jeder Scroll-Richtung haften lassen (horizontal ist genauso unterhaltsam). Tatsächlich können wir mehrere haftende Elemente in verschiedenen Richtungen innerhalb desselben Elements haben, und sogar einzelne Elemente, die in mehreren Richtungen haften.
Hier ist ein Videobeispiel einer Tabelle, die sowohl den Kopfzeilenbereich als auch die erste Spalte fixiert
Warum sollte man das tun? Speziell für tabellarische Daten, bei denen die Querverweise im Vordergrund stehen. In dieser Tabelle (die natürlich das Scoring-Baseballspiel darstellt, bei dem irgendwie 20 Teams gleichzeitig gegeneinander spielen, weil das eben so ist im Baseball) ist es „sinnvoll“, dass man nicht möchte, dass der Teamname oder die Inning-Nummer wegscrollt, da man den Kontext dessen, was man betrachtet, verlieren würde.
Nicht alle Tabellen müssen bidirektional querverweisbar sein. Viele Tabellen können auf kleinen Bildschirmen Zeilen in Blöcke aufteilen, um eine bessere Darstellung auf kleinen Bildschirmen zu erzielen.
Der hierbei angewandte „Trick“ ist teilweise die Verwendung von position: sticky;, aber für mich vielmehr die Art und Weise, wie man überlappende Elemente handhaben muss. Eine Tabellenzelle, die haftet, muss einen Hintergrund haben, da wir sonst überlappende Inhalte sehen. Sie benötigt auch eine ordnungsgemäße z-index-Behandlung, damit sie beim Fixieren über dem Element liegt, das sie überragen soll. Das scheint der kniffligste Teil zu sein.
- Stellen Sie sicher, dass die
tbody>th-Zellen über den normalen Tabellenzellen liegen, damit sie beim horizontalen Scrollen oben bleiben. - Stellen Sie sicher, dass die
thead>th-Zellen darüber liegen, für vertikales Scrollen. - Stellen Sie sicher, dass die
thead>th:first-child-Zelle die allerhöchste ist, da sie über den Körperzellen und ihren Geschwisterköpfen für das horizontale Scrollen liegen muss.
Ein bisschen Tanz, aber es ist machbar.
Ein High Five an Cameron Clark, der mir per E-Mail eine Demo davon schickte und mir zeigte, wie cool das ist. Und tatsächlich, Cameron, es ist cool. Als ich das weitergab, zeigte mir Estelle Weyl eine Demo, die sie vor einigen Jahren erstellt hatte. Das passt ungefähr, Estelle ist mir immer ein paar Jahre voraus.
Ich habe sie beide geschlagen ;)
Das sind coole Lösungen :-)
Hier ist mein Ansatz dazu
http://hgsweb.de/sticky/index.html
Die Quellen befinden sich unter
https://github.com/napengam/sticky
Ich hatte vor einiger Zeit ein ähnliches Bedürfnis, als ich eine Produktvergleichstabelle erstellen musste, und mir wurde klar, dass die erste Spalte immer sichtbar zu halten, auf kleinen Bildschirmen problematisch sein kann, wo nicht genügend Platz vorhanden ist. Stattdessen zog ich es vor, das Label als benutzerdefiniertes Attribut hinzuzufügen und es mit CSS attr() abzurufen. Ich verwendete jedoch auch horizontale Haftung für die Zwischenabschnitte.
Hier ist der entsprechende Pen und eine detailliertere Erklärung.
Gibt es Lösungen wie diese, die Virtualisierung für riesige Tabellen beinhalten?
Alle Browser werden th/thead sticky bis Ende des Jahres unterstützen.
„man kann tr oder thead nicht positionieren“ stimmt in Firefox/Safari nicht und ist ein crbug.com/702927 in Chrome. Die Tabellen-Überarbeitung von Chrome ist fast abgeschlossen, und damit wird der Sticky-Bug behoben.
Könnten Sie bitte den HTML-Code sowie das CSS posten?
Klicken Sie auf die Schaltfläche „View Compiled“ in der CodePen-Demo. Das kompiliert Pug zu HTML für Sie.
Haben Sie dies mit assistiven Technologien (VoiceOver, JAWS usw.) ausprobiert? Historisch gesehen haben sie kein gutes Erlebnis, wenn Sie mit CSS etwas „Aufwändiges“ an einer Tabelle machen und verwirrt werden.
Es sieht ansonsten aber nach einem großartigen Versuch aus.
Wayne, dies funktioniert in JAWS, VO und NVDA, da der Wrapper einen zugänglichen Namen & die entsprechende Rolle hat und die Tabelle keine Anzeigeeigenschaften hat, die ihre Semantik überschreiben.
TalkBack unter Android ist nicht so gut. Ich habe im Dezember einen Bug gemeldet, da diese Technik Probleme verursachen kann: TalkBack erkennt Tabellen in Elternteilen mit tabindex nicht.
Ich habe Anmerkungen zur Bildschirmleserunterstützung in meinem Beitrag Unterentwickelte responsive Tabellen, in dem die Attribute erklärt werden.
Für die Positionierung in Safari benötigen Sie möglicherweise
-webkit-stickyund die<caption>kann ebenfalls Fehlfunktionen aufweisen (stellen Sie sicher, dass Sie testen). Ich gehe detaillierter darauf ein und skizziere Workarounds in Feste Tabellenkopfzeilen.Sie könnten auch die 2. Spalte haftend machen, Sie müssen nur ihre Position von links kennen. Mit anderen Worten, Sie müssen die Größe der 1. Spalte kennen.
Ich habe benutzerdefinierte CSS-Eigenschaften für feste Spaltengrößen verwendet. Dann habe ich JS verwendet, um feste Spalten für den Benutzer vergrößerbar zu machen.
Funktioniert einwandfrei! :)
Können Sie das CSS dafür bereitstellen?
Clevere Lösung! Mein einziges Problem ist, wenn ich Zellrahmen haben möchte, habe ich im Grunde zwei Optionen: 1) border-collapse: collapse verwenden oder 2) border-collapse: separate verwenden. Im ersten Fall kann ich 1px Zellrahmen haben, aber sie verschwinden, wenn ich die Tabelle nach unten scrolle. Im zweiten Fall sind die Zellrahmen immer da, aber sie sind mindestens 2px breit. Gibt es eine Möglichkeit, dies so zu lösen, dass immer sichtbare 1px Zellrahmen um die Kopfzeilen hinweg bestehen?
Ich konnte mein Problem mit border-collapse: collapse und ein wenig Grenzentricksen lösen: https://jsfiddle.net/koldev/1kwg3arq/
Ich habe diese Tabelle und kann den Kopfzeilenbereich nicht reparieren. Könnte mir bitte jemand helfen, dieses Problem zu beheben.
Habe das Problem gefunden -> das Sticky funktioniert nicht – tbody – thead mit untenstehendem CSS.
Gibt es eine Umgehungslösung?
display: table;
table-layout: fixed;
width: 100%;
Ich habe ein paar Stunden damit verschwendet, dasselbe mit position:absolute für 2 feste Spalten links und eine feste Spalte rechts zu versuchen, wobei ich auf alle möglichen Probleme gestoßen bin (Zellen haben nicht mehr die gleiche Höhe usw.). Und alles, was es braucht, ist sticky (+ etwas Positionierung) ... DANKE!
Das Problem bei all diesen Lösungen ist, dass die horizontale Scrollleiste nicht korrekt ist. Sie erstreckt sich über die volle Breite der Tabelle, anstatt den tatsächlichen scrollbaren Bereich. Suche immer noch nach einer Lösung dafür
Haben Sie eine Lösung für die horizontale Scrollleiste gefunden?
Ich bin im selben Boot wie Sie. Haben Sie eine Lösung gefunden?
Gibt es eine Möglichkeit, den oberen Bereich festzuhalten, aber auch die linken 2 Spalten (statt nur 1 Spalte)?
Ich sage Ihnen, dass Sie, mein Herr, mein Leben gerettet haben. Vielen Dank dafür
Ist es möglich, Kopfzeilen mit „resize: horizontal“ und der fixierten ersten Spalte zu verwenden?
Tolle Implementierung. Danke.
Der
table-Selektor ist alsborder: none;undborder: 1px solid black;gestylt. Ich denke, der zweite ist unnötig und überschreibt den ersten. Außerdem verursacht er ein kleines Flimmern, wenn Sie die Tabelle horizontal scrollen. Weil dietableeinen1pxRand hat, aber derleft-Wert derths0pxist.