Semantisches HTML
HTML-Elemente werden für ihre Bedeutung verwendet, nicht nur für ihr Standardaussehen. Ein `<button>` wird als Schaltfläche angekündigt; ein `<div onclick>` als nichts. Die überwiegende Mehrheit der Barrierefreiheitsfehler lässt sich auf aufgegebene Semantik zurückführen.
Semantisches HTML bezeichnet HTML, bei dem jedes Element nach seiner
Bedeutung gewählt wird, nicht nur nach seinem Aussehen. Ein <button>
dient Aktionen. Ein <nav> umschließt die Navigation. Ein <table> enthält
tabellarische Daten. Ein <div> zu verwenden, das wie eine Schaltfläche
aussieht, ist ein semantischer Fehler — auch wenn das visuelle Ergebnis
identisch ist.
Die überwiegende Mehrheit der Barrierefreiheitsfehler lässt sich auf aufgegebene Semantik zurückführen. Fast jeder Fehler bei assistiven Technologien hat dieselbe Grundursache: ein generisches Element übernimmt die Aufgabe eines semantischen Elements, das genau dafür vorgesehen war.
Warum Screenreader das betrifft
Screenreader machen HTML über den Accessibility Tree zugänglich — eine interne Repräsentation, die aus dem DOM aufgebaut wird und jedes Element einer Rolle, einem Namen, einem Zustand und Eigenschaften zuordnet. Der Accessibility Tree ist das, was der Nutzende tatsächlich hört.
Ein nativer <button> wird im Accessibility Tree als button "Absenden"
geführt. Ein <div>, das wie eine Schaltfläche aussieht, wird als generic
geführt — der Screenreader kündigt also nichts Sinnvolles an, und der
Nutzende hat keine Möglichkeit zu erkennen, dass das Div interaktiv ist.
Dieselbe Logik gilt für:
- Überschriften (
<h1>–<h6>) — Screenreader ermöglichen es Nutzenden, zwischen Überschriften zu springen, um eine Seite zu überfliegen.<div class="heading">erscheint nicht in der Überschriftenliste. - Listen (
<ul>,<ol>,<li>) — Screenreader kündigen „Liste, 5 Einträge“ an, bevor vorgelesen wird.<div>-Elemente, die Listeneinträge imitieren, tun das nicht. - Formulare —
<input>mit verbundenem<label>wird vorgelesen als „E-Mail, Textfeld“. Ein benutzerdefiniertes Eingabefeld aus Divs undcontenteditablewird gar nicht angekündigt. - Tabellen —
<table>mit<th>-Zeilen-/Spaltenüberschriften ermöglicht Nutzenden, Datentabellen zellenweise mit angekündigtem Kopfzeilenkontext zu navigieren. CSS-Grids aus Divs hingegen nicht.
Das Ersetzungsmuster
Die Korrektur hat fast immer dieselbe Form:
<div onclick="...">→<button>(oder<a href>für Navigation).<span class="link">→<a href>.<div role="heading">→<h1>bis<h6>.- Benutzerdefinierte Dropdowns →
<select>wo das Design es erlaubt, oder ein erprobtes ARIA-Combobox-Muster, wo es das nicht tut. - Tabs aus gestalteten
<div>-Elementen → Tab-Muster aus dem ARIA Authoring Practices Guide.
Wann ARIA eingesetzt werden sollte
Die erste Regel von ARIA lautet: ARIA nicht verwenden, wenn ein natives
Element die Aufgabe erfüllt. ARIA-Rollen, -Zustände und -Eigenschaften
sind ein Patch für Fälle, in denen natives HTML das aufzubauende Widget
nicht beschreiben kann (Baumansichten, Multi-Select-Comboboxen, bestimmte
Modal-Muster). Sie sind kein Ersatz für die Verwendung von <button>.
Ein pragmatisches Audit
Der schnellste Weg, semantischen Verfall in einer Codebasis aufzudecken:
nach onclick auf div- und span-Elementen suchen. Jeder Treffer ist
ein potenzieller Fehler. Der nächstschnellere Weg: nach role=-Attributen
suchen. ARIA ist in begrenzten Kontexten sinnvoll, aber ein hoher ARIA-Anteil
deutet häufig darauf hin, dass native Elemente aus Styling-Gründen übergangen
wurden, die den Verzicht gar nicht erfordert hätten.