Was in einer Tabelle steckt

veröffentlicht in

Die th- und td-Elemente

Datentabellen bestehen aus Tabellenreihen, die aus der gleichen Zahl an Zellen bestehen müssen. Dabei können sich Zellen mit den colspan- und rowspan-Attributen über mehr als eine Spalte beziehungsweise mehr als eine Reihe erstrecken und müssen dann entsprechend oft gezählt werden. Die Anordnung der Zellen bildet ein Gitter.

Für die Reihen und Zellen werden folgende Elemente benötigt:

Screenreader und Tabellen

Wenn Datenzellen und Kopfzellen nicht voneinander unterschieden werden, stehen Nutzende von Screenreadern vor Probleme. In Tabellen navigieren Nutzende von Screenreadern grundsätzlich von Zelle zu Zelle. Während sehende Nutzende die Kopfzellen mit einem kurzen Blick erfassen können, ist das mit einem Screenreader nur durch vorhandene Beziehungen zwischen Datenzellen und Kopfzellen möglich.

Screenreader bieten für Datentabellen umfängliche Funktionalität. Ein wichtiger Aspekt ist das Heranziehen der zugehörigen Kopfzellen für eine Datenzelle. Wenn Sie beispielsweise von einer Datenzelle zur nächsten Datenzelle navigieren, kann der Screenreader die mit der Datenzelle assoziierten Kopfzellen ebenfalls vorlesen beziehungsweise anzeigen.

Hinweis: Welche Kopfzellen herangezogen werden, kann in einem Screenreader konfiguriert werden.

Rollen für Kopfzellen

Tabellenzellen können verschiedene Rollen erhalten. Die Rollen werden im Accessibility-Tree abgelegt und sind insbesondere für Screenreader wichtig:

Kopfzellen können prinzipiell überall in einer Datentabelle vorkommen. Typischerweise werden die erste Reihe und/oder die erste Spalte einer Tabelle Überschriftencharakter aufweisen, zum Beispiel in der einfachsten Form:

<table>
  <tr>
  <th>Kopfzelle 1</th>
    <th>Kopfzelle 2</th>
  </tr>
  <tr>
    <td>Datenzelle 1</td>
    <td>Datenzelle 2</td>
  </tr>
</table>

Browser weisen den beiden Kopfzellen im vorherigen Beispiel die Rolle "columnheader" zu. Dies kann in den Entwicklerwerkzeugen eines Browsers überprüft werden.

Kopfzellen können genauso am Anfang einer Reihe stehen. Im folgenden Beispiel weisen Browser den Kopfzellen der ersten Spalte die Rolle "rowheader" und den Datenzellen die Rolle "cell" zu:

<table>
  <tr>
  <th>Kopfzelle 1</th>
    <td>Datenzelle 1</td>
  </tr>
  <tr>
    <th>Kopfzelle 2</td>
    <td>Datenzelle 2</td>
  </tr>
</table>

Die Zuweisung der korrekten Rollen können Browser in diesen Situationen zuverlässig vornehmen. Das gilt auch dann, wenn Kopfzellen sowohl in der ersten Reihe als auch in der ersten Spalte stehen. Wenn aber Kopfzellen an anderer Stelle im Gitter vorkommen oder wenn Zellen über mehr als eine Spalte oder über mehr als eine Reihe gestreckt werden, müssen die zugewiesenen Rollen überprüft werden. Gegebenenfalls muss die Beziehung zwischen Kopfzellen und Datenzellen mit den scrope- oder headers-Attributen explizit angegeben werden.

Kopfzellen in der ersten Reihe

Im folgenden Beispiel besteht die erste Reihe der Tabelle aus Kopfzellen. Die zweite und dritte Reihe bestehen aus Datenzellen.

Sprachvarianten in deutschen Großstädten
Berlin Hamburg München
Miljöh Kiez Bierdampf
Buletten Frikadellen Fleischpflanzerl

Kopfzellen in der ersten Reihe einer Tabelle legen eine Beziehung zwischen sich selbst und zugehörigen Datenzellen fest. Stehen die Kopfzellen in der ersten Tabellenreihe, dann weisen Browser die Rolle "columnheader" zu. Welche Rolle Kopfzellen erhalten, kann in den Entwicklerwerkzeugen eines Browsers eingesehen werden, zum Beispiel in Chrome:

In den Entwicklerwerkzeugen wird die Rolle eines th-Elements mit 'columnheader' angegeben.

