Keyboard Navigation mit JavaScript

Eine Werkzeugleiste, die die Tastatur versteht

Symbolknöpfe, Zustände, verschachtelter Link: vier Stellen in der Leiste.

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

Fokus als Zustandswechsel

Eine Taste verändert Fokus, Tabindex und Ansage gemeinsam

Die Werkzeugleiste zeigt den Weg vom Tastendruck bis zum nächsten aktiven Werkzeug.

Konzeptdarstellung · keine interaktive Leiste

Roving Tabindex in einer horizontalen Werkzeugleiste

vorherTexteditor
Tab
ein TabstoppWerkzeugleiste
Tab
nachherHilfe zum Formatieren
Homezum ersten Werkzeug
Fokus verschieben
Endzum letzten Werkzeug
Textformat · Werkzeugleiste
DOM-FokusFetttabindex="0"aria-pressed="false"
Kursivtabindex="-1"aria-pressed="false"
Aufzählungtabindex="-1"aria-pressed="false"
Leertasteändert aria-pressed, der Fokus bleibt
  1. 1Pfeil rechtsevent.key liefert ArrowRight.
  2. 2Index berechnenNach dem letzten Werkzeug beginnt die Reihe wieder vorn.
  3. 3Tabindex verschiebenAlt erhält -1, neu erhält 0.
  4. 4Fokus setzenfocus() bewegt den sichtbaren Fokusring.

Vorher → nachher

Der Fokus wandert, die Tab-Reihenfolge bleibt kurz

Vor Pfeil rechtsFett0Kursiv-1Liste-1
Nach Pfeil rechtsFett-1Kursiv0Liste-1

Was JavaScript übernimmt

Browser behalten

Native button-Elemente liefern Enter und Leertaste bereits mit.

Fokus ergänzen

Pfeile, Home und End ändern den aktiven Tabstopp und rufen focus() auf.

Zustand koppeln

Umschalten aktualisiert aria-pressed. Assistive Technik erhält denselben Zustand.

Vollständiges HTML

Drei benannte Umschaltknöpfe

Nur Fett beginnt mit tabindex="0". Die Symbole sind ausgeblendet, weil der zugängliche Name bereits am Knopf steht.

<div class="formatleiste"
  role="toolbar"
  aria-label="Textformat">
  <button type="button" aria-label="Fett"
    aria-pressed="false" tabindex="0">
    <span aria-hidden="true">B</span>
  </button>
  <button type="button" aria-label="Kursiv"
    aria-pressed="false" tabindex="-1">
    <span aria-hidden="true">I</span>
  </button>
  <button type="button" aria-label="Aufzählung"
    aria-pressed="false" tabindex="-1">
    <span aria-hidden="true">•</span>
  </button>
</div>

<a href="/hilfe/textformat">
  Hilfe zum Textformat
</a>

Vollständiges JavaScript

Eine Funktion besitzt den Fokuszustand

setzeFokus verteilt den Tabindex und bewegt den DOM-Fokus. Der Klickpfad nutzt dieselbe Funktion, damit Maus und Tastatur denselben Zustand hinterlassen.

const leiste = document.querySelector('.formatleiste');
const werkzeuge = [...leiste.querySelectorAll('button')];

function setzeFokus(ziel) {
  werkzeuge.forEach((werkzeug) => {
    werkzeug.tabIndex = werkzeug === ziel ? 0 : -1;
  });
  ziel.focus();
}

leiste.addEventListener('keydown', (event) => {
  const aktuell = werkzeuge.indexOf(document.activeElement);
  let naechster = aktuell;

  switch (event.key) {
    case 'ArrowRight':
      naechster = (aktuell + 1) % werkzeuge.length;
      break;
    case 'ArrowLeft':
      naechster = (aktuell - 1 + werkzeuge.length)
        % werkzeuge.length;
      break;
    case 'Home':
      naechster = 0;
      break;
    case 'End':
      naechster = werkzeuge.length - 1;
      break;
    default:
      return;
  }

  event.preventDefault();
  setzeFokus(werkzeuge[naechster]);
});

