ARIA mit JavaScript

Das Skript schaltet um, ARIA schreibt mit

Schaltfläche, Panel, Ausblendung: drei Stellen, die ein Skript gemeinsam ändert.

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

Zustand als Schaltplan

Ein Wahrheitswert steuert alle sichtbaren und unsichtbaren Signale

JavaScript hält Darstellung, Bedienung und Accessibility Tree in demselben Zustand.

Konzeptgrafik · ZustandsflussEine Schreibstelle verhindert widersprüchliche Ausgaben.

Auslöser

01Klick02Escape03Start
einzige SchreibstellezustandSetzen(neu)offen = true | false
sichtbare Flächepanel.hidden!offen
Accessibility Treearia-expandedString(offen)
GestaltungclassList.toggle('ist-offen', offen)
  1. Ereignisse entscheiden nur den nächsten Zustand. Sie schreiben keine Attribute oder Klassen selbst.
  2. Die Funktion rendert den vollständigen Zustand. Jeder Aufruf setzt alle drei Ausgaben erneut.
  3. Die Ausgaben bleiben ableitbar. Im DOM lässt sich sofort prüfen, ob sie zusammenpassen.

Derselbe Baustein in drei Zuständen

Die dritte Ansicht zeigt den Fehler, den eine zentrale Funktion verhindert.

geschlossenoffen = false
  • aria-expanded="false"
  • hidden ist vorhanden
  • Panel-Link fehlt im Tabulatorlauf
geöffnetoffen = true
  • aria-expanded="true"
  • hidden ist entfernt
  • Panel-Link liegt im Tabulatorlauf
auseinandergelaufennur Klasse geändert
  • aria-expanded="false"
  • Darstellung behauptet „offen“
  • Widerspruch für Bedienende

Welcher Zustand gehört wohin?

Nicht jede Änderung an der Oberfläche ist ein Auf- und Zuklappen.

aria-expandedEin Element zeigt oder verbirgt einen Bereich.Beispiel: Menü, Akkordeon, Aufklapper
aria-pressedEine Schaltfläche bleibt ein- oder ausgeschaltet.Beispiel: Fettdruck, Stummschaltung
role="status"Ein Ergebnis ändert sich, ohne den Fokus zu verschieben.Beispiel: gespeicherter Stand, Trefferzahl

Das vollständige Muster

HTML liefert den richtigen Startzustand. JavaScript setzt jede Ausgabe gemeinsam.

<div class="aufklapper">
  <h3>
    <button
      id="versand-schalter"
      type="button"
      aria-expanded="false"
      aria-controls="versand-panel">
      Versandkosten
    </button>
  </h3>

  <div id="versand-panel" hidden>
    <p>
      Ab 50 Euro liefern wir versandkostenfrei.
    </p>
    <a href="/versand">Zu den Versandarten</a>
  </div>
</div>
const schalter = document.querySelector(
  '#versand-schalter'
);
const panel = document.querySelector(
  '#versand-panel'
);
const aufklapper = document.querySelector(
  '.aufklapper'
);
let offen = false;

function zustandSetzen(neu) {
  offen = neu;
  panel.hidden = !offen;
  schalter.setAttribute(
    'aria-expanded',
    String(offen)
  );
  schalter.classList.toggle(
    'ist-offen',
    offen
  );
}

schalter.addEventListener('click', () => {
  zustandSetzen(!offen);
});

aufklapper.addEventListener('keydown', (event) => {
  if (event.key !== 'Escape' || !offen) return;
  zustandSetzen(false);
  schalter.focus();
});

zustandSetzen(false);

Vermeiden Sie eine CSS-Regel wie [hidden] { display: block; }. Eine eigene display-Angabe kann den verborgenen Zustand überschreiben. Die Klasse ist-offen ist nur ein Gestaltungshaken; aria-expanded trägt die Bedeutung.

So prüfen Sie es

  1. Prüfen Sie den Startzustand im DOM: aria-expanded="false" am Schalter, hidden am Panel.
  2. Aktivieren Sie den Schalter mit Enter und Leertaste. Beide Zustände wechseln bei jedem Aufruf gemeinsam.
  3. Tabben Sie weiter. Der Link im Panel ist nur im geöffneten Zustand erreichbar.
  4. Drücken Sie Escape im geöffneten Zustand. Das Panel schließt, und der Fokus bleibt am Schalter.

Aus dem Prüfbericht

Drei Stellen, drei Befunde

Kritisch Das Skript schreibt einen ungültigen Wert Regel aria-valid-attr-value

classList und textContent vertragen jeden String, aria-expanded nicht. Nur true und false kommen als Zustand an.

Anleitung: Gültige ARIA-Attributwerte setzen

Zum Mitnehmen

Das Skript, korrigiert

Ein Wert, ein Element, ein Attribut für Ausgabe und Tabfolge.

Korrektur in 3 Schritten ansehen
  1. Den Zustand als String setzen

    Der Attributwert wird aus derselben Variablen abgeleitet wie die Sichtbarkeit. So können beide nicht auseinanderlaufen.

    KorrekturvergleichSchritt 1 · JavaScript

    Vorher

    function umschalten(offen) {
      panel.hidden = !offen;
      knopf.setAttribute('aria-expanded', offen ? 'ja' : 'nein');
    }

    Nachher

    function umschalten(offen) {
      panel.hidden = !offen;
      knopf.setAttribute('aria-expanded', String(offen));
    }

    Markierte Zeilen wurden geändert

    So prüfen Sie es Klappen Sie den Bereich auf und sehen Sie in den Quelltext. Dort steht true oder false.

  2. Das Attribut an die Schaltfläche

    aria-expanded beschreibt den Auslöser, nicht den Inhalt. Am Panel ist es unzulässig und wird ignoriert.

    KorrekturvergleichSchritt 2 · JavaScript

    Vorher

    panel.setAttribute('aria-expanded', String(offen));
    panel.hidden = !offen;

    Nachher

    knopf.setAttribute('aria-expanded', String(offen));
    panel.hidden = !offen;

    Markierte Zeilen wurden geändert

    So prüfen Sie es Suchen Sie aria-expanded im gerenderten HTML. Es steht nur auf der Schaltfläche.

  3. Beim Schließen auch den Fokus nehmen

    hidden entfernt das Panel aus Ausgabe und Tabfolge. aria-hidden allein lässt die Links darin erreichbar.

    KorrekturvergleichSchritt 3 · JavaScript

    Vorher

    panel.setAttribute('aria-hidden', String(!offen));

    Nachher

    panel.hidden = !offen;

    Markierte Zeilen wurden geändert

    So prüfen Sie es Schließen Sie den Bereich und drücken Sie die Tabulatortaste. Der Fokus überspringt das Panel.

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.