Barrierefreie Datentabellen: Kopfzeilen korrekt zuordnen
Tabellen ohne zugeordnete Kopfzeilen sind für Screenreader nicht mehr nachvollziehbar. So verknüpfen Sie th- und td-Zellen mit dem scope-Attribut korrekt.
Inhaltsverzeichnis
In großen Tabellen sind einzelne Werte keiner Überschrift zugeordnet. Vorlese-Software kann dann nicht ansagen, wofür ein Wert steht. EverAudit prüft Datentabellen gegen WCAG 1.3.1 (Info and Relationships) und meldet fehlende oder fehlerhafte Header-Zuordnungen als Befund.
Was ist das Problem?#
Eine Datentabelle braucht mehr als nur eine optisch tabellarische Anordnung — Screenreader müssen technisch nachvollziehen können, welche Kopfzeile zu welcher Datenzelle gehört. Das geschieht über <th>-Elemente mit einem korrekt gesetzten scope-Attribut (col für Spalten, row für Zeilen). Fehlt diese Zuordnung, liest ein Screenreader die Zelleninhalte isoliert vor — ohne den Kontext, welche Spalte oder Zeile gerade gemeint ist.
Drei verwandte Fehler fasst diese Kategorie zusammen: fehlende Zuordnung einer Datenzelle zu einer Überschrift (td-has-header), eine Kopfzelle ohne zugehörige Datenzellen (th-has-data-cells), und ein ungültig gesetztes scope-Attribut (scope-attr-valid).
Warum prüft EverAudit das?#
Diese Regelfamilie wird als prio2-Befund geführt: Sie betrifft primär komplexere Tabellen mit mehreren Spalten oder Zeilen — bei einer einfachen Zwei-Spalten-Tabelle ist der Effekt geringer als bei einer umfangreichen Preisvergleichs- oder Datenübersichtstabelle, wo die korrekte Zuordnung für das Verständnis entscheidend ist. EverAudit meldet den Fehler, weil er in Content-getriebenen Websites (CMS-Freitextfeld mit eingefügter Tabelle) besonders häufig auftritt.
Welche Auswirkung hat das?#
Nutzer von Vorlese-Software können die Werte in Ihren Tabellen nicht einordnen — bei einer Preistabelle etwa nicht mehr zuordnen, welcher Preis zu welcher Leistung und welchem Zeitraum gehört. Gerade bei Tabellen mit vielen Zeilen und Spalten — Vergleichstabellen, Datenblätter, Kursübersichten — macht das den Inhalt für Screenreader-Nutzer faktisch unbrauchbar, obwohl die Information selbst vorhanden ist.
Wie beheben Sie fehlerhafte Tabellen-Zuordnungen?#
Nutzen Sie echte <th>-Elemente mit scope statt gestylter <td>-Zellen:
<!-- fehlerhaft: Kopfzeile ohne scope, evtl. sogar als <td> ausgezeichnet -->
<table>
<tr>
<td>Produkt</td>
<td>Preis</td>
</tr>
<tr>
<td>Bürostuhl</td>
<td>249 €</td>
</tr>
</table>
<!-- korrigiert: echte th-Kopfzellen mit scope -->
<table>
<tr>
<th scope="col">Produkt</th>
<th scope="col">Preis</th>
</tr>
<tr>
<th scope="row">Bürostuhl</th>
<td>249 €</td>
</tr>
</table>
Bei komplexeren Tabellen mit mehrstufigen Kopfzeilen zusätzlich das headers-Attribut nutzen, um Datenzellen explizit mit den passenden ids der Kopfzellen zu verknüpfen.
Konkretes Vorgehen:
- CMS-Tabellen-Editor prüfen — die meisten Redaktionssysteme bieten eine Option „erste Zeile als Kopfzeile", die intern
<th>statt<td>rendert. scope="col"/scope="row"konsequent setzen — nicht nur<th>verwenden, sondern die Ausrichtung explizit angeben.- Nur gültige Werte verwenden —
col,row,colgroup,rowgroup; keine anderen Strings. - Layout-Tabellen vermeiden — Tabellen ausschließlich für tatsächliche Daten nutzen, Layout über CSS lösen.
- Bei sehr komplexen Tabellen das
headers-Attribut für explizite Zell-zu-Kopf-Zuordnung erwägen.
Fazit#
Eine barrierefreie Tabelle unterscheidet sich vom sichtbaren Ergebnis oft kaum von einer gewöhnlichen Tabelle — der entscheidende Unterschied liegt im Markup: echte <th>-Elemente mit korrektem scope-Attribut statt rein visuell gestylter Zellen. Das lohnt sich besonders bei umfangreichen Vergleichs- und Datentabellen.
Häufige Fragen
Warum reicht es nicht, eine Tabelle nur optisch wie eine Tabelle aussehen zu lassen?
Screenreader lesen Tabellen zellenweise vor und müssen dafür wissen, zu welcher Spalten- oder Zeilenüberschrift eine Zelle gehört. Diese Zuordnung entsteht ausschließlich durch echtes Tabellen-Markup (<table>, <th>, scope) — rein visuell mit CSS nachgebaute Tabellen liefern diese Information nicht.
Was bedeutet das scope-Attribut an einer th-Zelle?
scope="col" markiert eine Kopfzelle als Überschrift für eine ganze Spalte, scope="row" als Überschrift für eine ganze Zeile. Ein Screenreader liest dann bei jeder Datenzelle automatisch die passende Spalten- und Zeilenüberschrift mit vor.
Wann brauche ich komplexere Header-Zuordnung als scope?
Bei sehr komplexen Tabellen mit mehrstufigen Kopfzeilen reicht scope oft nicht aus — dort verknüpft man jede <td> explizit über das headers-Attribut mit den IDs der zugehörigen <th>-Zellen. Für die meisten einfachen Tabellen genügt scope.
Sollte ich Tabellen für reines Layout verwenden?
Nein. Tabellen sollten ausschließlich für tabellarische Daten genutzt werden. Für Layout-Zwecke sind CSS Grid oder Flexbox die korrekte Wahl — eine Layout-Tabelle verwirrt Screenreader, die versuchen, sie als Datentabelle mit Zeilen und Spalten vorzulesen.
EverAudit Redaktion
Fachredaktion für Web-Qualität, Barrierefreiheit und DSGVO. Wir prüfen jeden Ratgeber gegen die Kriterien unserer Audit-Engine.