Zum Inhalt springen

Tutorial

Tastaturfalle finden und beheben

1 Min. Lesezeit

Kurz gesagt

Eine Tastaturfalle liegt vor, wenn der Fokus in einen Bereich gerät und ihn weder mit Tab, Shift-Tab noch Escape verlassen kann. Häufigste Ursache ist ein selbstgebauter Fokus-Loop ohne Ausgang. Der Fix: Escape schließt, der Loop läuft nur solange die Komponente offen ist, und der Fokus kehrt zum auslösenden Element zurück. Am sichersten ist das native dialog-Element.

In Kürze

  1. Mit der Tastatur durchlaufen

    Ohne Maus die ganze Seite durchtabben, vom ersten bis zum letzten Element.

  2. Die Stelle markieren

    Wo der Fokus zurückspringt oder stehen bleibt, ist die Falle.

  3. Ausgang einbauen

    Escape schließt die Komponente, der Fokus-Loop endet mit ihr.

  4. Fokus zurückgeben

    Nach dem Schließen den Fokus auf das Element setzen, das die Komponente geöffnet hat.

In unserem eigenen Schweregrad-Katalog ist die Tastaturfalle der einzige Befund der Stufe „kritisch“, die eine ganze Seite betrifft. Der Grund ist einfach: Wer die Maus nicht nutzen kann, kommt an der Falle nicht vorbei. Alles danach, inklusive Warenkorb und Kasse, existiert für diese Person nicht mehr.

Woran es meistens liegt

  • Ein selbstgebauter Fokus-Loop in Dialog, Menü oder Off-Canvas-Navigation, der kein Escape kennt.
  • Eingebettete Fremdinhalte (Video-Player, Karten, Zahlungs-Widgets), die Tab abfangen.
  • Komponenten, die beim Schließen den Fokus nirgendwo hinsetzen: Er landet dann am Seitenanfang oder verschwindet ganz.
Vorher: Loop ohne AusgangJavaScript
// Fokusfalle: der Loop haelt den Fokus im Dialog fest,
// aber es gibt keinen Ausgang. Escape ist nicht belegt,
// und der Dialog laesst sich nur mit der Maus schliessen.
dialog.addEventListener("keydown", (event) => {
  if (event.key !== "Tab") return;
  const focusables = dialog.querySelectorAll("a, button, input");
  const first = focusables[0];
  const last = focusables[focusables.length - 1];

  if (event.shiftKey && document.activeElement === first) {
    event.preventDefault();
    last.focus();
  } else if (!event.shiftKey && document.activeElement === last) {
    event.preventDefault();
    first.focus();
  }
});

Der Loop selbst ist richtig und für Modals sogar gefordert. Falsch ist, dass es keinen Weg nach draußen gibt: kein Escape, kein Schließen per Tastatur.

Der Fix

Nachher: Loop mit Ausgang und RückkehrJavaScript
// Derselbe Loop, aber mit Ausgang und Rueckkehr.
let lastTrigger = null;

function openDialog(trigger) {
  lastTrigger = trigger;
  dialog.hidden = false;
  dialog.querySelector("[autofocus], button, a, input")?.focus();
  document.addEventListener("keydown", onKeydown);
}

function closeDialog() {
  dialog.hidden = true;
  document.removeEventListener("keydown", onKeydown);
  // Fokus zurueck an den Ausloeser: sonst landet er am Seitenanfang
  lastTrigger?.focus();
}

function onKeydown(event) {
  if (event.key === "Escape") {
    closeDialog();          // der Ausgang, den 2.1.2 verlangt
    return;
  }
  if (event.key === "Tab") {
    trapTabWithinDialog(event); // Loop nur, solange der Dialog offen ist
  }
}

Die robusteste Variante

Natives dialog-ElementHTML
<!-- Am robustesten: das native Element. Der Browser bringt
     Fokus-Loop, Escape und Rueckgabe des Fokus selbst mit. -->
<dialog id="confirm">
  <h2>Bestellung loeschen?</h2>
  <form method="dialog">
    <button value="cancel">Abbrechen</button>
    <button value="confirm">Loeschen</button>
  </form>
</dialog>

<script>
  document.getElementById("confirm").showModal();
</script>

Mit showModal() bringt der Browser Fokus-Loop, Escape und Fokusrückgabe von sich aus mit. Das ist deutlich weniger Code, der falsch sein kann, und die Fallstricke sind bereits gelöst.

Testen, in zwei Minuten

  1. Cursor in die Adresszeile setzen, dann nur mit Tab die Seite durchlaufen.
  2. Notieren, wo der Fokus stehen bleibt oder im Kreis läuft.
  3. In jedem Overlay Escape drücken: Schließt es, und wo landet der Fokus danach?
  4. Auch Shift-Tab prüfen: Manche Fallen halten nur eine Richtung fest.

Häufige Fragen

Ist ein Fokus-Loop im Modal nicht selbst eine Falle?
Nein, solange es einen Ausgang gibt. Ein Modal soll den Fokus halten, damit man nicht unbemerkt in den Hintergrund tabbt. Zur Falle wird es erst, wenn Escape und Schließen-Schaltfläche fehlen.
Was tun, wenn ein fremdes Widget die Falle verursacht?
Zuerst prüfen, ob es eine barrierefreie Konfiguration oder eine neuere Version gibt. Sonst hilft nur, das Widget zu ersetzen oder es hinter einen eigenen, tastaturbedienbaren Auslöser zu legen, den man wieder verlassen kann. Selbstgebaute Umgehungen im Fremdcode sind fragil.
Reicht es, den Fokus beim Schließen auf den Body zu setzen?
Technisch verlässt der Fokus damit die Falle, aber die Bedienposition geht verloren. Setze ihn auf das auslösende Element, dann kann man dort weitermachen, wo man war.

Kostenlosen Scan anfragen

Sagen Sie uns Ihre Domain - wir führen einen kostenlosen Erst-Scan durch und zeigen Ihnen die wichtigsten Barrieren.