Barrierefreie Tabellen
Eine barrierefreie Tabelle muss nicht nur optisch verständlich sein. Auch Benutzer von
Screenreadern müssen erkennen können, welche Überschriften zu den einzelnen Datenzellen
gehören. Dafür sind eine sinnvolle Tabellenstruktur und korrekt ausgezeichnete
Überschriften entscheidend.
Semantische Tabellenstruktur
Datentabellen sollten mit den dafür vorgesehenen HTML-Elementen aufgebaut werden.
Dadurch können Browser und Hilfstechnologien die Bedeutung der einzelnen Bereiche
erkennen.
| Element |
Bedeutung |
<table> |
Umschließt die vollständige Tabelle |
<caption> |
Beschreibt Inhalt oder Zweck der Tabelle |
<thead> |
Enthält den Tabellenkopf |
<tbody> |
Enthält die eigentlichen Tabellendaten |
<tfoot> |
Enthält einen optionalen Abschluss- oder Summenbereich |
<tr> |
Erstellt eine Tabellenzeile |
<th> |
Kennzeichnet eine Überschriftszelle |
<td> |
Kennzeichnet eine gewöhnliche Datenzelle |
Merke:
Eine optisch fett dargestellte Datenzelle ist noch keine Tabellenüberschrift.
Überschriften müssen mit <th> ausgezeichnet werden.
Tabellenbeschriftung mit caption
Das Element <caption> gibt der Tabelle eine sichtbare
Beschriftung. Es steht unmittelbar nach dem öffnenden
<table>-Element.
<table>
<caption>Monatliche Kursanmeldungen 2026</caption>
<thead>
<tr>
<th scope="col">Monat</th>
<th scope="col">HTML</th>
<th scope="col">CSS</th>
</tr>
</thead>
<tbody>
<tr>
<th scope="row">Jänner</th>
<td>18</td>
<td>14</td>
</tr>
</tbody>
</table>
Eine aussagekräftige Beschriftung hilft allen Benutzern, den Zweck der Tabelle
schnell zu erfassen. Screenreader können die Beschriftung zusammen mit der Tabelle
ausgeben.
Wichtig:
Eine Überschrift vor der Tabelle ersetzt <caption> nicht
vollständig. Eine sichtbare Seitenüberschrift und eine Tabellenbeschriftung können
gemeinsam verwendet werden.
Spaltenüberschriften mit scope
Mit scope="col" wird festgelegt, dass eine Überschriftszelle für die
darunterliegenden Zellen derselben Spalte gilt.
<thead>
<tr>
<th scope="col">Produkt</th>
<th scope="col">Anzahl</th>
<th scope="col">Preis</th>
</tr>
</thead>
Ein Screenreader kann dadurch beim Lesen einer Datenzelle die zugehörige
Spaltenüberschrift nennen. Beim Wert „49,90 €“ kann beispielsweise zusätzlich
„Preis“ ausgegeben werden.
Zeilenüberschriften mit scope
Die erste Zelle einer Datenzeile enthält häufig die Bezeichnung des Datensatzes.
Wenn sie als Zeilenüberschrift dient, wird dafür
<th scope="row"> verwendet.
<tbody>
<tr>
<th scope="row">Tastatur</th>
<td>2</td>
<td>49,90 €</td>
</tr>
<tr>
<th scope="row">Maus</th>
<td>3</td>
<td>24,90 €</td>
</tr>
</tbody>
Für die Zelle mit dem Wert „2“ bestehen damit zwei Beziehungen:
Die Spaltenüberschrift lautet „Anzahl“ und die Zeilenüberschrift „Tastatur“.
Werte des scope-Attributs
| Wert |
Bedeutung |
scope="col" |
Die Überschrift gilt für eine Spalte |
scope="row" |
Die Überschrift gilt für eine Zeile |
scope="colgroup" |
Die Überschrift gilt für eine Gruppe von Spalten |
scope="rowgroup" |
Die Überschrift gilt für eine Gruppe von Zeilen |
Für einfache Tabellen reichen meistens col und row.
Die Werte colgroup und rowgroup werden bei Tabellen mit
mehrstufigen Überschriften benötigt.
Vollständiges einfaches Beispiel
<table class="kurstabelle">
<caption>Teilnehmerzahlen der EDV-Kurse</caption>
<thead>
<tr>
<th scope="col">Kurs</th>
<th scope="col">Termin</th>
<th scope="col">Teilnehmer</th>
</tr>
</thead>
<tbody>
<tr>
<th scope="row">HTML Grundlagen</th>
<td>12. September 2026</td>
<td>14</td>
</tr>
<tr>
<th scope="row">CSS Grundlagen</th>
<td>19. September 2026</td>
<td>12</td>
</tr>
<tr>
<th scope="row">Excel Grundlagen</th>
<td>26. September 2026</td>
<td>16</td>
</tr>
</tbody>
</table>
Dieses Beispiel besitzt eine Tabellenbeschriftung, eindeutige
Spaltenüberschriften und eine Überschrift für jede Datenzeile. Für eine einfache
Datentabelle ist damit bereits eine gute barrierefreie Grundstruktur vorhanden.
Tabellen nicht für das Seitenlayout verwenden
Tabellen sind für Daten vorgesehen, die in Zeilen und Spalten zueinander in
Beziehung stehen. Sie sollten nicht verwendet werden, um Bereiche einer Webseite
nebeneinander anzuordnen.
<!-- Nicht für das Seitenlayout verwenden -->
<table>
<tr>
<td>Navigation</td>
<td>Hauptinhalt</td>
</tr>
</table>
Für das Seitenlayout stehen mit CSS Flexbox und CSS Grid wesentlich besser
geeignete Techniken zur Verfügung.
Merke:
Eine HTML-Tabelle ist richtig, wenn die Inhalte sinnvoll über Zeilen- und
Spaltenüberschriften beschrieben werden können.
Komplexe Tabellen barrierefrei aufbauen
Bei einfachen Tabellen können Datenzellen meist eindeutig über
scope="col" und scope="row" zugeordnet werden. Tabellen mit
mehreren Überschriftsebenen benötigen dagegen eine genauere Struktur.
Mehrstufige Spaltenüberschriften
In der folgenden Tabelle werden die Spalten „HTML“ und „CSS“ unter der gemeinsamen
Überschrift „Webdesign“ zusammengefasst. Die Spalten „Word“ und „Excel“ gehören zur
Gruppe „Microsoft 365“.
<table>
<caption>Teilnehmerzahlen nach Kursbereich</caption>
<thead>
<tr>
<td></td>
<th colspan="2" scope="colgroup">Webdesign</th>
<th colspan="2" scope="colgroup">Microsoft 365</th>
</tr>
<tr>
<th scope="col">Monat</th>
<th scope="col">HTML</th>
<th scope="col">CSS</th>
<th scope="col">Word</th>
<th scope="col">Excel</th>
</tr>
</thead>
<tbody>
<tr>
<th scope="row">Jänner</th>
<td>18</td>
<td>14</td>
<td>12</td>
<td>20</td>
</tr>
<tr>
<th scope="row">Februar</th>
<td>16</td>
<td>15</td>
<td>10</td>
<td>22</td>
</tr>
</tbody>
</table>
colspan="2" verbindet jeweils zwei Zellen. Mit
scope="colgroup" wird angegeben, dass die Überschrift für diese
Spaltengruppe gilt.
Merke:
colspan bestimmt die optische Ausdehnung einer Zelle.
scope="colgroup" beschreibt ihre inhaltliche Beziehung zu einer
Spaltengruppe.
Mehrstufige Zeilenüberschriften
Auch mehrere Zeilen können zu einer gemeinsamen Gruppe gehören. Dafür werden
rowspan und scope="rowgroup" verwendet.
<table>
<caption>Kurstermine nach Themenbereich</caption>
<thead>
<tr>
<th scope="col">Bereich</th>
<th scope="col">Kurs</th>
<th scope="col">Termin</th>
</tr>
</thead>
<tbody>
<tr>
<th rowspan="2" scope="rowgroup">Webdesign</th>
<th scope="row">HTML Grundlagen</th>
<td>12. September 2026</td>
</tr>
<tr>
<th scope="row">CSS Grundlagen</th>
<td>19. September 2026</td>
</tr>
</tbody>
<tbody>
<tr>
<th rowspan="2" scope="rowgroup">Microsoft 365</th>
<th scope="row">Word Grundlagen</th>
<td>26. September 2026</td>
</tr>
<tr>
<th scope="row">Excel Grundlagen</th>
<td>3. Oktober 2026</td>
</tr>
</tbody>
</table>
Die beiden Themenbereiche werden jeweils in einem eigenen
<tbody>-Element zusammengefasst. Die Zelle mit
scope="rowgroup" beschreibt die zugehörige Gruppe von Zeilen.
Komplexe Tabellen möglichst vereinfachen
Eine technisch korrekte Tabelle kann trotzdem schwer verständlich sein. Sehr viele
Überschriftsebenen, verbundene Zellen und unterschiedliche Zellbeziehungen erschweren
die Orientierung für alle Benutzer.
Häufig ist es besser, eine große Tabelle in mehrere kleinere Tabellen aufzuteilen.
Jede Tabelle erhält dabei eine eigene, aussagekräftige Beschriftung.
Empfehlung:
Verwende zuerst eine einfache Tabellenstruktur mit
caption, th und scope. Erweitere sie nur,
wenn die darzustellenden Daten tatsächlich komplexere Beziehungen benötigen.
Barrierefreiheit von Tabellen prüfen
Eine korrekte HTML-Struktur ist die wichtigste Grundlage für barrierefreie Tabellen.
Zusätzlich sollte geprüft werden, ob die Tabelle verständlich aufgebaut, mit der Tastatur
bedienbar und auch bei starker Vergrößerung vollständig nutzbar ist.
Tabelleninhalt verständlich prüfen
Bereits vor der technischen Prüfung sollte kontrolliert werden, ob Aufbau und Inhalt der
Tabelle leicht verständlich sind.
- Besitzt die Tabelle eine aussagekräftige Beschriftung?
- Sind Spalten- und Zeilenüberschriften eindeutig formuliert?
- Ist die Reihenfolge der Spalten logisch?
- Sind Abkürzungen und Maßeinheiten verständlich?
- Kann eine sehr große Tabelle in kleinere Tabellen aufgeteilt werden?
Merke:
Barrierefreiheit beginnt nicht erst bei den HTML-Attributen. Eine übersichtliche und
verständliche Darstellung hilft allen Benutzern.
HTML-Struktur prüfen
Im Quellcode sollte kontrolliert werden, ob die vorgesehenen Tabellenelemente entsprechend
ihrer Bedeutung verwendet wurden.
| Prüfpunkt |
Anforderung |
| Tabellenbeschriftung |
<caption> beschreibt den Inhalt der Tabelle |
| Spaltenüberschriften |
Werden mit <th scope="col"> ausgezeichnet |
| Zeilenüberschriften |
Werden bei Bedarf mit <th scope="row"> ausgezeichnet |
| Datenzellen |
Werden mit <td> ausgezeichnet |
| Tabellenbereiche |
Werden sinnvoll mit <thead>, <tbody> und
gegebenenfalls <tfoot> gegliedert
|
| Komplexe Beziehungen |
Werden mit scope oder bei Bedarf mit
headers und id beschrieben
|
Wichtig:
Überschriften dürfen nicht nur durch Fettschrift oder eine Hintergrundfarbe dargestellt
werden. Ihre Bedeutung muss durch das Element <th> im HTML-Code
festgelegt sein.
Tastaturbedienung prüfen
Gewöhnliche Tabellenzellen sind nicht interaktiv und müssen deshalb nicht mit der
Tabulatortaste erreichbar sein. Enthält die Tabelle jedoch Links, Schaltflächen,
Kontrollkästchen oder andere Bedienelemente, müssen diese vollständig mit der Tastatur
bedienbar sein.
<table>
<caption>Verfügbare Kursunterlagen</caption>
<thead>
<tr>
<th scope="col">Kurs</th>
<th scope="col">Datei</th>
</tr>
</thead>
<tbody>
<tr>
<th scope="row">HTML Grundlagen</th>
<td>
<a href="html-grundlagen.pdf">PDF herunterladen</a>
</td>
</tr>
</tbody>
</table>
Beim Prüfen mit der Tabulatortaste muss der Link erreichbar sein. Außerdem muss deutlich
sichtbar sein, wenn er den Tastaturfokus besitzt.
table a:focus-visible {
outline: 3px solid #0d6efd;
outline-offset: 3px;
}
Hinweis:
Verwende kein tabindex="0" für jede einzelne Tabellenzelle. Dadurch würde die
Bedienung unnötig erschwert und die Reihenfolge der Tastaturfokussierung stark verlängert.
Scrollbare Tabellen prüfen
Breite Tabellen werden auf kleinen Bildschirmen häufig in einem horizontal scrollbaren
Container dargestellt. Dabei muss geprüft werden, ob alle Spalten erreichbar bleiben.
<div
class="table-scroll"
tabindex="0"
role="region"
aria-label="Teilnehmerzahlen nach Kursbereich"
>
<table>
...
</table>
</div>
Der Scrollbereich sollte mit der Tastatur erreichbar sein und einen sichtbaren Fokusrahmen
erhalten.
.table-scroll {
max-width: 100%;
overflow-x: auto;
}
.table-scroll:focus-visible {
outline: 3px solid #0d6efd;
outline-offset: 2px;
}
Bei der Prüfung sollte die Browserbreite verkleinert werden. Anschließend wird kontrolliert,
ob die letzte Spalte ohne Verlust von Informationen erreicht werden kann.
Zoom und Vergrößerung prüfen
Tabellen sollten auch bei einer starken Vergrößerung der Webseite lesbar und bedienbar
bleiben. Eine sinnvolle Prüfung erfolgt beispielsweise mit einem Browserzoom von
200 % und 400 %.
- Werden keine Tabelleninhalte abgeschnitten?
- Bleiben Überschriften und Daten vollständig lesbar?
- Kann eine breite Tabelle horizontal verschoben werden?
- Überdecken sich Texte und Bedienelemente nicht?
- Bleiben Links und Schaltflächen erreichbar?
Wichtig:
Feste Höhen können bei vergrößertem Text dazu führen, dass Inhalte abgeschnitten werden.
Für Tabellenzeilen sollte deshalb normalerweise keine feste
height festgelegt werden.
/* Problematisch bei vergrößertem Text */
td {
height: 40px;
overflow: hidden;
}
Farben und Kontraste prüfen
Text, Rahmen, Fokusmarkierungen und wichtige Hervorhebungen müssen sich deutlich vom
Hintergrund unterscheiden. Informationen dürfen außerdem nicht ausschließlich durch eine
Farbe vermittelt werden.
<td>
<span class="status status-erfolgreich">
Erfolgreich
</span>
</td>
.status-erfolgreich {
color: #146c43;
font-weight: bold;
}
.status-erfolgreich::before {
content: "✓ ";
}
Der Status wird nicht nur grün dargestellt, sondern zusätzlich durch Text und ein Symbol
gekennzeichnet. Dadurch bleibt seine Bedeutung auch erkennbar, wenn Farben nicht oder nur
eingeschränkt wahrgenommen werden.
Merke:
Eine farbige Tabellenzeile allein reicht nicht aus, um beispielsweise einen Fehler, eine
Warnung oder einen erfolgreichen Vorgang eindeutig zu kennzeichnen.
Prüfung mit einem Screenreader
Bei wichtigen Tabellen sollte zusätzlich eine Prüfung mit einem Screenreader erfolgen.
Unter Windows kann dafür beispielsweise der integrierte Screenreader Narrator verwendet
werden.
Bei der Prüfung sollte kontrolliert werden:
- Wird die Tabellenbeschriftung ausgegeben?
- Wird die Anzahl der Zeilen und Spalten sinnvoll erkannt?
- Werden beim Wechsel zwischen Datenzellen die zugehörigen Überschriften genannt?
- Werden mehrstufige Überschriften korrekt zugeordnet?
- Sind Links und andere Bedienelemente verständlich beschriftet?
Wichtig:
Das Aussehen einer Tabelle allein zeigt nicht, ob sie für einen Screenreader verständlich
ist. Entscheidend sind die semantische Struktur und die Beziehungen zwischen den
Überschriften und Datenzellen.
Automatische Prüfwerkzeuge
Browser-Erweiterungen und Entwicklungswerkzeuge können einige Probleme automatisch
erkennen. Sie weisen beispielsweise auf fehlende Beschriftungen, ungültige Attribute oder
unzureichende Farbkontraste hin.
Eine automatische Prüfung kann jedoch nicht zuverlässig beurteilen, ob eine
Tabellenbeschriftung verständlich ist oder ob die Zuordnung der Überschriften inhaltlich
sinnvoll gewählt wurde.
Empfehlung:
Kombiniere automatische Prüfungen immer mit einer manuellen Kontrolle des HTML-Codes,
einem Tastaturtest und bei wichtigen Tabellen einer Screenreader-Prüfung.
Checkliste für barrierefreie Tabellen
| Prüfpunkt |
Erledigt |
| Die Tabelle stellt echte tabellarische Daten dar |
□ |
| Eine verständliche Tabellenbeschriftung ist vorhanden |
□ |
Überschriften sind mit <th> ausgezeichnet |
□ |
scope beschreibt Spalten- und Zeilenbeziehungen |
□ |
| Komplexe Überschriften sind eindeutig zugeordnet |
□ |
| Die Tabelle bleibt bei Vergrößerung vollständig nutzbar |
□ |
| Breite Tabellen können horizontal verschoben werden |
□ |
| Interaktive Elemente sind mit der Tastatur erreichbar |
□ |
| Fokusmarkierungen sind deutlich sichtbar |
□ |
| Informationen werden nicht ausschließlich durch Farben vermittelt |
□ |