WCAG mit JavaScript

Zustände ansagen, nicht nur umschalten

Aufklapper, Symbolknopf, verborgener Bereich: vier Stellen im Skript.

Website prüfen
Beispiel im Prüfbericht Markierter Befund
Markierter Befund · Kritisch · WCAG 4.1.2aria-expanded="maybe" ist ungültig

JavaScript als Zustandsleitung

Eine Eingabe muss vier Ebenen erreichen

Sicht, DOM, Fokus und Ansage müssen nach jedem Skriptlauf denselben Zustand zeigen.

Schematische Ablaufansicht eines Aufklappers. Die Schichtnotiz dient als Beispiel, nicht als bedienbares Element.
HTML-StartSchichtnotiz öffnen<button>
EingabeEnter oder Leertasteclick
SkriptZustand umkehrenoff → on
DOMAttribut + Inhalttrue + sichtbar
Ausgabe„erweitert“Fokus bleibt
Zustand Azugeklappt
Schichtnotiz öffnen
Inhalt ist nicht im Layout
TabSchalterHilfe-Link
DOM
aria-expanded="false" + hidden
Ansage
„Schichtnotiz öffnen, Schaltfläche, reduziert“
Zustand Baufgeklappt
Schichtnotiz öffnen
Übergabe an SpätschichtTor 2 prüfen. Vollständige Notiz
TabSchalterNotiz-LinkHilfe-Link
DOM
aria-expanded="true", kein hidden
Ansage
„Schichtnotiz öffnen, Schaltfläche, erweitert“
Die PrüffrageHat das Skript nur Pixel geändert – oder auch den Zustand, den Browser und Hilfstechnik erhalten?

Vier Stellen, an denen die Leitung abreißt

Jedes Bild zeigt eine andere Trennung zwischen sichtbarer Oberfläche und programmatischem Zustand.

Nur ein Symbol

Die Aktion ist sichtbar, aber der Name der Schaltfläche fehlt.

button name = ""
Freier Zustandswert

Das Skript erfindet einen Wert, den aria-expanded nicht kennt.

true | false
Unsichtbar und fokussierbar

aria-hidden entfernt einen Link nicht aus der Tastaturfolge.

hidden
Bedienelement im Bedienelement

Zwei Aktionen teilen sich eine Struktur und widersprechen der erwarteten Bedienung.

nebeneinander

Der kurze Weg: native Schaltfläche, ein Zustand

Ein echtes button-Element liefert Name, Rolle sowie Enter- und Leertasten-Bedienung. Das Skript spiegelt nur noch denselben booleschen Zustand in aria-expanded und hidden.

2.1.1 TastaturDie native Schaltfläche löst den Klick mit Tastatur und Zeiger aus.

4.1.2 Name, Rolle, WertName und Rolle kommen aus HTML; der geänderte Aufklappzustand bleibt programmatisch verfügbar.

<button id="notiz-schalter" type="button"
  aria-expanded="false"
  aria-controls="notiz-inhalt">
  Schichtnotiz öffnen
</button>

<div id="notiz-inhalt" hidden>
  <p>Tor 2 prüfen.</p>
  <a href="/notiz">Vollständige Notiz</a>
</div>

<script>
  const schalter =
    document.querySelector('#notiz-schalter');
  const inhalt =
    document.querySelector('#notiz-inhalt');

  schalter.addEventListener('click', () => {
    const offen =
      schalter.getAttribute('aria-expanded') === 'true';

    schalter.setAttribute(
      'aria-expanded',
      String(!offen)
    );
    inhalt.hidden = offen;
  });
</script>

So prüfen Sie es

  1. TabDer Fokus erreicht den Schalter sichtbar und überspringt den zugeklappten Inhalt.
  2. Enter und LeertasteBeide Tasten wechseln denselben Zustand wie ein Klick.
  3. DOM beobachtenaria-expanded und hidden wechseln immer als Paar.
  4. Weiter tabbenGeöffnet folgt der Notiz-Link; geschlossen folgt direkt das nächste Element der Seite.

Aus dem Prüfbericht

Vier Befunde in einem Widget

Zum Mitnehmen

Das Aufklapp-Widget, korrigiert

Ein gültiger Zustand, eine Zeile im Klick-Handler, zwei getrennte Bedienelemente.

Korrektur in 3 Schritten ansehen
  1. Den Zustand gültig ausgeben

    aria-expanded kennt nur true und false. hidden nimmt den geschlossenen Bereich aus Bildschirm und Tab-Reihenfolge, statt ihn nur vor Vorleseprogrammen zu verstecken.

    KorrekturvergleichSchritt 1 · HTML

    Vorher

    <button id="notiz" type="button" aria-controls="notiz-text"
      aria-expanded="maybe">
      Schichtnotiz öffnen
    </button>
    <div id="notiz-text" aria-hidden="true">…</div>

    Nachher

    <button id="notiz" type="button" aria-controls="notiz-text"
      aria-expanded="false">
      Schichtnotiz öffnen
    </button>
    <div id="notiz-text" hidden>…</div>

    Markierte Zeilen wurden geändert

    So prüfen Sie es Drücken Sie Tab bei geschlossener Notiz. Der Fokus springt über den Bereich hinweg.

  2. Beim Klick den Zustand mitschreiben

    Der Zustand im HTML muss dem sichtbaren Zustand folgen. Eine Zeile im Klick-Handler hält beide zusammen.

    KorrekturvergleichSchritt 2 · JavaScript

    Vorher

    button.addEventListener('click', () => {
      panel.hidden = !panel.hidden;
    });

    Nachher

    button.addEventListener('click', () => {
      panel.hidden = !panel.hidden;
      button.setAttribute('aria-expanded', String(!panel.hidden));
    });

    Markierte Zeilen wurden geändert

    So prüfen Sie es Klappen Sie die Notiz auf. Ein Vorleseprogramm sagt an der Schaltfläche jetzt „erweitert“.

  3. Symbolknopf benennen und Link herauslösen

    Ein Link in einer Schaltfläche legt zwei Aktionen auf eine Fläche. Getrennt hat jede ihren eigenen Namen.

    KorrekturvergleichSchritt 3 · HTML

    Vorher

    <button type="button" class="drucken">
      <svg aria-hidden="true"><use href="#icon-druck"></use></svg>
      <a href="/hilfe">Hilfe</a>
    </button>

    Nachher

    <button type="button" class="drucken" aria-label="Notiz drucken">
      <svg aria-hidden="true"><use href="#icon-druck"></use></svg>
    </button>
    <a href="/hilfe">Hilfe</a>

    Markierte Zeilen wurden geändert

    So prüfen Sie es Gehen Sie mit Tab durch die Zeile. Erst der Knopf, dann der Link.

Werbung

Kostenloser Website-Barrierefreiheits-Check

Website auf Barrierefreiheit prüfen.

Technische WCAG-Warnsignale erkennen. Kritische Stellen zuerst prüfen.

Der Website-Check ist bereit.

Werbung

Ein letzter Schritt

Prüfen, bevor Sie gehen.

Finden Sie automatisch erkennbare Barrieren auf Ihrer eigenen Website.

Website prüfen

Kostenlos starten · keine Installation

Automatisches Screening. Tastaturbedienung und Screenreader bleiben manuelle Prüfung.