Zum Hauptinhalt springen

aria-label richtig einsetzen, mit Beispielen für Buttons und Menüs

Wann du aria-label brauchst, wann nicht und was besser funktioniert. Mit HTML-Beispielen für Icon-Buttons, Menüs, Navigation und gleichlautende Links.

Veröffentlicht am 5 Min. Lesezeit

Bedienfeld in einem Aufzug mit runden Tasten, die nur Pfeilsymbole und Braille-Punkte tragen, aber keine Beschriftung

Das Wichtigste in Kürze

  • aria-label gibt einem Element einen zugänglichen Namen, den Screenreader und Sprachsteuerung nutzen.
  • Gebraucht wird es vor allem bei Buttons und Links ohne sichtbaren Text, etwa bei Icons für Menü, Suche oder Schließen.
  • Ein sichtbarer Text ist fast immer besser als ein aria-label. Wo es einen gibt, braucht es kein aria-label.
  • Steht sichtbarer Text auf dem Element, muss er im aria-label enthalten sein, sonst funktioniert die Sprachsteuerung nicht.
  • Auf div- und span-Elementen ohne Rolle wirkt aria-label nicht zuverlässig. Nutze echte Buttons und Links.

Von Benny ScheyVeröffentlicht am

Stell dir einen Aufzug vor, in dem die Tasten keine Beschriftung haben. Nur Pfeile, die irgendwie nach „auf“ und „zu“ aussehen. Mit etwas Übung findest du dich zurecht. Wer die Symbole nicht sehen kann, hat ohne Braille-Punkte keine Chance.

Auf Websites passiert genau das ständig. Ein Button mit drei Strichen für das Menü, eine Lupe für die Suche, ein X zum Schließen. Für sehende Besucher ist das klar. Ein Screenreader findet dort nur „Schalter“, ohne zu sagen, was der Schalter tut. Hier kommt aria-label ins Spiel.

Was aria-label macht

aria-label ist ein HTML-Attribut aus dem Standard WAI-ARIA. Es gibt einem Element einen Namen, den sogenannten zugänglichen Namen. Diesen Namen lesen Screenreader vor, und Sprachsteuerungen nutzen ihn, wenn jemand „Klick auf Menü“ sagt.

Auf der Seite selbst ist aria-label nicht zu sehen. Es ändert weder das Aussehen noch das Verhalten eines Elements. Es beschreibt nur.

Icon-Button ohne und mit Namen
<!-- Screenreader: "Schalter" -->
<button>
  <svg aria-hidden="true">…</svg>
</button>

<!-- Screenreader: "Menü öffnen, Schalter" -->
<button aria-label="Menü öffnen">
  <svg aria-hidden="true">…</svg>
</button>

Das aria-hidden am Icon sorgt dafür, dass der Screenreader die Grafik selbst überspringt. Den Namen liefert der Button.

Die erste Regel, erst HTML, dann ARIA

Die Fachleute beim W3C, die ARIA entwickeln, sagen es selbst deutlich. Wenn ein normales HTML-Element das Gewünschte schon kann, nimm das HTML-Element. ARIA ist für die Fälle gedacht, in denen HTML allein nicht reicht.

Für aria-label heißt das: Ein sichtbarer Text ist fast immer besser. Er hilft allen Besuchern, auch denen, die ein Icon nicht verstehen, und er wird von Übersetzungs-Werkzeugen zuverlässiger erfasst.

Sichtbarer Text statt aria-label
<!-- braucht kein aria-label, der Text ist der Name -->
<button>Menü</button>

<!-- Icon und Text zusammen, das Icon ist nur Schmuck -->
<button>
  <svg aria-hidden="true">…</svg>
  Suche
</button>

Wann du aria-label brauchst

Das ist der häufigste und wichtigste Fall. Menü, Suche, Schließen, Teilen, Warenkorb, Social-Media-Links im Footer. Wenn kein sichtbarer Text da ist, braucht das Element einen Namen.

Social-Media-Links im Footer
<a href="https://www.linkedin.com/in/…" aria-label="LinkedIn-Profil von Lisa Berger">
  <svg aria-hidden="true">…</svg>
