Barrierefreie Komponenten · Navigation & Bedienelemente
Menüs & Dropdowns barrierefrei umsetzen
Ausklappbare Menüs sind der Teil einer Website, an dem Barrierefreiheit am häufigsten kippt – und meist nicht aus Nachlässigkeit, sondern wegen einer verbreiteten Fehlannahme: dass ein Navigationsmenü die ARIA-Rolle menu brauche. Genau das ist in den meisten Fällen falsch und macht die Bedienung schlechter, nicht besser.
Der Grund: role="menu" und role="menubar" sind für Anwendungsmenüs gedacht – die Datei-/Bearbeiten-Menüs einer Desktop-App. Sie erzwingen ein bestimmtes Tastaturmodell (Pfeiltasten statt Tab) und Erwartungen, die für eine Website-Navigation schlicht nicht passen. Für aufklappbare Navigation empfiehlt der ARIA Authoring Practices Guide deshalb das Disclosure-Muster.
Das Disclosure-Muster
Ein Disclosure ist nichts weiter als ein Button, der einen Bereich ein- und ausblendet. Der Button trägt aria-expanded (Zustand) und aria-controls (Verweis auf das Panel); im Panel stehen ganz normale Links in einer Liste:
<nav aria-label="Hauptnavigation">
<ul>
<li>
<button type="button" aria-expanded="false" aria-controls="menu-produkte">
Produkte
</button>
<ul id="menu-produkte">
<li><a href="/analyse.html">Analyse</a></li>
<li><a href="/export.html">Export</a></li>
</ul>
</li>
</ul>
</nav>
Das ist exakt das Muster, das auch das Mega-Menü dieser Website nutzt: Jeder Themenbereich hat einen <button aria-expanded>, der ein Panel mit normalen Links öffnet. Kein menubar, keine erzwungene Pfeiltasten-Navigation – einfach Buttons und Links, die jeder kennt.
Das erwartete Tastaturverhalten
Beim Disclosure gilt das vertraute Modell, und genau das ist der Vorteil:
- Enter / Leertaste auf dem Button klappt auf und zu.
- Tab läuft logisch weiter – in das geöffnete Panel hinein und wieder heraus. Kein Fokus-Trap.
- Esc schließt das Menü und gibt den Fokus an den auslösenden Button zurück.
aria-expanded muss dabei den sichtbaren Zustand widerspiegeln – beim Öffnen auf true, beim Schließen auf false. Diese Synchronisierung ist der eigentliche Kern und der Teil, den eine reine CSS-Lösung (Hover bzw. :focus-within) noch nicht leisten kann.
Progressive Enhancement: erst ohne JS, dann mit
Ich baue solche Menüs gern so, dass sie ohne JavaScript grundsätzlich funktionieren und mit JavaScript besser werden. Zwei Wege dorthin:
- Reines HTML:
<details>/<summary>ist ein fertiges, natives Disclosure – ganz ohne Skript und ohne ARIA. Für einfache Aufklapp-Menüs oft schon genug. - CSS-Aufwertung: Panels per
:hoverund:focus-withinöffnen, damit Maus, Touch und Tastatur das Menü auch ohne JS erreichen. Genau dieser Stand ist auf dieser Website aktuell umgesetzt; der nächste Schritt ist eine kleine JS-Schicht, diearia-expandedmitführt undEscbehandelt.
Wichtig ist mir dabei eine Regel: niemals nur Hover. Was sich ausschließlich mit der Maus öffnen lässt, ist auf dem Smartphone und per Tastatur unerreichbar.
Wann doch role="menu"?
Es gibt einen legitimen Fall: ein echtes Aktionsmenü – etwa ein „⋯ Weitere Aktionen“-Button, dessen Einträge Befehle auslösen (Umbenennen, Löschen, Teilen). So etwas verhält sich wie ein Anwendungsmenü, und dort sind role="menu" mit role="menuitem" und Pfeiltasten-Navigation tatsächlich richtig.
Meine Abgrenzung ist simpel: Sind es Links zu Seiten? Dann Disclosure mit <a>. Sind es Befehle, die etwas tun? Dann ist ein Menü mit menuitem denkbar – aber auch deutlich aufwendiger korrekt umzusetzen, weshalb ich es nur einsetze, wenn es wirklich passt.
Häufige Fehler
-
role="menubar"für die Seitennavigation. Erzwingt ein Tastaturmodell, das Nutzende hier nicht erwarten. - Nur per Hover bedienbar. Sperrt Touch- und Tastaturnutzung aus.
-
aria-expandedwird nicht aktualisiert. Der Button sagt „zu“, obwohl das Menü offen ist – eine falsche Ansage ist schlimmer als gar keine. -
<div>als Auslöser. Der Trigger gehört auf ein<button>, sonst fehlen Fokus und Tastaturbedienung. - Fokus-Trap. Tab muss aus dem Menü auch wieder herauskommen.
Häufige Fragen
Disclosure und Akkordeon – ist das nicht dasselbe?
Im Kern ja: Beide bauen auf einem <button aria-expanded>, der einen Bereich zeigt oder verbirgt. Akkordeons sind die Anwendung dieses Musters auf Inhaltsabschnitte, Dropdown-Menüs die Anwendung auf Navigation.
Wie kennzeichne ich die aktuelle Seite im Menü?
Mit aria-current="page" am Link der aktiven Seite. So weiß auch ein Screenreader, wo man sich befindet. Diese Seite macht das im Mega-Menü und in den Breadcrumbs genauso.
Brauche ich für mehrere <nav>-Bereiche Labels?
Ja. Bei mehreren Navigationen sorgt aria-label für Unterscheidbarkeit – mehr dazu unter Struktur-Elemente.
Fazit
Für aufklappbare Navigation ist das Disclosure-Muster die richtige Wahl: ein <button aria-expanded>, der ein Panel mit normalen Links steuert – tastaturbedienbar mit dem vertrauten Tab-Modell, ohne erzwungene menubar-Mechanik. role="menu" hebst du dir für echte Befehlsmenüs auf. So bleibt das Menü für alle bedienbar, und du baust kein Tastaturmodell nach, das niemand erwartet.