Accessible Hamburger Menu

Das Menü, das sagt, ob es offen ist

Ein Symbol ohne Namen, ein geschlossenes Menü im Tab-Weg: zwei Befunde.

Website prüfen
Beispiel im Prüfbericht Markierter Befund
Markierter Befund · Kritisch · WCAG 4.1.2Tauschen-Button ohne Namen

Offen und geschlossen

Zwei Ansichten, ein verlässlicher Zustand

Sichtbare Fläche, Ansage und Tab-Reihenfolge müssen dasselbe Menü beschreiben.

Statisches Schema einer mobilen Navigation, keine bedienbare Oberfläche

Menü geschlossen

Menü
Ferien am MeerZimmer mit Blick auf den Horizont.Zimmer ansehen
Tab 1MenüTab 2Zimmer ansehen

Ein Klick schreibt zwei Werte

Schalter
falsetrue
Navigation
hiddensichtbar
Nächster Tab
InhaltStart

aria-expanded und hidden wechseln in derselben Funktion.

Menü geöffnet

Schließen
HauptnavigationStartZimmerAnfahrtKontakt
Tab 1SchließenTab 2Start
Warum kein role="menu"?

Diese Links navigieren zu Seiten. Dafür bleiben nav, Liste und Links die verständliche Struktur. Die zusätzliche ARIA-Menürolle würde eine Bedienung mit Pfeiltasten und verwaltetem Fokus versprechen, die eine normale Website-Navigation nicht braucht.

Der Tastaturweg

Der Fokus folgt der sichtbaren Spur

  1. TabSchalter fokussierenDer sichtbare Ring steht auf „Menü“.
  2. EnterNavigation öffnenaria-expanded="true", hidden entfernt.
  3. TabLinks durchlaufenDer erste Stopp ist „Start“, danach folgen die übrigen Links.
  4. EscSchließen und zurückDas Menü verschwindet, der Fokus kehrt zum Schalter zurück.

Das Zustandsmodell

Markup und Logik zum Übernehmen

Der Schalter hat einen sichtbaren Namen. aria-controls zeigt auf die Navigation; das Skript hält Ansage und Sichtbarkeit zusammen.

HTML

<button type="button" id="menue-schalter"
  aria-expanded="false" aria-controls="hauptmenue">
  <span aria-hidden="true">☰</span>
  Menü
</button>

<nav id="hauptmenue" aria-label="Hauptnavigation" hidden>
  <ul>
    <li><a href="/">Start</a></li>
    <li><a href="/zimmer">Zimmer</a></li>
    <li><a href="/anfahrt">Anfahrt</a></li>
    <li><a href="/kontakt">Kontakt</a></li>
  </ul>
</nav>

JavaScript

const schalter = document.querySelector('#menue-schalter');
const menue = document.querySelector('#hauptmenue');

function setzeMenue(offen) {
  schalter.setAttribute('aria-expanded', String(offen));
  menue.hidden = !offen;
}

schalter.addEventListener('click', () => {
  const offen = schalter.getAttribute('aria-expanded') === 'true';
  setzeMenue(!offen);
});

document.addEventListener('keydown', (event) => {
  if (event.key !== 'Escape' || menue.hidden) return;
  setzeMenue(false);
  schalter.focus();
});

Ergänzen Sie in Ihrem Breakpoint dieselbe Zustandslogik: Auf dem Desktop muss die Navigation sichtbar sein, auch wenn sie mobil zuletzt geschlossen war. Vermeiden Sie eine CSS-Regel wie nav { display: block; }, die hidden überstimmt.

Abnahme in vier Tasten

So prüfen Sie es

  1. TabDas geschlossene Menü wird übersprungen.
  2. EnterDie Links erscheinen; der Schalter meldet „erweitert“.
  3. TabDer Fokus erreicht den ersten sichtbaren Link.
  4. EscDas Menü schließt und der Fokus steht wieder am Schalter.

Prüfen Sie zusätzlich bei 320 Pixel Breite und in 200 Prozent Zoom. Kein Link darf abgeschnitten sein oder horizontal aus dem sichtbaren Bereich laufen.

Aus dem Prüfbericht

Zwei Stellen, zwei Befunde

Zum Mitnehmen

Das Hamburger-Menü, korrigiert

Name und Zustand am Schalter, hidden am Menü. JavaScript wechselt beides.

Korrektur in 3 Schritten ansehen
  1. Dem Schalter Namen und Zustand geben

    aria-expanded sagt, ob das Menü offen ist. aria-controls verbindet Schalter und Menü.

    KorrekturvergleichSchritt 1 · HTML

    Vorher

    <button type="button" class="burger">
      <span class="bar"></span><span class="bar"></span><span class="bar"></span>
    </button>

    Nachher

    <button type="button" class="burger" aria-label="Menü"
      aria-expanded="false" aria-controls="hauptmenue">
      <span class="bar"></span><span class="bar"></span><span class="bar"></span>
    </button>

    Markierte Zeilen wurden geändert

    So prüfen Sie es Tab auf die drei Striche. Ein Vorleseprogramm sagt „Menü, Schaltfläche, reduziert“.

  2. Das geschlossene Menü wirklich schließen

    hidden nimmt das Menü aus Anzeige und Tab-Reihenfolge. Beim Öffnen entfernt JavaScript das Attribut.

    KorrekturvergleichSchritt 2 · HTML

    Vorher

    <nav id="hauptmenue" class="drawer" aria-hidden="true">
      <a href="/">Start</a>
      <a href="/zimmer">Zimmer</a>
    </nav>

    Nachher

    <nav id="hauptmenue" class="drawer" hidden>
      <a href="/">Start</a>
      <a href="/zimmer">Zimmer</a>
    </nav>

    Markierte Zeilen wurden geändert

    So prüfen Sie es Drücken Sie Tab bei geschlossenem Menü. Der Fokus geht direkt zum Inhalt, nicht ins Menü.

  3. Öffnen und Schließen in JavaScript

    Ein Klick wechselt aria-expanded und hidden zusammen. Escape schließt und gibt den Fokus zurück.

    KorrekturvergleichSchritt 3 · JavaScript

    Vorher

    burger.addEventListener('click', () => {
      drawer.classList.toggle('open');
    });

    Nachher

    burger.addEventListener('click', () => {
      const open = burger.getAttribute('aria-expanded') === 'true';
      burger.setAttribute('aria-expanded', String(!open));
      drawer.hidden = open;
    });
    drawer.addEventListener('keydown', (event) => {
      if (event.key !== 'Escape') return;
      burger.setAttribute('aria-expanded', 'false');
      drawer.hidden = true;
      burger.focus();
    });

    Markierte Zeilen wurden geändert

    So prüfen Sie es Öffnen Sie das Menü per Enter, drücken Sie Escape. Der Fokus steht wieder auf dem Schalter.

Werbung

Kostenloser Website-Barrierefreiheits-Check

Website auf Barrierefreiheit prüfen.

Technische WCAG-Warnsignale erkennen. Kritische Stellen zuerst prüfen.

Der Website-Check ist bereit.

Werbung

Ein letzter Schritt

Prüfen, bevor Sie gehen.

Finden Sie automatisch erkennbare Barrieren auf Ihrer eigenen Website.

Website prüfen

Kostenlos starten · keine Installation

Automatisches Screening. Tastaturbedienung und Screenreader bleiben manuelle Prüfung.