HTML Tabellen
Tabellen helfen dir, Daten strukturiert und übersichtlich darzustellen. In diesem Cheatsheet siehst du, wie sie aufgebaut sind, welche Elemente es gibt und wann welche Variante sinnvoll ist.
Tabellen strukturieren Daten in Zeilen und Spalten: Grundaufbau mit table, thead, tbody, Zellen verbinden mit colspan und rowspan, und barrierefreie Tabellen mit scope.
Was sind HTML-Tabellen?
HTML-Tabellen
<table>
dienen dazu, Inhalte in Zeilen und Spalten zu organisieren. Sie eignen sich besonders für
strukturierte Daten wie Preislisten, Kalender, Vergleichstabellen oder Statistikdaten. Sie
sind nicht für Layouts gedacht - dafür verwendet man heutzutage CSS.
-
Tabellen gliedern Inhalte in Zeilen
<tr>und Spalten<td>oder<th>. -
Überschriften in Tabellen werden mit
<th>ausgezeichnet, normale Inhalte mit<td>. -
Für semantische Struktur gibt es optionale Abschnitte:
<thead>,<tbody>,<tfoot>.
Grundaufbau einer Tabelle
Eine einfache Tabelle besteht aus Kopfzeile, Körper und optional einer Fußzeile:
<table>
<thead>
<tr>
<th>Name</th>
<th>Art</th>
</tr>
</thead>
<tbody>
<tr>
<td>Leo</td>
<td>Kater</td>
</tr>
<tr>
<td>Irmchen</td>
<td>Katze</td>
</tr>
</tbody>
</table>
| Name | Art |
|---|---|
| Leo | Kater |
| Irmchen | Katze |
So hast du Kopf, Körper und Inhalte sauber getrennt. Das erleichtert Styling und semantische Auszeichnung.
Arten von Tabellen
-
Einfach:
nur
<table>mit<tr>und<td>. -
Mit Kopfzeile:
zusätzlich
<thead>für Überschriften. -
Mit Fußzeile:
<tfoot>für Summen, Hinweise oder Quellenangaben. - Verschachtelte Tabellen: Tabellen innerhalb von Zellen - selten, nur bei komplexen Daten nötig.
Zellen verbinden mit colspan und rowspan
Manchmal müssen Zellen über mehrere Spalten oder Zeilen gehen - etwa für Überschriften,
Zusammenfassungen oder komplexe Datenstrukturen. Dafür gibt es
colspan
und
rowspan
.
colspan - Spalten horizontal zusammenführen
Mit
colspan
erstreckt sich eine Zelle über mehrere
Spalten
(waagerecht):
<!-- Eine Zelle über 3 Spalten -->
<td colspan="3">Diese Zelle geht über 3 Spalten</td>
Visualisiert:
Normal (3 separate Zellen):
[ Spalte 1 ] [ Spalte 2 ] [ Spalte 3 ]
Mit colspan="3" (1 Zelle über alle 3 Spalten):
[ Eine Zelle über 3 Spalten ]
Typische Anwendungen:
- Abschnittsüberschriften über die ganze Tabellenbreite
- Zusammenfassungen oder Fußzeilen
- Wenn eine Zeile weniger Zellen braucht als andere
rowspan - Zeilen vertikal zusammenführen
Mit
rowspan
erstreckt sich eine Zelle über mehrere
Zeilen
(senkrecht):
<!-- Eine Zelle über 3 Zeilen -->
<td rowspan="3">Diese Zelle geht über 3 Zeilen</td>
Visualisiert:
Mit rowspan="3" (linke Zelle über 3 Zeilen):
[ Links: 3 Zeilen ] [ Rechts Zeile 1 ]
[ zusammen ] [ Rechts Zeile 2 ]
[ ] [ Rechts Zeile 3 ]
Typische Anwendungen:
- Kategorien, die mehrere Unterpunkte abdecken
- Zeiträume mit mehreren zugehörigen Einträgen
- Gruppierungen in der ersten Spalte
- col span = col umns = Spalten = waagerecht →
- row span = row s = Zeilen = senkrecht ↓
Praktische Beispiele
Beispiel 1: Lebenslauf-Eintrag
Links ein Zeitraum (über 2 Zeilen), rechts Titel und Details:
| 09/2008 - 06/2015 | Abitur |
| Mustergymnasium, Musterstadt, Abschlussnote: 1,0 |
<table>
<tbody>
<tr>
<td rowspan="2">09/2008 - 06/2015</td>
<td><strong>Abitur</strong></td>
</tr>
<tr>
<!-- Keine erste Zelle! rowspan füllt sie -->
<td>Mustergymnasium, Musterstadt, Abschlussnote: 1,0</td>
</tr>
</tbody>
</table>
Bei
rowspan
hat die
folgende Zeile eine Zelle weniger
! Die Zelle mit rowspan "blockiert" den Platz bereits.
Beispiel 2: Fußzeile mit colspan
Im
<tfoot>
sollen Kontaktdaten über die gesamte Tabellenbreite gehen:
| Zeitraum | Position | Unternehmen |
|---|---|---|
| 2020 - heute | Frontend Developer | Web Agency GmbH |
| Musterstadt, 01.01.2025 | ||
| Max Mustermann | ||
| Tel: 01234 456789 · max@beispiel.de | ||
<table>
<thead>
<tr>
<th>Zeitraum</th>
<th>Position</th>
<th>Unternehmen</th>
</tr>
</thead>
<tbody>
<tr>
<td>2020 - heute</td>
<td>Frontend Developer</td>
<td>Web Agency GmbH</td>
</tr>
</tbody>
<tfoot>
<tr>
<td colspan="3">Musterstadt, 01.01.2025</td>
</tr>
<tr>
<td colspan="3">Max Mustermann</td>
</tr>
<tr>
<td colspan="3">
Tel: 01234 456789 · max@beispiel.de
</td>
</tr>
</tfoot>
</table>
Beispiel 3: colspan und rowspan kombiniert
Eine komplexere Tabelle mit beiden Attributen:
| Kategorie | Produkt | Preis |
|---|---|---|
| Obst | Äpfel | 2,50 € |
| Bananen | 1,80 € | |
| Gemüse | Tomaten | 3,20 € |
| Gurken | 1,50 € | |
| Gesamt | 9,00 € | |
<table>
<thead>
<tr>
<th>Kategorie</th>
<th>Produkt</th>
<th>Preis</th>
</tr>
</thead>
<tbody>
<tr>
<td rowspan="2">Obst</td>
<td>Äpfel</td>
<td>2,50 €</td>
</tr>
<tr>
<!-- Keine Kategorie-Zelle! -->
<td>Bananen</td>
<td>1,80 €</td>
</tr>
<tr>
<td rowspan="2">Gemüse</td>
<td>Tomaten</td>
<td>3,20 €</td>
</tr>
<tr>
<td>Gurken</td>
<td>1,50 €</td>
</tr>
<tr>
<td colspan="2"><strong>Gesamt</strong></td>
<td><strong>9,00 €</strong></td>
</tr>
</tbody>
</table>
<scope> für Browser und Screenreader
Das
scope
-Attribut bei Tabellenüberschriften
<th>
hilft Browsern und Screenreadern, den Kontext der Zellen zu verstehen. So wird deutlich, ob
eine Überschrift für eine Spalte oder eine Zeile gilt.
<table>
<thead>
<tr>
<th scope="col">Name</th>
<th scope="col">Alter</th>
</tr>
</thead>
<tbody>
<tr>
<th scope="row">Leo</th>
<td>13</td>
</tr>
<tr>
<th scope="row">Irmchen</th>
<td>18</td>
</tr>
</tbody>
</table>
-
scope="col"- die Überschrift gehört zur gesamten Spalte. -
scope="row"- die Überschrift gehört zur gesamten Zeile. - Verbessert Barrierefreiheit und macht große Tabellen leichter verständlich.
Best Practices für Tabellen
- Verwende Tabellen nur für strukturierte Daten , nicht für Layout.
-
Trenne Kopf-, Körper- und Fußbereich mit
<thead>,<tbody>und<tfoot>. -
Nutze
<th>für Spaltenüberschriften - das hilft der Barrierefreiheit und Screenreadern. - Halte Zelleninhalte kurz und übersichtlich.
-
Optional: Verwende
scope="col"oderscope="row"für zusätzliche Semantik.
Tabellen können mit CSS gestylt werden: Farben, Abstände, Rahmen. Aber der semantische Aufbau bleibt immer wichtig, damit Daten korrekt interpretiert werden - z. B. von Screenreadern oder Exportfunktionen.
Responsive Tabellen
Tabellen sind von Natur aus nicht responsiv - auf kleinen Bildschirmen werden sie oft abgeschnitten oder erfordern horizontales Scrollen. Hier sind praktische Lösungen:
Lösung 1: Horizontales Scrollen
Die einfachste Methode - die Tabelle wird in einen scrollbaren Container gepackt:
<div class="table-wrapper">
<table>
<!-- Tabelleninhalt -->
</table>
</div>
<style>
.table-wrapper {
overflow-x: auto;
-webkit-overflow-scrolling: touch; /* Smooth Scroll auf iOS */
}
.table-wrapper table {
min-width: 600px; /* Mindestbreite der Tabelle */
}
</style>
Lösung 2: Tabelle auf Mobile stapeln
Auf kleinen Bildschirmen wird jede Zeile zu einem eigenen Block:
@media (max-width: 600px) {
table, thead, tbody, th, td, tr {
display: block;
}
/* Kopfzeile verstecken */
thead {
display: none;
}
/* Jede Zeile als Card */
tr {
margin-bottom: 1rem;
border: 1px solid #ddd;
border-radius: 4px;
}
/* Label vor jeder Zelle */
td::before {
content: attr(data-label);
font-weight: bold;
display: block;
margin-bottom: 0.25rem;
}
td {
padding: 0.5rem;
border: none;
border-bottom: 1px solid #eee;
}
}
Dazu brauchst du
data-label
Attribute im HTML:
<tr>
<td data-label="Name">Leo</td>
<td data-label="Art">Kater</td>
<td data-label="Alter">13 Jahre</td>
</tr>
Für einfache Tabellen reicht oft das horizontale Scrollen. Die Stapel-Methode lohnt sich bei komplexeren Daten, wo der Kontext wichtig ist.
Häufige Fehler bei Tabellen
- Tabellen für Layouts verwenden
-
<th>vergessen - nur<td>für alles - Bei rowspan: Zellen in Folgezeilen nicht weglassen
- colspan/rowspan-Werte falsch zählen
-
Leere Zellen ohne
<td></td> - Verschachtelte Tabellen ohne guten Grund
- Tabellen nur für tabellarische Daten
-
<th>für Überschriften,<td>für Daten - Bei rowspan="2" → nächste Zeile hat 1 Zelle weniger
- Spalten/Zeilen vor dem Coden skizzieren
-
Leere Zellen:
<td></td>oder<td>-</td> -
scopefür Barrierefreiheit nutzen
Teste es selbst
Wende das Gelernte direkt an - probiere den Code aus dem Tutorial aus oder experimentiere mit eigenen Ideen.
Editor öffnen
Mehr aus HTML
Tutorials werden geladen...