Mit der Rolle "columnheader" können Screenreader eine Beziehung zwischen der Kopfzelle und allen Datenzellen der gleichen Spalte herstellen. Wenn mit einem Screenreader in der dritten Reihe von der ersten zur zweiten Datenzelle navigiert wird, wird der Text "Frikadelle" mit dem Text "Hamburg" ergänzt.

Kopfzellen in der ersten Spalte

Eine Kopfzelle als erste Zelle einer Reihe stellt eine Beziehung zu allen Datenzellen der Reihe her:

Anreise mit öffentlichen Verkehrsmitteln
U-Bahn U1, U3, U6 Hallesches Tor
U-Bahn U6 Kochstraße
Bus 248 Jüdisches Museum
Bus M29 Lindenstraße/Ecke Oranienstraße
Bus M41 Zossener Brücke

Die Kopfzellen in diesem Beispiel erhalten in allen gängigen Browsern die Rolle "rowheader". Die Kopfzellen können den Datenzellen der Tabellenreihe zugeordnet werden.

Kopfzellen in der ersten Reihe und in der ersten Spalte

Einfache Tabellen können sowohl über Spalten- als auch über Reihenüberschriften verfügen. Auch im folgenden Beispiel erhalten die Spaltenköpfe die Rolle "columnheader" und die Reihenköpfe die Rolle "rowheader":

Öffnungszeiten
Montag Dienstag Mittwoch Donnerstag Freitag
09:00 – 12:30 geöffnet geöffnet nach Vereinbarung geöffnet geöffnet
12:30 – 14:00 geschlossen geschlossen geschlossen geschlossen geschlossen
14:00 – 17:00 geöffnet geöffnet geschlossen geöffnet geschlossen
17:00 – 20:00 geschlossen geschlossen geschlossen geöffnet geschlossen

In diesem Beispiel sind die Kopfzellen alle eindeutig. Sollte die erste Zelle der ersten Spalte einen Inhalt haben, müssen Sie festlegen, dass die Zelle eine Kopfzelle ist. Standardmäßig werden Browser die Rolle "columnheader" für eine solche Kopfzelle festlegen. Sollte die erste Zelle eine Kopfzelle für die Reihe sein, kann ein scope-Attribut eingesetzt werden:

<table>
<tr>
<th scope="row"> … </th>
<th> … </th>
<th> … </th>
</tr>

</table>

Auch wenn das scope-Attribut für einfache Tabellen normalerweise nicht erforderlich ist, kann es Ausnahmen geben, wie im folgenden Beispiel. Die erste Kopfzelle der ersten Reihe wird nachfolgend den anderen Kopfzellen der Reihe zugeordnet. Damit wird "Name" zusätzlich herangezogen, wenn Screenreader vertikal in die zweite, dritte oder vierte Kopfzelle der ersten Reihe navigieren:

Name Andrea Ben Charlotte
Anteile 12 6 14
Geplante Änderung −3 +2 ±0

Das abbr-Attribut

Screenreader können zugeordnete Kopfzellen einzelnen Datenzellen voranstellen, wenn Nutzende von Screenreadern durch die Datenzellen navigieren. In manchen Situationen können Kopfzellen aber uneindeutig, unverständlich oder auch sehr lang sein. In solchen Fällen kann das th-Element ein abbr-Attribut erhalten.

Das abbr-Attribut für th-Elemente stellt eine alternative Bezeichnung für die Kopfzelle dar, zum Beispiel wenn der Text der Kopfzelle einer Datenzelle vorangestellt wird. Der Wert des abbr-Attributs ist typischerweise eine kurze Form des sichtbaren Textes, darf aber auch eine Erweiterung oder eine andere Formulierung sein. Im folgenden Beispiel kann in einem Screenreader bei der Navigation von der rechten Datenzelle zur linken Datenzelle statt "auf dem Flohmarkt verkaufen Schallplatten" die alternative Bezeichnung der Kopfzelle vorangestellt und "Verkaufen Schallplatten" ausgegeben werden:

<table>
<thead>
<tr>
<th abbr="Verkaufen">auf dem Flohmarkt verkaufen</th>
<th>Spenden</th>
</tr>
</thead>
<tr>
<td>Schallplatten</td>
<td>Bücher</td>
</tr>
</table>

Wenn die Kopfzellen navigiert werden, lesen Screenreader den sichtbaren Text. Erst wenn die Kopfzellen zu anderen Zwecken herangezogen werden, etwa bei der Beschriftung einer Datenzelle, werden die alternativen Beschriftungen herangezogen und die eigentliche Beschriftung ersetzt. Das abbr-Attribut ist im Übrigen meist nicht erforderlich.