So erstellst du eine Tabelle in HTML
Eine Tabelle ist ein <table>-Element aus Zeilen (<tr>), und jede Zeile besteht aus Zellen: <th> für Kopfzellen und <td> für Datenzellen.
Die Tabelle hat keine eigenen Rahmen; die eine CSS-Regel fügt sie hinzu, damit du die Zellen siehst. Die Spalten ergeben sich aus den Zellen: Die erste Zelle jeder Zeile ist Spalte eins, die zweite Spalte zwei und so weiter. Jede Zeile sollte gleich viele Zellen haben. Lösch ein <td>, und diese Zeile endet zu früh und hinterlässt eine Lücke.
<th>-Zellen sind standardmäßig fett und zentriert. Das ist nur das Aussehen; entscheidend ist, dass sie Beschriftungen sind, und darum geht es im nächsten Abschnitt.
Die Tabellenelemente
| Element | Was es ist |
|---|---|
<table> | Die Tabelle |
<caption> | Der Titel der Tabelle, das erste Kind von <table> |
<thead> | Die Gruppe der Kopfzeilen |
<tbody> | Die Gruppe der Zeilen im Tabellenkörper (eine Tabelle kann mehrere haben) |
<tfoot> | Die Gruppe der Fußzeilen, etwa für Summen |
<tr> | Eine Zeile |
<th> | Eine Kopfzelle |
<td> | Eine Datenzelle |
<colgroup>, <col> | Spalten, um eine ganze Spalte zu stylen (Breiten, Hintergrund) |
Rahmen erklärt die Seite zum HTML Tabellenrahmen, und Zellen, die sich über mehrere Spalten oder Zeilen erstrecken, die Seite zu colspan und rowspan.
Kopfzellen, scope und caption
Eine Tabelle mit Überschriften oben und an der Seite muss sagen, in welche Richtung jede Überschrift zeigt. scope="col" beschriftet die Spalte darunter, scope="row" die Zeile daneben. <caption> gibt der Tabelle einen sichtbaren Titel:
Mit diesem Markup kann ein Screenreader, der zur Zelle 14:00 springt, „Saturday, Closes, 14:00“ ansagen, die Zahl wird also nie allein vorgelesen. Bei einer einfachen Tabelle mit einer Kopfzeile erkennen Browser die Überschriften meist auch ohne scope, aber es zu schreiben kostet nichts und nimmt das Raten weg.
Die caption ist auch das, was ein Screenreader ansagt, wenn er die Tabelle erreicht. Nimm sie lieber als eine Überschrift über der Tabelle, die nicht mit ihr verbunden ist.
thead, tbody und tfoot
Die drei Gruppen teilen die Zeilen in Kopf, Körper und Fuß. Der Fuß ist der Platz für Summen:
Zwei Details machen die Zahlen lesbar: text-align: end richtet die Dezimalpunkte untereinander aus (jeder Preis hat zwei Nachkommastellen), und font-variant-numeric: tabular-nums gibt jeder Ziffer dieselbe Breite.
Wenn du <tr> direkt in <table> schreibst, wie im ersten Beispiel, fügt der Browser trotzdem ein <tbody> um die Zeilen ein. Deshalb trifft ein CSS-Selektor wie table > tr nie etwas: Auf der Seite stehen die Zeilen in tbody. Nimm table tr oder schreib das <tbody> selbst.
Eine Tabelle stylen: Streifen, Hover und Breite
:nth-child färbt abwechselnde Zeilen, :hover hebt die Zeile unter dem Mauszeiger hervor, und width: 100% streckt die Tabelle über ihren Container:
text-align: start richtet den Text der Kopfzellen an den Daten darunter aus; sonst ist th zentriert. start statt left hält die Ausrichtung auch in Sprachen richtig, die von rechts nach links laufen.
Responsive Tabellen, die scrollen
Eine Tabelle kann nicht schmaler werden als ihr Inhalt. Auf einem Handy schiebt eine breite Tabelle die ganze Seite zur Seite. Setz sie stattdessen in einen Container, der scrollt:
Der Container ist hier auf 300 Pixel begrenzt, damit er sich wie ein Handybildschirm verhält; scroll ihn seitwärts. tabindex="0" lässt Tastaturnutzer den Container fokussieren und mit den Pfeiltasten scrollen, und role="region" mit einem aria-label gibt diesem Halt einen Namen.
Tabellen sind für Daten
Nimm eine Tabelle, wenn der Inhalt wirklich Zeilen und Spalten hat: Preise, Zeitpläne, Vergleiche, Ergebnisse. Nimm keine, um Dinge auf der Seite nebeneinander zu platzieren. Layout-Tabellen verwirren Screenreader, die dann Zeilen und Spalten ansagen, die nichts bedeuten, und sie können sich nicht an kleine Bildschirme anpassen. Für Layout gibt es CSS Flexbox und Grid.
Häufige Fehler
- Zeilen mit unterschiedlich vielen Zellen. Die kurzen Zeilen enden zu früh, und die Spalten stehen nicht mehr untereinander.
<td>mit fettem Text als Überschrift verwenden. Nimm<th>, damit die Überschriften echte Beschriftungen sind.- Die obsoleten Attribute
border,cellpadding,cellspacing,bgcolorundalign. Nimm stattdessen CSS. - Inhalt direkt in
<tr>oder<table>setzen, außerhalb jeder Zelle. Browser schieben ihn aus der Tabelle heraus, meistens darüber. - Eine Überschrift über der Tabelle statt einer
<caption>. table > trim CSS. Der Browser hat ein<tbody>eingefügt; schreibtable trodertbody tr.
Häufig gestellte Fragen
Wie erstelle ich eine Tabelle in HTML?
Umschließ sie mit <table>, schreib ein <tr> pro Zeile und setz die Zellen hinein: <th> für Kopfzellen und <td> für Datenzellen. Jede Zeile sollte gleich viele Zellen haben, außer einige Zellen erstrecken sich über mehrere Spalten.
Was ist der Unterschied zwischen th und td?
<th> ist eine Kopfzelle, die eine Spalte oder Zeile beschriftet, und <td> ist eine Datenzelle. Browser zeigen <th> fett und zentriert an, und Screenreader lesen vor jeder Datenzelle die passende Überschrift vor, damit die Zahlen verständlich sind.
Wofür sind thead, tbody und tfoot da?
Sie gruppieren Zeilen in Kopf, Körper und Fuß (Summen) der Tabelle. Sie machen die Struktur für Hilfstechnologien klar, geben CSS etwas zum Ansprechen, und wenn eine lange Tabelle gedruckt wird, können Browser den <thead> auf jeder Seite wiederholen.
Warum hat meine HTML-Tabelle keine Rahmen?
Tabellen haben standardmäßig keine Rahmen. Füg sie mit CSS hinzu: table { border-collapse: collapse; } th, td { border: 1px solid #ccc; }. Das alte Attribut border="1" ist obsolet.
Wie mache ich eine HTML-Tabelle responsiv?
Setz die Tabelle in einen Container mit overflow-x: auto. Auf einem schmalen Bildschirm scrollt die Tabelle dann innerhalb des Containers seitwärts, statt die ganze Seite breiter zu machen.