Carousel Barrierefreiheit
Implementierte Verbesserungen
Die Carousel-Komponente wurde mit folgenden Barrierefreiheitsverbesserungen aktualisiert:
ARIA-Attribute
role="region"
- Definiert den Carousel als eigenständigen Bereicharia-roledescription="carousel"
- Beschreibt die Rolle des Elements als Carouselaria-label
- Bietet eine beschreibende Bezeichnung für das Carouselaria-describedby
- Verknüpft eine detaillierte Beschreibung mit dem Carouselaria-live
- Informiert Screenreader über Änderungen im Carousel
Für die einzelnen Slides:
role="tabpanel"
- Definiert jeden Slide als Panelaria-hidden
- Versteckt inaktive Slides vor Screenreadernaria-roledescription="slide"
- Beschreibt die Rolle des Elements als Slidetabindex
- Steuert die Fokussierbarkeit der Slides
Tastaturnavigation
- Pfeiltasten (links/rechts) zum Navigieren zwischen Slides
- Home/End-Tasten zum Springen zum ersten/letzten Slide
- Leertaste zum Pausieren/Fortsetzen der automatischen Wiedergabe
- Fokus-Management für aktive Slides
Pause-Funktion
- Pause-Button zum Anhalten der automatischen Wiedergabe
- Visuelles Feedback zum aktuellen Wiedergabestatus
- ARIA-Attribute für den Pause-Button (
aria-pressed
,aria-label
)
Screenreader-Unterstützung
- Status-Ankündigungen für aktuelle Slide-Position
- Beschreibende Texte für Screenreader-Benutzer
- Versteckte Hilfstexte mit
sr-only
-Klassen
Beispiel-Implementierung
<div
role="region"
aria-label={ariaLabel}
aria-roledescription="carousel"
aria-describedby={ariaDescription ? ariaDescriptionId : undefined}
tabIndex={0}
onKeyDown={handleKeyDown}
>
{/* Slides */}
<div
aria-live={isPaused ? "polite" : "off"}
>
{items.map((item, index) => (
<div
key={item.id}
id={`${carouselId}-slide-${index}`}
role="tabpanel"
aria-hidden={activeIndex !== index}
aria-label={item.ariaLabel || `Bild ${index + 1}`}
aria-roledescription="slide"
tabIndex={activeIndex === index ? 0 : -1}
data-slide-index={index}
>
{item.content}
</div>
))}
</div>
{/* Pause-Button */}
<button
type="button"
aria-label={isPaused ? "Wiedergabe starten" : "Wiedergabe pausieren"}
aria-pressed={isPaused}
onClick={togglePause}
>
{/* Icon */}
</button>
{/* Status für Screenreader */}
<div className="sr-only" aria-live="polite">
{`Bild ${activeIndex + 1} von ${totalItems}${isPaused ? ', Wiedergabe pausiert' : ''}`}
</div>
</div>
Barrierefreiheitstests
Die Carousel-Komponente wurde mit folgenden Tests auf Barrierefreiheit geprüft:
- Automatisierte Tests mit jest-axe zur Überprüfung der ARIA-Attribute
- Tastaturnavigation zur Sicherstellung der vollständigen Bedienbarkeit ohne Maus
- Screenreader-Tests zur Überprüfung der korrekten Ankündigungen
- Fokus-Management-Tests zur Sicherstellung der korrekten Fokusreihenfolge
Bekannte Einschränkungen
- Bei sehr komplexen Inhalten in den Slides kann die Tastaturnavigation innerhalb eines Slides schwierig sein
- Autoplay sollte standardmäßig deaktiviert sein, um die Barrierefreiheit zu verbessern