0Pricing
React Academy · Lektion

Fokus und Tastaturfallen in Modals verwalten

Halten Sie den Fokus für bessere Barrierefreiheit mit useRef und Event-Listenern in geöffneten Modals.

Fokus und Tastaturfallen in Modals verwalten ist eine kostenlose React Academy-Lektion auf CoddyKit. Dies ist Lektion 3 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des React Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der React Academy-Kurs umfasst insgesamt 4 Lektionen.

Willkommen

In dieser Lektion implementieren Sie eine Fokusfalle innerhalb eines Modals, damit Tastaturnutzer nicht per Tab aus einem geöffneten Modal heraus navigieren können – eine wichtige Anforderung an die Barrierefreiheit (WCAG 2.4.3).

Warum Fokusfallen erforderlich sind

Wenn ein Modal geöffnet wird, sollten Tastaturnutzer nur mit dessen Inhalt interagieren können. Ohne Fokusfalle verschiebt das Drücken der Tab-Taste den Fokus auf Elemente hinter dem Modal-Overlay – diese Elemente sind zwar visuell ausgeblendet, aber weiterhin erreichbar.

Was ist eine Fokusfalle?

Eine Fokusfalle fängt die Tastenereignisse Tab und Shift+Tab ab. Wenn der Fokus das Modal verlassen würde, wird er zum ersten oder letzten fokussierbaren Element innerhalb des Modals zurückgesetzt.

Fokussierbare Elemente finden

Verwenden Sie querySelectorAll mit einem Selektor, der alle interaktiven Elemente abdeckt. Filtern Sie deaktivierte und ausgeblendete Elemente heraus.
const FOCUSABLE = [
  'a[href]', 'button:not([disabled])',
  'input:not([disabled])', 'select', 'textarea',
  '[tabindex]:not([tabindex="-1"])'
].join(',');

const focusable = Array.from(
  modalRef.current.querySelectorAll(FOCUSABLE)
);

Die Fokusfalle implementieren

Hören Sie im Modal-Container auf das keydown-Ereignis. Wenn Tab gedrückt wird und der Fokus auf dem letzten Element liegt, verschieben Sie ihn zum ersten. Bei Shift+Tab verschieben Sie den Fokus vom ersten zum letzten Element.
function handleTab(e) {
  const focusable = /* array of focusable elements */;
  const first = focusable[0];
  const last = focusable[focusable.length - 1];
  if (e.key !== 'Tab') return;
  if (e.shiftKey) {
    if (document.activeElement === first) {
      e.preventDefault(); last.focus();
    }
  } else {
    if (document.activeElement === last) {
      e.preventDefault(); first.focus();
    }
  }
}

Den Fokus beim Öffnen verschieben

Wenn das Modal geöffnet wird, verschieben Sie den Fokus auf das erste fokussierbare Element darin (oder mit `tabIndex=-1` auf den Modal-Container selbst). Dadurch bleibt der Fokus nicht auf der Schaltfläche, die das Modal geöffnet hat.
useEffect(() => {
  if (isOpen) {
    const first = modalRef.current?.querySelector(FOCUSABLE);
    first?.focus();
  }
}, [isOpen]);

Den Fokus beim Schließen wiederherstellen

Wenn das Modal geschlossen wird, setzen Sie den Fokus auf das Element zurück, das vor dem Öffnen des Modals aktiv war. Speichern Sie beim Öffnen des Modals eine Ref auf `document.activeElement`.
const previousFocus = useRef(null);

useEffect(() => {
  if (isOpen) {
    previousFocus.current = document.activeElement;
  } else {
    previousFocus.current?.focus();
  }
}, [isOpen]);

Die Bibliothek focus-trap-react verwenden

Ziehen Sie für den Produktionseinsatz die Bibliothek **focus-trap-react** in Betracht. Sie behandelt alle Sonderfälle: Shadow DOM, Iframes, dynamisch hinzugefügte fokussierbare Elemente und die Deaktivierung durch Escape.
import FocusTrap from 'focus-trap-react';

{isOpen && (
  <FocusTrap>
    <div role="dialog" aria-modal="true">
      {children}
    </div>
  </FocusTrap>
)}

ARIA-Attribute für Modals

Fügen Sie dem Modal-Container `role="dialog"` und `aria-modal="true"` hinzu. Fügen Sie `aria-labelledby` hinzu, das auf die Überschrift des Modals verweist. Dadurch erkennen Screenreader, dass es sich um ein Modal handelt, und geben es korrekt aus.
<div
  role="dialog"
  aria-modal="true"
  aria-labelledby="modal-title"
>
  <h2 id="modal-title">Confirm Delete</h2>
  ...
</div>

Das inert-Attribut für den Hintergrund

Das HTML-Attribut `inert` an einem Container entfernt alle darin enthaltenen Elemente aus der Fokusreihenfolge und der Zugänglichkeit für Screenreader. Setzen Sie `document.getElementById('root').inert = true`, solange das Modal geöffnet ist, um den Hintergrund zuverlässig zu blockieren.
useEffect(() => {
  const root = document.getElementById('root');
  if (isOpen) root.setAttribute('inert', '');
  else root.removeAttribute('inert');
}, [isOpen]);

Schnelltest

Was sollte geschehen, wenn ein Tastaturnutzer auf dem letzten fokussierbaren Element innerhalb eines Modals mit Fokusfalle die Tab-Taste drückt?

Zusammenfassung

Sie haben eine Fokusfalle implementiert: fokussierbare Elemente finden, Tab/Shift+Tab abfangen, den Fokus beim Öffnen verschieben und beim Schließen wiederherstellen. Verwenden Sie für den Produktionseinsatz focus-trap-react und fügen Sie für Screenreader role='dialog' und aria-modal hinzu.

Als Nächstes

Nächste Lektion: **Tooltips und Dropdown-Menüs mit Portals** – Sie rendern Tooltips und Dropdowns mithilfe von createPortal außerhalb von Containern mit overflow-hidden.

Häufig gestellte Fragen

Ist die Lektion „Fokus und Tastaturfallen in Modals verwalten“ kostenlos?

Ja — der vollständige Text von „Fokus und Tastaturfallen in Modals verwalten“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des React Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der React Academy-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „Fokus und Tastaturfallen in Modals verwalten“?

Halten Sie den Fokus für bessere Barrierefreiheit mit useRef und Event-Listenern in geöffneten Modals. Du übst React Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um React Academy zu starten?

Keine Vorkenntnisse erforderlich. React Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 3 von 4.

Wie lange dauert die Lektion „Fokus und Tastaturfallen in Modals verwalten“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser React Academy-Lektion Code schreiben und ausführen?

Ja. Jede React Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. Was sind React-Portals?
  2. Eine Modal-Komponente mit Portals erstellen
  3. Fokus und Tastaturfallen in Modals verwalten
  4. Tooltips und Dropdown-Menüs mit Portals
← Zurück zu React Academy