</a>

Beschreibe dabei die Funktion, nicht das Aussehen. „Schließen“ statt „X“, „Suche“ statt „Lupe“.

Mehrere Navigationen auf einer Seite

Viele Websites haben ein Hauptmenü oben und ein Menü im Footer. Screenreader können direkt zu Navigationsbereichen springen und zeigen sie als Liste an. Ohne Namen heißen sie dort alle nur „Navigation“.

Navigationsbereiche benennen
<nav aria-label="Hauptmenü">…</nav>
<nav aria-label="Rechtliches">…</nav>

Das Wort „Navigation“ gehört nicht in den Namen, der Screenreader sagt es ohnehin dazu.

Ein Menü-Button, der auf- und zuklappt

Bei einem Menü-Button kommt zum Namen noch der Zustand dazu. Dafür gibt es aria-expanded. Der Name bleibt gleich, der Zustand wechselt per JavaScript zwischen true und false.

Menü-Button mit Zustand
<button aria-label="Menü" aria-expanded="false" aria-controls="hauptmenue">
  <svg aria-hidden="true">…</svg>
</button>
<nav id="hauptmenue" aria-label="Hauptmenü" hidden>…</nav>

NVDA sagt dann zum Beispiel „Menü, Schalter, reduziert“ und nach dem Öffnen „erweitert“. So weiß jeder, ob das Menü gerade offen ist.

Wann du aria-label nicht brauchst

Wenn schon ein sichtbarer Text da ist

Ein Button mit der Aufschrift „Termin buchen“ hat bereits einen Namen. Ein zusätzliches aria-label wäre im besten Fall überflüssig. Im schlechtesten Fall widerspricht es dem sichtbaren Text, denn aria-label ersetzt ihn für den Screenreader.

Auf div und span ohne Rolle

Ein div oder span hat für Hilfsmittel keine Bedeutung. Ein aria-label darauf wird je nach Browser und Screenreader ignoriert. Wenn etwas klickbar ist, sollte es ein echter Button oder Link sein. Dann funktionieren auch Tastatur und Fokus von allein.

Echter Button statt div
<!-- schlecht: kein Fokus, keine Tastatur, Name wird oft ignoriert -->
<div class="close" aria-label="Schließen" onclick="schliessen()">×</div>

<!-- gut -->
<button type="button" aria-label="Schließen">×</button>

Für lange Beschreibungen

aria-label ist für einen kurzen Namen gedacht, nicht für Erklärungen. Für Hilfetexte und Fehlermeldungen an Formularfeldern gibt es aria-describedby. Es verweist auf einen sichtbaren Text, den der Screenreader nach dem Namen vorliest.

Hilfetext an einem Formularfeld
<label for="telefon">Telefon</label>
<input id="telefon" type="tel" aria-describedby="telefon-hilfe">
<p id="telefon-hilfe">Nur für Rückfragen zu deinem Termin.</p>

Sichtbarer Text muss im Namen stecken

Ein Fehler, der oft übersehen wird: Ein Link zeigt „Mehr erfahren“, das aria-label lautet aber „Details zur Website-Betreuung“. Für Screenreader ist das sogar besser. Wer aber Sprachsteuerung nutzt, sagt „Klick auf Mehr erfahren“, und nichts passiert, weil der Name ganz anders lautet.

Die WCAG verlangen deshalb, dass der sichtbare Text im zugänglichen Namen enthalten ist, am besten am Anfang.

Gleichlautende Links
<!-- schlecht: sichtbarer Text fehlt im Namen -->
<a href="/leistungen/website-betreuung/" aria-label="Details zur Website-Betreuung">Mehr erfahren</a>

<!-- besser: sichtbarer Text am Anfang des Namens -->
<a href="/leistungen/website-betreuung/" aria-label="Mehr erfahren über Website-Betreuung">Mehr erfahren</a>

<!-- am besten: ein Linktext, der für sich allein verständlich ist -->
<a href="/leistungen/website-betreuung/">Mehr zur Website-Betreuung</a>

aria-labelledby und versteckter Text

