Zum Inhalt springen

Tutorial

Statusmeldungen, die auch ankommen

1 Min. Lesezeit

Kurz gesagt

Eine Statusmeldung muss angesagt werden, ohne den Fokus zu verschieben. Dafür braucht es eine Live-Region, die schon im DOM steht, bevor die Meldung kommt: role="status" (entspricht aria-live="polite"). Wird der Container samt Text neu eingefügt, hören viele Screenreader nichts.

In Kürze

  1. Leere Live-Region anlegen

    Setze einmal ein <div role="status"> in die Seite, leer und visuell versteckt.

  2. Nur den Text setzen

    Bei einem Ereignis den Textinhalt der bestehenden Region ändern, nicht die Region neu bauen.

  3. Polite statt assertive

    Bestätigungen sind polite. assertive unterbricht die laufende Ausgabe und ist nur für Dringendes.

  4. Mit Screenreader prüfen

    Aktion auslösen, ohne hinzusehen: Wird die Meldung angesagt, und bleibt der Fokus, wo er war?

Kriterium 4.1.3 ist das, was zuletzt auffällt, weil optisch nichts kaputt wirkt: Der Toast erscheint, die Trefferzahl aktualisiert sich, der Filter greift. Nur erfährt das niemand, der gerade nicht auf diese Stelle schaut. Genau diese Fälle findet unsere Ebene für dynamische Inhalte, indem sie die Interaktion auslöst und beobachtet, was semantisch danach passiert.

Die drei typischen Fehler

Vorher: stumm oder zu lautJavaScript
<!-- 1. Toast wird samt Text neu ins DOM gehaengt:
     oft kommt gar keine Ansage an, weil die Live-Region
     im selben Moment erst entsteht -->
<script>
  const toast = document.createElement("div");
  toast.className = "toast";
  toast.textContent = "In den Warenkorb gelegt";
  document.body.appendChild(toast);
</script>

<!-- 2. Ergebniszahl aendert sich stumm -->
<p class="results">42 Treffer</p>

<!-- 3. Alles laut: assertive fuer eine harmlose Bestaetigung
     unterbricht die laufende Ausgabe -->
<div aria-live="assertive">Filter angewendet</div>

Der erste Fall ist der häufigste und der tückischste: Die Live-Region entsteht im selben Moment wie ihr Inhalt. Viele Screenreader beobachten aber nur Regionen, die es schon gab, und melden deshalb nichts. Im Prüfbericht steht dann „Live-Region mit Inhalt eingefügt“, und genau das ist gemeint.

Die verlässliche Umsetzung

Nachher: Region existiert, Text wird gesetztHTML
<!-- Die Live-Region steht von Anfang an im DOM und ist leer.
     Spaeter wird nur ihr Text gesetzt: das loest die Ansage aus. -->
<div id="status" role="status" aria-live="polite" class="sr-only"></div>

<p class="results">
  <span id="result-count" role="status">42 Treffer</span>
</p>

<script>
  function announce(message) {
    const region = document.getElementById("status");
    // Leeren und im naechsten Frame setzen: identische Texte
    // hintereinander werden sonst nicht erneut angesagt.
    region.textContent = "";
    requestAnimationFrame(() => {
      region.textContent = message;
    });
  }

  announce("In den Warenkorb gelegt");
</script>
Visuell versteckt, aber vorhandenCSS
/* Visuell versteckt, aber im Accessibility-Tree vorhanden.
   Nicht display:none verwenden: das entfernt die Region komplett. */
.sr-only {
  position: absolute;
  width: 1px;
  height: 1px;
  padding: 0;
  margin: -1px;
  overflow: hidden;
  clip-path: inset(50%);
  white-space: nowrap;
  border: 0;
}

polite, assertive oder Fokus

  • role="status" (polite): Bestätigungen, Trefferzahlen, Ladezustände. Wartet, bis die laufende Ausgabe fertig ist.
  • role="alert" (assertive): Fehler und Warnungen, die sofort ankommen müssen. Unterbricht, deshalb sparsam einsetzen.
  • Fokuswechsel: für Ereignisse, bei denen sich auch die Bedienposition ändern soll, etwa eine Fehlerzusammenfassung nach dem Absenden.

Details, die den Unterschied machen

  • Zweimal derselbe Text hintereinander wird oft nicht erneut angesagt: vorher leeren, dann im nächsten Frame setzen.
  • Halte die Meldung kurz und vollständig: „In den Warenkorb gelegt: Laufschuh 4711“ ist besser als „Erfolg“.
  • Verschwindet ein Toast nach drei Sekunden, ist die Information für langsamere Ausgaben weg. Lass wichtige Meldungen stehen oder wiederhole sie an einer bleibenden Stelle.
  • Eine einzige Live-Region pro Zweck reicht. Mehrere gleichzeitig erzeugen Überlagerungen.

Testen

  1. Screenreader starten, Aktion mit der Tastatur auslösen, wegsehen: Kommt eine Ansage?
  2. Prüfen, ob der Fokus dort geblieben ist, wo er war (Statusmeldungen dürfen ihn nicht stehlen).
  3. Dieselbe Aktion zweimal auslösen: Wird beim zweiten Mal wieder angesagt?

Häufige Fragen

Warum hört man nichts, obwohl aria-live gesetzt ist?
Meist, weil die Region gemeinsam mit ihrem Text ins DOM kam oder weil sie mit display:none versteckt ist. Die Region muss vorher existieren, sichtbar oder per sr-only versteckt, und nur ihr Inhalt darf sich ändern.
Was ist der Unterschied zwischen role="status" und aria-live="polite"?
Praktisch keiner: role="status" bringt aria-live="polite" und aria-atomic="true" mit. Die Rolle ist die kürzere und robustere Schreibweise.
Zählt ein Ladebalken als Statusmeldung?
Der Wechsel „lädt“ zu „fertig“ ist eine Statusmeldung und sollte angesagt werden. Für den Fortschritt selbst eignet sich role="progressbar" mit aktualisiertem aria-valuenow, sonst wird bei jedem Prozentschritt gesprochen.

Kostenlosen Scan anfragen

Sagen Sie uns Ihre Domain - wir führen einen kostenlosen Erst-Scan durch und zeigen Ihnen die wichtigsten Barrieren.