Eine barrierefreie Tabelle mit anklickbaren Zeilen bauen

Tabellen auf Websites zeigen meistens statische Informationen in Zeilen und Spalten an. Aber was ist, wenn ihr die Zeilen anklickbar machen möchtet, z.B. um weitere Informationen anzuzeigen? Euer erster Gedanke könnte sein, Klick-Ereignis-Handler auf die Tabellenzeilen (<tr>) zu setzen, um sie anklickbar zu machen. Bitte lasst die Finger davon!

Eine Tabellenzeile mit einem Klick-Ereignis-Handler wird nicht auf magische Weise zu einem barrierefreien Steuerelement. Ihr könnt die Zeile nicht mit der Tastatur ansteuern, geschweige denn das Klick-Ereignis mit der ENTER-Taste auslösen. Der Zweck des Klick-Ereignis-Handlers wäre für Screenreader-Nutzer:innen unklar. Was können wir also tun?

Eine Frau berührt den Bildschirm eines Smartphones mit ihrem Zeigefinger. Foto: © Kampus Production / pexels.com

Um eine barrierefreie Tabelle mit anklickbaren Zeilen zu erstellen, nehmen wir einfach ein <button>-Element und erhöhen dessen Reichweite, sodass es die gesamte Zeile abdeckt. Meine Lösung ist inspiriert von Adrian Rosellis Artikel „Don’t Turn a Table into an ARIA Grid Just for a Clickable Row“.

Demo: Tabelle mit anklickbaren Zeilen

Ich habe eine CodePen-Demo erstellt, die mehrere Filme von Studio Ghibli in Tabellenform auflistet. Durch Anklicken einer Zeile öffnet sich ein Dialogfeld mit weiteren Informationen zum Film:

Der Aufbau der barrierefreien Tabelle

Die ideale Lösung

Wir fügen ein <button>-Element in die letzte Tabellenzelle jeder Zeile ein. Der barrierefreie Name der Schaltfläche (“More Information”) zusammen mit der Zeilenüberschrift (das <th>-Element in der Zeile) informiert Screenreader-Nutzer:innen über den Zweck des Steuerelements:

<tr> <th>Spirited Away</th> <td>2001</td> <td>2h 4m</td> <td> <button id="info-btn-1" aria-label="More Information" type="button"> <span>/* icon */</span> </button> </td> </tr>

Der Button ist standardmäßig über die Tastatur bedienbar. Wir müssen lediglich visuell vermitteln, dass die gesamte Tabellenzeile fokussiert ist. Dazu können wir die CSS-Pseudoklasse :focus-within verwenden:

table tbody tr { &:focus-within, &:hover { outline: 0.188rem solid black; outline-offset: -0.313rem; } button:focus { outline: none; } }

Auf diese Weise wird die Tabellenzeile bei Hover mit der Maus hervorgehoben oder wenn die Schaltfläche innerhalb der Zeile den Fokus erhält.

Schließlich möchten wir die Schaltfläche auslösen, wenn jemand auf die Tabellenzeile klickt. Um dies zu erreichen, verwenden wir das Pseudo-Element ::after zusammen mit der CSS-Eigenschaft inset:

table tbody tr { position: relative; button::after { content: ""; position: absolute; inset: 0; } }

Das Pseudo-Element ist relativ zu seinem übergeordneten <tr>-Element absolut positioniert und deckt dank inset: 0 die gesamte Tabellenzeile ab. Jetzt zählt ein Klick auf die Tabellenzeile als Klick auf die darin enthaltene Schaltfläche. Genial! 🤩

Es gibt nur ein Problem: Das ganze funktioniert (aktuell) nicht in Safari. Die Definition position: relative für das <tr>-Element wird einfach ignoriert. 🤬

Die Safari-kompatible Version

Solange der WebKit-Fehler nicht behoben ist, benötigen wir einen Workaround. Ich habe eine alternative CodePen-Demo erstellt, die auch in Safari funktioniert:

Die Lösung ist etwas umständlich, aber sie funktioniert. Anstatt die Tabellenzeile als relativen Anker zu verwenden, positionieren wir das Pseudo-Element relativ zu seinem übergeordneten <td>-Element. Seht selbst:

table { overflow: clip; } table tbody tr { td:has(button) { position: relative; } button::after { content: ""; position: absolute; inset: 0; left: auto; width: 100vw; } }

Wir setzen die Eigenschaft left des Pseudo-Elements auf auto zurück und legen seine Breite auf 100 % der Viewport-Breite fest. Zusätzlich setzen wir overflow: clip für die Tabelle, um die Reichweite jeder Schaltfläche auf die tatsächliche Breite der Tabellenzeile zu beschränken.

Fazit

Wie ihr seht, ist es gar nicht so schwer, eine barrierefreie Tabelle mit anklickbaren Zeilen zu erstellen. Denkt immer daran, dass nicht alle eure Nutzer:innen eine Maus oder ein Touch-Gerät verwenden. Testet daher immer auch mit der Tastatur und Screenreadern. 😉

Erstellt am