switch
Kennzeichnet ein Element als Ein/Aus-Schalter. Funktional einer Checkbox ähnlich, wird jedoch als "switch, on" oder "switch, off" angekündigt statt als "checked" — besser geeignet für Einstellungsschalter. Ein natives HTML-Äquivalent existiert bislang nicht.
Verwendung
Für ein binäres Einstellungselement, bei dem „ein“ und „aus“ den Zustand besser beschreiben als „aktiviert“ und „deaktiviert“ — WLAN, Dunkelmodus, Benachrichtigungen, Flugmodus. Da es kein natives HTML-Schalter-Element gibt, stehen zwei gültige Ansätze zur Verfügung:
<button type="button" role="switch" aria-checked="false">— bevorzugt, da der native Fokus und die Aktivierung des Buttons übernommen werden.<input type="checkbox" role="switch">— ebenfalls akzeptabel; die Formularübermittlung funktioniert weiterhin, und die Rollenüberschreibung ändert die Ansage durch assistive Technologien.
role="switch" sollte nicht für Elemente verwendet werden, die nicht wirklich binär sind. Wenn die Aktion eine Navigation auslöst, ein Menü öffnet oder einen Prozess startet, ist button oder link die richtige Wahl.
Tastatur- und Fokusvertrag
Gemäß dem APG-Schalter-Muster:
- Tab verschiebt den Fokus auf den Schalter.
- Leertaste schaltet
aria-checkedum. Enter sollte ebenfalls umschalten (das APG empfiehlt beides, da Benutzer bei einem button-basierten Schalter ein button-ähnliches Verhalten erwarten). - Der Fokus verbleibt nach dem Umschalten auf dem Schalter.
aria-checked akzeptiert bei einem Schalter nur "true" oder "false" — "mixed" ist hier ungültig.
Häufige Fehler
role="switch"ohnearia-checkedbeim ersten Rendern. Der Zustand ist erforderlich.aria-checked="mixed"bei einem Schalter. Dieser Wert ist nur für Checkboxen gültig.aria-pressedstattaria-checkedverwenden.aria-pressedgehört auf einen Umschalter (z. B. Stummschalten/Ton einschalten), bei dem der Button eine Aktion ausführt. Ein Schalter hingegen repräsentiert einen Einstellungszustand.- Ein Schalter, der
aria-checkedbei reiner CSS-Umschaltung nicht aktualisiert. - Zu kleine Schaltflächen-Treffbereiche, die WCAG 2.5.8 (Zielgröße) nicht erfüllen. Der interaktive Bereich muss mindestens 24 × 24 CSS-Pixel erreichen.
Beispiel
<button
type="button"
role="switch"
aria-checked="false"
onclick="
const next = this.getAttribute('aria-checked') === 'true' ? 'false' : 'true';
this.setAttribute('aria-checked', next);
"
>
Dark mode
</button>