Technik

Akkordeons und Tabs barrierefrei entwickeln: ARIA-Patterns

Von Joshua Kantner · Juli 2026 · bf-check.de

Akkordeons und Tabs gehören zu den am häufigsten falsch umgesetzten Komponenten auf deutschen Webseiten. Optisch wirken sie oft tadellos – erst mit Tastatur oder Screenreader zeigt sich, ob Nutzer die Inhalte tatsächlich erreichen können.

Die WAI-ARIA Authoring Practices beschreiben für beide Komponenten ein festes Muster aus Rollen, Zuständen und Tastaturinteraktionen. Wer sich daran hält, vermeidet die typischen Fehler bei FAQ-Bereichen, Produktbeschreibungen und mehrstufigen Formularen.

Warum Akkordeons und Tabs besondere Sorgfalt brauchen

Beide Komponenten blenden Inhalte optisch aus oder ein, ohne die Seite neu zu laden. Für sehende Mausnutzer ist das bequem, für Screenreader- und Tastaturnutzer entsteht dabei ein unsichtbarer Zustand: Ist ein Panel geöffnet oder geschlossen? Gehört ein Button zu einem Tab oder zu einem eigenständigen Inhalt? Ohne semantische Auszeichnung bleibt das reine Spekulation.

Genau deshalb legt die ARIA-Spezifikation für Akkordeons und Tabs feste Patterns fest. Sie definieren Rollen, Attribute und Tastenkombinationen verbindlich, damit Hilfstechnologie den Zustand korrekt vorliest und Nutzer die Bedienung nicht raten müssen.

Wer diese Patterns ignoriert, riskiert nicht nur Abstriche beim Barrierefreiheits-Scan, sondern verliert auch sehende Tastaturnutzer, die aus motorischen Gründen keine Maus verwenden.

Das Akkordeon-Pattern im Detail

Ein Akkordeon besteht aus mehreren Abschnitten, die jeweils aus einer Überschrift mit Button und einem zugehörigen Inhaltsbereich bestehen. In der Überschrift liegt ein <button>-Element, das die Rolle „button" von Haus aus mitbringt.

Der Button braucht aria-expanded="true" oder aria-expanded="false", je nach Zustand, sowie aria-controls mit der ID des zugehörigen Panels. Das Panel selbst bekommt eine eindeutige ID und wird bei geschlossenem Zustand mit hidden ausgeblendet oder vollständig aus dem DOM entfernt.

Wichtig: Der sichtbare Text der Überschrift muss weiterhin als echter Button fungieren, nicht als <div> mit Klick-Handler. Nur so bekommt die Komponente automatisch Tastaturfokus und die Enter-/Leertaste-Bedienung, ohne dass Entwickler das selbst nachbauen müssen.

Das Tabs-Pattern: tablist, tab und tabpanel

Tabs bestehen aus drei Rollen: Der äußere Container trägt role="tablist", jeder Reiter role="tab" und jeder zugehörige Inhalt role="tabpanel". Der aktive Tab erhält aria-selected="true", alle anderen aria-selected="false".

Jedes Tabpanel referenziert seinen Tab über aria-labelledby, jeder Tab referenziert sein Panel über aria-controls. Nur der aktive Tab liegt in der normalen Tab-Reihenfolge (tabindex="0"), die übrigen sind über tabindex="-1" aus der Reihenfolge genommen und werden per Pfeiltaste erreicht.

Diese Trennung zwischen „einmal mit Tab erreichbar" und „innerhalb der Gruppe mit Pfeiltasten navigierbar" ist der Kern des Patterns – und genau der Punkt, an dem die meisten Framework-Komponenten scheitern.

⚠️
Ist deine Webseite betroffen? Kostenloser BFSG-Schnellcheck – Ergebnis in 30 Sekunden.
Jetzt prüfen →

Tastaturbedienung: Welche Taste was auslösen muss

Bei Akkordeons genügen Tab zum Erreichen des Buttons sowie Enter oder Leertaste zum Öffnen und Schließen. Manche Nutzer erwarten zusätzlich, mit Pfeil-hoch/-runter zwischen mehreren Akkordeon-Headern springen zu können, was die Authoring Practices als optionale Erweiterung vorsehen.

