Modal-Komponente: Barrierefreiheit
Diese Dokumentation beschreibt die Barrierefreiheitsfunktionen der Modal-Komponente und gibt Hinweise zur korrekten Verwendung für eine optimale Zugänglichkeit.
ARIA-Attribute und Rollen
Die Modal-Komponente verwendet folgende ARIA-Attribute und Rollen, um die Barrierefreiheit zu verbessern:
role="dialog"
oderrole="alertdialog"
: Gibt die Rolle des Modals anaria-modal="true"
: Zeigt an, dass der Modal-Dialog modal ist (blockiert Interaktionen mit dem Rest der Seite)aria-labelledby
: Verweist auf die ID des Modal-Titelsaria-describedby
: Verweist auf die ID der Modal-Beschreibung oder des Modal-Inhaltsaria-hidden="true"
: Für das Overlay, um es vor Screenreadern zu versteckenaria-label="Close"
: Für den Schließen-Button
Tastaturnavigation
Die Modal-Komponente unterstützt folgende Tastaturinteraktionen:
- Tab: Navigiert durch fokussierbare Elemente innerhalb des Modals
- Shift+Tab: Navigiert rückwärts durch fokussierbare Elemente
- Escape: Schließt den Modal (wenn
closeOnEsc={true}
) - Enter/Space: Aktiviert Buttons innerhalb des Modals
Fokus-Management
Die Modal-Komponente implementiert folgende Fokus-Management-Strategien:
- Fokus-Falle: Der Fokus bleibt innerhalb des Modals, wenn er geöffnet ist
- Initialer Fokus: Der Fokus wird automatisch auf das erste fokussierbare Element gesetzt
- Fokus-Wiederherstellung: Der Fokus kehrt zum auslösenden Element zurück, wenn der Modal geschlossen wird
Beispiele für barrierefreie Verwendung
Einfacher Dialog
<Modal
isOpen={isOpen}
onClose={handleClose}
title="Einstellungen speichern"
description="Wählen Sie, ob Sie Ihre Änderungen speichern möchten."
footerButtons={true}
onCancel={handleCancel}
onConfirm={handleSave}
cancelButtonText="Abbrechen"
confirmButtonText="Speichern"
>
<p>Möchten Sie Ihre Änderungen speichern?</p>
</Modal>
Alert-Dialog
<Modal
isOpen={isOpen}
onClose={handleClose}
title="Warnung"
description="Warnung vor dem Löschen eines Elements."
isAlertDialog={true}
footerButtons={true}
onCancel={handleCancel}
onConfirm={handleDelete}
cancelButtonText="Abbrechen"
confirmButtonText="Löschen"
>
<p>Diese Aktion kann nicht rückgängig gemacht werden. Sind Sie sicher?</p>
</Modal>
Formular-Dialog
<Modal
isOpen={isOpen}
onClose={handleClose}
title="Neuen Benutzer erstellen"
description="Formular zum Erstellen eines neuen Benutzers."
footerButtons={true}
onCancel={handleCancel}
onConfirm={handleSubmit}
cancelButtonText="Abbrechen"
confirmButtonText="Erstellen"
>
<form>
<div className="mb-4">
<label htmlFor="name" className="block mb-2">Name</label>
<input
id="name"
type="text"
className="w-full p-2 border rounded"
value={name}
onChange={(e) => setName(e.target.value)}
aria-required="true"
/>
</div>
<div className="mb-4">
<label htmlFor="email" className="block mb-2">E-Mail</label>
<input
id="email"
type="email"
className="w-full p-2 border rounded"
value={email}
onChange={(e) => setEmail(e.target.value)}
aria-required="true"
/>
</div>
</form>
</Modal>
Best Practices
- Immer einen Titel verwenden: Der Titel hilft Screenreader-Benutzern, den Zweck des Modals zu verstehen
- Beschreibung hinzufügen: Eine Beschreibung gibt zusätzlichen Kontext
- Korrekte Rolle verwenden:
alertdialog
für wichtige Warnungen,dialog
für normale Dialoge - Escape-Taste unterstützen: Ermöglicht das schnelle Schließen des Modals
- Fokus-Management implementieren: Stellt sicher, dass Tastaturbenutzer nicht "gefangen" werden
- Deutliche Aktionsbuttons: Klare Beschriftungen für Aktionen wie "Speichern", "Abbrechen", "Löschen"
- Visuelles Feedback: Deutliche visuelle Unterscheidung zwischen primären und sekundären Aktionen
Bekannte Einschränkungen
- Verschachtelte Modals: Können Probleme mit dem Fokus-Management verursachen
- Sehr lange Inhalte: Können bei einigen Screenreadern zu Problemen führen
- Dynamische Inhalte: Änderungen im Modal-Inhalt werden möglicherweise nicht von allen Screenreadern angekündigt