Das Symptom
Jemand schaltet das Vorleseprogramm ein und hört sich die Seite an. Was herauskommt, klingt ungefähr so: „Grafik. Grafik. Link. Schaltfläche. Schaltfläche. Eingabefeld. Eingabefeld. Schaltfläche.“ Auf dem Bildschirm steht alles Nötige — ein Diagramm mit Beschriftung, ein Knopf mit Lupe, ein Formular mit Überschriften über den Feldern. Nur ist davon nichts angekommen. Die Seite ist nicht kaputt; sie ist stumm.
Die „Layer 8“-Wahrheit
Ein Vorleseprogramm liest nicht den Bildschirm. Es liest den Baum aus Namen und Rollen, den die Seite dem Betriebssystem übergibt — und was dort nicht eingetragen ist, existiert für diesen Weg nicht. Deshalb ist die Frage nie „warum sieht der Screenreader das Bild nicht“, sondern „was steht als Text daneben“. Erfolgskriterium 1.1.1 der WCAG verlangt genau das: Jeder Nicht-Text-Inhalt, der dem Benutzer dargeboten wird, hat eine Textalternative, die denselben Zweck erfüllt. Mit ausdrücklichen Ausnahmen — und die wichtigste davon wird ständig missverstanden.
Denn 1.1.1 verlangt gerade nicht, dass jedes Bild beschrieben wird. Reine Dekoration soll laut Ausnahme so eingebunden sein, dass sie von der assistiven Technik ignoriert werden kann. Das heißt: Ein leeres Alternativattribut ist eine richtige Antwort, keine faule. Falsch ist nur die dritte Möglichkeit, das Attribut wegzulassen. Dann steht dort weder eine Beschreibung noch die Anweisung zu schweigen, und das Vorleseprogramm behilft sich mit dem Einzigen, was da ist: dem Dateinamen. Wer je gehört hat, wie eine Seite dreizehnmal „I M G Unterstrich 4 4 7 1 Punkt p n g“ vorliest, versteht, warum die Ausnahme kein Schlupfloch, sondern eine Pflicht ist.
Die zweite Hälfte des Problems sitzt bei den Bedienelementen und heißt 4.1.2: Für alle Bedienelemente müssen Name und Rolle programmatisch ermittelbar sein, vom Benutzer setzbare Zustände und Werte programmatisch setzbar, und Änderungen daran müssen gemeldet werden. Ein Knopf, auf dem nur eine Lupe zu sehen ist, hat eine Rolle, aber keinen Namen. Ein Formularfeld, über dem optisch „Postleitzahl“ steht, hat einen Namen — nur eben nicht seinen eigenen, sondern den eines Absatzes irgendwo in der Nähe. Optische Nähe ist keine Verbindung. Sie ist eine Verabredung zwischen Gestalter und sehendem Leser, an der der Rest nicht teilnimmt.
Der reflexhafte Reparaturversuch besteht darin, ARIA-Attribute über alles zu gießen. Das W3C selbst rät als Erstes davon ab: Wenn es ein natives Element mit der gewünschten Bedeutung und dem gewünschten Verhalten gibt, soll man es nehmen, statt ein anderes umzuwidmen. Das Dokument, in dem diese Regel steht, ist inzwischen als Discontinued Draft eingestuft — die vier Regeln wurden ausdrücklich zur Weiterverwendung darin belassen, und das Verständnisdokument zu 4.1.2 sagt sachlich dasselbe: Standard-Steuerelemente erfüllen das Kriterium bereits, wenn man sie spezifikationsgemäß verwendet. Ein Kasten mit aufgeklebter Knopfrolle erfüllt gar nichts; er behauptet nur etwas, und Fokus, Tastaturbedienung und Zustandsmeldung muss man danach von Hand nachbauen. Das kann gelingen. Es gelingt nur selten, und niemand merkt es, weil es beim Danebenklicken funktioniert.
In Apps ist die Lage identisch, nur das Vokabular wechselt: Dort heißt die Textalternative contentDescription, und Androids eigene Anleitung sagt bemerkenswert genau, was hineingehört — Zweck und Ergebnis der Bedienung, nicht das Aussehen. Sie warnt sogar vor dem Überfüllen: Bei einem Knopf, der etwas absendet, gehört „Absenden“ hinein und nicht „Absenden-Knopf“, weil die Rolle ohnehin mitgesprochen wird. Und Textelemente brauchen überhaupt nichts, weil ihr Text bereits vorgelesen wird.
Was diesen Fehler so hartnäckig macht: Er ist auf dem Bildschirm unsichtbar. Keine Meldung, kein roter Rahmen, keine Fehlerkonsole. Die einzige Prüfung, die ihn zuverlässig findet, ist die, die niemand macht — die Seite einmal anhören, statt sie anzusehen. Zehn Minuten, kein Werkzeug, kein Budget. Und danach eine Liste, die sich abarbeiten lässt, statt eines Gefühls, dass „da bestimmt noch was ist“.