Bei Tabs gilt: Pfeil-links/-rechts, bei vertikaler Anordnung Pfeil-hoch/-runter, wechselt zwischen den Reitern, Pos1 springt zum ersten, Ende zum letzten Tab. Bei automatischer Aktivierung ist Enter oder Leertaste gar nicht nötig – der Wechsel per Pfeiltaste aktiviert das Panel sofort.

Frameworks, die nur Mausklicks unterstützen oder Pfeiltasten komplett ignorieren, produzieren eine Komponente, die für Tastaturnutzer schlicht nicht bedienbar ist – unabhängig davon, wie korrekt die ARIA-Attribute im Markup stehen.

Typische Implementierungsfehler in JavaScript-Frameworks

Ein häufiger Fehler: role="tab" wird auf ein <div> statt auf einen Button gesetzt, ohne tabindex und Tastatur-Handler nachzurüsten. Die Komponente sieht für Screenreader korrekt aus, ist aber mit der Tastatur nicht erreichbar.

Ein zweiter Fehler betrifft aria-expanded: Viele Komponentenbibliotheken setzen das Attribut nur beim ersten Rendern, aktualisieren es aber nicht, wenn sich der Zustand durch Klick ändert – der Screenreader meldet dann dauerhaft „eingeklappt", selbst wenn der Inhalt sichtbar ist.

Drittens werden Panels häufig nur per CSS (display:none) versteckt, ohne hidden oder aria-hidden zu setzen. Manche Screenreader lesen den ausgeblendeten Text dann trotzdem vor, was zu verwirrenden Doppelinhalten führt.

Wo die Patterns im Alltag wirklich zählen

FAQ-Bereiche sind der klassische Einsatzort für Akkordeons – gerade weil sie oft die einzige Möglichkeit sind, häufige Kundenfragen kompakt darzustellen. Ein defektes Akkordeon-Pattern bedeutet hier: Screenreader-Nutzer finden Antworten nicht, die sichtbar direkt unter der Frage stehen.

Auf Produktseiten trennen Tabs häufig Beschreibung, technische Daten und Bewertungen. Sind diese Tabs nicht korrekt ausgezeichnet, bleiben ganze Produktinformationen für Hilfstechnologie unauffindbar, was sich direkt auf Kaufentscheidungen auswirken kann.

Auch mehrstufige Formulare mit Akkordeon-Abschnitten pro Kategorie sind verbreitet. Hier zählt zusätzlich, dass der Fokus nach dem Öffnen eines Panels nicht ungewollt springt und Nutzer den Überblick über bereits ausgefüllte Abschnitte behalten.

Responsive Verhalten: Wenn Tabs auf dem Smartphone zu Akkordeons werden

Viele responsive Layouts wandeln Tabs auf schmalen Bildschirmen in ein Akkordeon um, weil nebeneinanderliegende Reiter auf einem Smartphone kaum Platz finden. Diese Umwandlung darf nicht rein optisch erfolgen, denn die zugrunde liegenden ARIA-Rollen gehören ebenso zum Pattern wie das Layout selbst.

Bleiben role="tablist" und role="tab" bestehen, obwohl sich die Komponente auf dem Smartphone wie ein Akkordeon verhält, meldet der Screenreader weiterhin eine Tab-Gruppe mit Auswahlzustand, während Nutzer tatsächlich einzelne Panels auf- und zuklappen. Die Ansage passt dann nicht mehr zur tatsächlichen Bedienung, was gerade beim schnellen Wechsel zwischen Geräten für Verwirrung sorgt.

Sauberer ist es, die Rollen abhängig vom Breakpoint per JavaScript umzuschreiben: Oberhalb einer bestimmten Bildschirmbreite gilt das Tabs-Pattern mit tablist, tab und tabpanel, unterhalb wechselt die Komponente vollständig auf einzelne Buttons mit aria-expanded, inklusive angepasster Tastaturbedienung. Wird nur das CSS getauscht und das Markup bleibt gleich, stimmt zwar die Optik, die zugrunde liegende Semantik bleibt aber falsch.