Gibt es den passenden Text schon sichtbar auf der Seite, etwa eine Überschrift, kannst du mit aria-labelledby darauf verweisen. Der Vorteil: Ändert sich die Überschrift, ändert sich der Name mit.

Bereich nach seiner Überschrift benennen
<section aria-labelledby="preise-titel">
  <h2 id="preise-titel">Preise und Pakete</h2>
  …
</section>

Eine dritte Möglichkeit ist Text, der nur für Screenreader sichtbar ist. Er steht im HTML, wird aber per CSS optisch versteckt. Viele Frameworks bringen dafür eine Klasse mit, oft sr-only oder visually-hidden genannt. Anders als aria-label wird dieser Text von Übersetzungs-Werkzeugen zuverlässig mit übersetzt.

Versteckter Text für Screenreader
<a href="/kontakt/">
  <svg aria-hidden="true">…</svg>
  <span class="sr-only">Kontakt</span>
</a>

So prüfst du den Namen eines Elements

Du musst nicht raten, was ein Screenreader vorliest. In den Entwicklertools von Chrome und Firefox gibt es einen Bereich für Barrierefreiheit. Wähle ein Element aus, und du siehst seinen berechneten Namen und seine Rolle.

Für die ganze Seite auf einmal eignet sich die kostenlose Erweiterung axe DevTools. Sie meldet Buttons und Links ohne Namen als eigenen Fehler. Bei allen Websites, die ich baue, läuft diese Prüfung vor dem Start, im hellen und im dunklen Design.

Wie du deine Seite außerdem selbst mit einem Screenreader testest, steht im Beitrag Website mit Screenreader testen. Für Bilder statt Buttons gilt das gleiche Prinzip, nur mit dem alt-Attribut. Dazu mehr im Beitrag Alt-Texte für Bilder schreiben.

Kurz zusammengefasst

aria-label gibt Elementen ohne sichtbaren Text einen Namen. Nutze es für Icon-Buttons, Icon-Links und um mehrere Navigationen zu unterscheiden. Wo ein sichtbarer Text möglich ist, ist er die bessere Lösung. Und wenn ein Element sichtbaren Text hat, muss dieser Text im Namen vorkommen.

Einen ausführlichen Überblick über ARIA insgesamt, mit Rollen, Zuständen und Live-Regionen, habe ich im Beitrag ARIA richtig nutzen bei gehirngerecht.digital (öffnet in neuem Tab) geschrieben. Ob dein Unternehmen nach dem Barrierefreiheitsstärkungsgesetz handeln muss, klärt der Ratgeber zum BFSG.

Titelbild: Foto von Nils R. Barth über Wikimedia Commons, Lizenz CC0 (öffnet in neuem Tab).

Schlagworte:BarrierefreiheitARIAHTMLButtons

Häufige Fragen

  • Was ist der Unterschied zwischen aria-label und aria-labelledby?

    aria-label enthält den Namen direkt als Text. aria-labelledby verweist auf ein anderes Element auf der Seite, dessen sichtbarer Text dann als Name dient, etwa eine Überschrift. Gibt es diesen Text schon sichtbar, ist aria-labelledby die bessere Wahl. Sind beide gesetzt, gewinnt aria-labelledby.

  • Wird aria-label auf der Seite angezeigt?

    Nein. aria-label ist nur für Hilfsmittel wie Screenreader und Sprachsteuerung gedacht. Wer die Seite sieht, bekommt davon nichts mit. Deshalb ist ein sichtbarer Text meist besser, denn er hilft allen.

  • Hilft aria-label bei SEO?

    Nicht direkt. Suchmaschinen werten vor allem sichtbare Inhalte aus. aria-label ist ein Werkzeug für Barrierefreiheit, kein Platz für Keywords.

  • Wie finde ich Buttons ohne Namen auf meiner Website?

    Die Browser-Erweiterung axe DevTools meldet Buttons und Links ohne zugänglichen Namen. In den Entwicklertools von Chrome und Firefox siehst du im Bereich Barrierefreiheit für jedes Element den berechneten Namen.

Alle Beiträge