leiste.addEventListener('click', (event) => {
  if (!(event.target instanceof Element)) return;
  const werkzeug = event.target.closest(
    'button[aria-pressed]'
  );
  if (!werkzeug || !leiste.contains(werkzeug)) return;

  const aktiv = werkzeug.getAttribute('aria-pressed') === 'true';
  werkzeug.setAttribute('aria-pressed', String(!aktiv));
  setzeFokus(werkzeug);
});

Für normale Seitennavigation brauchen Sie das nicht

Links und einzelne Schaltflächen bleiben in ihrer natürlichen DOM-Reihenfolge. Roving Tabindex gehört zu zusammengesetzten Widgets wie dieser Werkzeugleiste. Positive tabindex-Werte erzeugen eine zweite Reihenfolge und sollten vermieden werden.

So prüfen Sie es

  1. Drücken Sie Tab bis zur Werkzeugleiste. Genau ein Werkzeug erhält den Fokus.
  2. Drücken Sie Pfeil rechts und links. Der Fokusring folgt in beide Richtungen.
  3. Drücken Sie Home und End. Der Fokus springt zum ersten und letzten Werkzeug.
  4. Drücken Sie Leertaste. Die Ansage wechselt zwischen aktiviert und nicht aktiviert.
  5. Drücken Sie Tab. Der Fokus verlässt die gesamte Leiste mit einem Tastendruck.

Aus dem Prüfbericht

Vier Befunde an der Werkzeugleiste

Kritisch Der Zustand meldet einen Wert, den es nicht gibt Regel aria-valid-attr-value

aria-pressed nimmt true, false oder mixed. Das Skript setzt den Wert aus derselben Variablen wie die Darstellung.

Anleitung: Gültige ARIA-Attributwerte setzen

Zum Mitnehmen

Die Werkzeugleiste, korrigiert

Name, Zustand, Struktur: drei Änderungen an denselben Knöpfen.

Korrektur in 3 Schritten ansehen
  1. Die Symbolknöpfe benennen

    Das Symbol bleibt für Vorleseprogramme verborgen. Ein aria-label liefert den Namen des Werkzeugs, das der Knopf schaltet.

    KorrekturvergleichSchritt 1 · HTML

    Vorher

    <div role="toolbar" aria-label="Textformat">
      <button type="button">
        <span aria-hidden="true">B</span>
      </button>
    </div>

    Nachher

    <div role="toolbar" aria-label="Textformat">
      <button type="button" aria-label="Fett">
        <span aria-hidden="true">B</span>
      </button>
    </div>

    Markierte Zeilen wurden geändert

    So prüfen Sie es Gehen Sie mit Tab in die Leiste. Ein Vorleseprogramm sagt „Fett, Schaltfläche“.

  2. Den passenden Zustand setzen

    aria-pressed beschreibt einen Umschaltknopf mit true oder false. aria-checked gehört zu Kontrollkästchen und Optionsfeldern.

    KorrekturvergleichSchritt 2 · HTML

    Vorher

    <button type="button" aria-label="Fett" aria-checked="ja">
      <span aria-hidden="true">B</span>
    </button>

    Nachher

    <button type="button" aria-label="Fett" aria-pressed="false">
      <span aria-hidden="true">B</span>
    </button>

    Markierte Zeilen wurden geändert

    So prüfen Sie es Schalten Sie das Werkzeug ein. Die Ansage wechselt zu „aktiviert“.

  3. Den Link aus dem Knopf holen

    Zwei Bedienelemente ineinander ergeben ein unklares Ziel. Nebeneinander behalten Knopf und Link je eigene Rolle und eigenen Namen.

    KorrekturvergleichSchritt 3 · HTML

    Vorher

    <button type="button" aria-label="Fett">
      <span aria-hidden="true">B</span>
      <a href="/hilfe/fett">Hilfe</a>
    </button>

    Nachher

    <button type="button" aria-label="Fett">
      <span aria-hidden="true">B</span>
    </button>
    <a href="/hilfe/fett">Hilfe zum Fettdruck</a>

    Markierte Zeilen wurden geändert

    So prüfen Sie es Gehen Sie mit Tab durch die Leiste. Knopf und Hilfelink werden einzeln angesagt.

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.