Wie erstellt man eine tabellenähnliche Benutzeroberfläche, die ohne JavaScript responsive ist? Das ist die Frage, die ich mir die ganze Woche gestellt habe, während ich an einem neuen Projekt gearbeitet und versucht habe, die einfachste mögliche Tabelle zu erstellen. Ich wollte kein Framework verwenden und stattdessen mit einigen neuen Eigenschaften experimentieren, um nur mit einem leichten Touch von CSS auszukommen.
Spoiler! Das ist es, was ich bisher zustande gebracht habe (und bitte beachten Sie, dass diese Demo derzeit in der neuesten Version von Chrome funktioniert). Versuchen Sie, ein wenig herumzuscrollen
Siehe den Pen Eine einfache responsive Tabelle – Final von Robin Rendle (@robinrendle) auf CodePen.
Bemerken Sie, wie die erste Spalte links klebt und die Kopfzeile am oberen Rand der Tabelle haftet? Das ermöglicht es uns, viele Daten zu überfliegen, ohne ständig scrollen zu müssen, um herauszufinden, in welcher Spalte oder Zeile wir uns befinden – in vielen Benutzeroberflächen dieser Art kann man sich leicht verirren.
Wie bin ich also vorgegangen, um dieses Ding zu machen? Tauchen wir ein!
Hinzufügen des Markup
Zuerst müssen wir unser Markup für die Tabelle hinzufügen, und um sicherzustellen, dass dieses Beispiel so realistisch wie möglich ist, werden wir hier viele Zeilen und Spalten hinzufügen
Siehe den Pen Eine einfache responsive Tabelle – 1. von Robin Rendle (@robinrendle) auf CodePen.
Es passiert nichts wirklich Kompliziertes. Wir haben nur eine ganz normale Tabelle mit einem <thead> und einem <tbody>, aber wir verpacken die gesamte Tabelle in die table-wrapper Div, was ich gleich erklären werde.
Als Nächstes fügen wir dem Wrapper-Element grundlegende Stile hinzu, um es in die Mitte der Seite zu bewegen und ihm eine maximale Breite zu geben. Wir müssen auch sicherstellen, dass die .table-wrapper eine Überlauf-Einstellung von scroll hat, obwohl wir das bei größeren Bildschirmgrößen noch nicht brauchen werden
body {
display: flex;
font-family: -apple-system;
font-size: 90%;
color: #333;
justify-content: center;
}
.table-wrapper {
max-width: 700px;
overflow: scroll;
}
Siehe den Pen Eine einfache responsive Tabelle – 2. von Robin Rendle (@robinrendle) auf CodePen.
Klasse! Jetzt können wir Stile für die erste Spalte unserer Tabelle und das thead-Element hinzufügen, sowie grundlegende Stile für jede der Tabellenzellen
table {
border: 1px solid #ddd;
border-collapse: collapse;
}
td, th {
white-space: nowrap;
border: 1px solid #ddd;
padding: 20px;
}
Siehe den Pen Eine einfache responsive Tabelle – 3 von Robin Rendle (@robinrendle) auf CodePen.
Das Problem hier ist, dass wir nun eine ziemlich unzugängliche Tabelle erstellt haben; obwohl wir in der Tabelle scrollen können, können wir nicht ablesen, welche Spalte oder Zeile mit welchem Datenpunkt verbunden ist. Dies kann zu einer Tabelle führen, die fast vollständig unleserlich ist, und wenn wir sie mit echten Daten füllen würden, wäre es noch schlimmer.

position: sticky zur Rettung!
position: sticky ist ein wunderbar praktischer CSS-Trick, mit dem ich in letzter Zeit viel experimentiere. Er ermöglicht es Ihnen, Kindelemente an ihren übergeordneten Containern zu fixieren, sodass das Kindelement beim Scrollen immer sichtbar ist. Und genau das brauchen wir hier für die erste Spalte und die Kopfzeile unseres Tabellenelements.
Wir können diese relativ neue Funktion mit CSS wie folgt verwenden
// The heading of our table
th {
background-color: #eee;
position: sticky;
top: -1px;
z-index: 2;
// The first cell that lives in the top left of our spreadsheet
&:first-of-type {
left: 0;
z-index: 3;
}
}
// The first column that we want to stick to the left
tbody tr td:first-of-type {
background-color: #eee;
position: sticky;
left: -1px;
z-index: 1;
}
Die z-index-Werte sind hier wichtig, da wir möchten, dass die Kopfzeile die erste linke Spalte überlagert, die ebenfalls sticky sein wird. Aber! Wir möchten auch, dass die leere Zelle oben links sowohl unsere Kopfzeile als auch unsere linke Spalte überlagert, wie hier
Siehe den Pen Eine einfache responsive Tabelle – Final von Robin Rendle (@robinrendle) auf CodePen.
Aber da haben wir es! Eine einfache responsive Tabelle, in der Sie sowohl die Kopfzeile als auch die erste Spalte sehen können, egal wo Sie sich in der Tabelle befinden. Es ist jedoch erwähnenswert, dass Ihre Erfahrungen variieren können. position: sticky hat derzeit eine eher lückenhafte Unterstützung, daher lohnt es sich, sie gründlich zu testen, bevor Sie sie verwenden. Oder Sie könnten etwas wie Stickybits verwenden, das als leichtgewichtiger Polyfill fungiert.
Wenn Sie sich außerdem tiefer mit Tabellen befassen müssen, haben wir einen sehr nützlichen vollständigen Leitfaden zum Table-Element erstellt.
Leider funktioniert das nicht in Firefox. Ich habe ein ähnliches Beispiel in Javascript mit
transformgemacht – https://codepen.io/monochromer/pen/YyydwyIch benutze position: absolute;, um eine Tabellenspalte zu fixieren.
Ich suche schon so lange danach! Ich erstelle viele Event-Websites und das ist perfekt für deren Zeitpläne.
Ich kann es kaum erwarten, damit zu spielen!
Das ist cool, aber es gibt eine kleine Anpassung, die Leute übersehen: Es ist völlig gültig (und angemessen),
<th>in<tbody>zu verwenden. Das ist gut für Zellen, die die Zeile beschriften, wie die erste Spalte Ihrer Beispiele. Sie möchten angeben, dass es sich auf die Zeile und nicht auf die Spalte bezieht, also fügen Sie dasscope="row"-Attribut hinzu (z. B.<th scope="row">Anna</th>). Das Schöne ist, dass Sie einen Großteil der vorhandenenth-Stile wiederverwenden können, die Sie bereits haben.Oh, das ist großartig! Danke, Mark – ich hatte keine Ahnung, dass man das tun kann.
Firefox-Bug: https://bugzilla.mozilla.org/show_bug.cgi?id=975644
Sie sind fast fertig damit,
stickyfür<th>zum Laufen zu bringen