In der Praxis lohnt sich ein einfacher Test: Verkleinere das Browserfenster testweise auf Smartphone-Breite und prüfe mit aktiviertem Screenreader, ob die Ansage weiterhin von „Tab" spricht oder korrekt auf „Schaltfläche, eingeklappt" wechselt. Bleibt die alte Ansage bestehen, ist die Umstellung auf das responsive Verhalten nur halb erledigt.

Screenreader-Test: So prüfst du beide Komponenten

Teste Akkordeons, indem du ausschließlich mit Tab und Enter navigierst: Der Fokus muss sichtbar auf dem Header-Button landen, und der Screenreader muss „eingeklappt" oder „ausgeklappt" ansagen, sobald sich der Zustand ändert.

Bei Tabs prüfst du mit Pfeil-links/-rechts, ob der Fokus tatsächlich zwischen den Reitern wandert und ob NVDA oder VoiceOver den aktiven Tab sowie dessen Position, etwa „Tab 2 von 4", ansagt.

Ergänzend hilft ein automatisierter Scan, um fehlende aria-controls-Referenzen oder doppelte IDs aufzudecken, die sich bei manueller Prüfung leicht übersehen lassen – ein kostenloser Scan zeigt solche Fehler direkt im Report.

Hinweis: Dieser Beitrag bietet allgemeine technische Orientierung und ersetzt keine individuelle Rechtsberatung zur Umsetzung des BFSG.

Häufig gestellte Fragen

Muss ich role="tablist" auch bei nur zwei Tabs verwenden?
Ja. Die Anzahl der Reiter spielt keine Rolle – sobald Inhalte über wechselnde Reiter gesteuert werden, gilt das Tabs-Pattern mit tablist, tab und tabpanel, auch bei nur zwei Optionen.
Reicht aria-expanded allein, um ein Akkordeon barrierefrei zu machen?
Nein. Zusätzlich müssen aria-controls auf das Panel zeigen, der Button per Tastatur erreichbar sein und der Zustand bei jeder Änderung aktualisiert werden – erst die Kombination aller Punkte erfüllt das Pattern.
Dürfen mehrere Akkordeon-Panels gleichzeitig geöffnet sein?
Ja, das ist zulässig und in vielen FAQ-Bereichen sogar üblich. Wichtig ist nur, dass jedes Panel seinen eigenen, unabhängigen aria-expanded-Zustand korrekt führt.
Was ist der Unterschied zwischen automatischer und manueller Tab-Aktivierung?
Bei automatischer Aktivierung öffnet sich das Panel sofort beim Wechsel per Pfeiltaste. Bei manueller Aktivierung wandert der Fokus zunächst nur zwischen den Reitern, und erst Enter oder Leertaste öffnet das Panel – beide Varianten sind laut ARIA-Pattern zulässig.
Wie prüfe ich das ohne Entwicklerkenntnisse?
Navigiere die Komponente ausschließlich mit der Tastatur und aktiviere einen Screenreader wie NVDA im Testmodus. Wenn du jeden Zustand hörst und erreichst, den du auch siehst, ist die Grundlage meist vorhanden.
Zählen fehlerhafte Akkordeons und Tabs zu den häufigen BFSG-Verstößen?
Ja, sie gehören zu den wiederkehrenden Fehlerbildern bei automatisierten wie manuellen Prüfungen, weil sie optisch unauffällig sind, aber bei Tastatur- und Screenreader-Tests schnell durchfallen.

Weiterlesen

ARIA
ARIA-Attribute richtig einsetzen
WCAG
Name, Role, Value: Custom Widgets WCAG-konform entwickeln
Tastatur
Tastatur-Bedienbarkeit testen
Technik
JavaScript und Barrierefreiheit: Dynamische Inhalte zugänglich machen

Ist deine Webseite BFSG-konform?

Finde es in 30 Sekunden heraus – kostenloser Schnellcheck mit sofortigem Ergebnis.

Jetzt kostenlos prüfen →
BFSG-Pflicht seit Juni 2025 – Ist deine Seite konform? Kostenlos prüfen
Seit Juni 2025 Pflicht

Warte – deine Webseite könnte gegen das BFSG verstoßen

Abmahnungen bis 5.000 €, Bußgelder bis 100.000 €. Unser kostenloser Scan zeigt dir in 30 Sekunden ob du betroffen bist.

Jetzt kostenlos scannen →