Zum Inhalt springen
checkfrei
Menü

Buttons barrierefrei beschriften: aria-label für Symbol-Knöpfe

Stand: 3. Oktober 2026 · CAZ Labs

Kurz gesagt

Jeder Button braucht einen Namen, den ein Screenreader vorlesen kann. Bei Knöpfen mit sichtbarem Text ist das der Text selbst. Besteht ein Knopf nur aus einem Symbol, ergänzt du ein `aria-label`, zum Beispiel `aria-label="Menü öffnen"`, sonst hört der Nutzer nur "Schalter".

Warum das wichtig ist

Die typischen Kandidaten kennst du von fast jeder Seite: das Hamburger-Menü auf dem Handy, die Lupe neben dem Suchfeld, das Kreuz am Pop-up, die Pfeile am Bilder-Slider. Für sehende Besucher sind die Symbole klar. Ein Screenreader findet darin keinen Text und sagt "Schalter". Kommen vier solche Knöpfe hintereinander, weiß niemand mehr, welcher was tut.

Besonders ärgerlich ist es beim Menü-Knopf. Ist er unbeschriftet, finden blinde Besucher auf dem Smartphone womöglich gar nicht in die Navigation. Beim Cookie-Banner kann ein namenloses Kreuz bedeuten, dass jemand nicht erkennt, wie er den Banner schließt.

In den WCAG fällt das unter Erfolgskriterium 4.1.2 Name, Rolle, Wert, Stufe A. Jedes Bedienelement braucht einen Namen, den Hilfsmittel auslesen können.

So prüfst du es selbst

Geh mit der Tab-Taste durch deine Seite und lass dabei NVDA oder VoiceOver laufen. Bei jedem Knopf sollte eine verständliche Ansage kommen. Ohne Screenreader zeigen dir die Entwicklertools im Bereich für Barrierefreiheit den berechneten Namen eines Elements, axe DevTools und WAVE melden namenlose Buttons automatisch.

checkfrei sucht <button>-Elemente ohne Text, aria-label oder title. Ein solcher Knopf gibt eine Warnung, ab drei ist es ein Fehler. Eine Grenze hat die Prüfung: Baut eine Seite Knöpfe aus <div>- oder <span>-Elementen mit Klick-Skript, erkennen wir sie nicht als Button. Solche Konstrukte sind ein eigenes Problem, weil sie sich oft gar nicht per Tastatur bedienen lassen. Den kostenlosen Check startest du auf der Startseite.

So behebst du es

Zuverlässig funktioniert entweder ein aria-label am Button oder ein Text, der nur optisch versteckt ist. Das Symbol selbst bekommt aria-hidden="true", damit es nicht zusätzlich angesagt wird. Ein title zählt zwar auch als Name, ist aber die schwächste Lösung: Der Tooltip erscheint nur mit der Maus, und Screenreader behandeln ihn uneinheitlich.

HTML

aria-expanded sagt dem Screenreader zusätzlich, ob das Menü gerade offen ist. Das Skript, das das Menü öffnet, setzt den Wert auf true und beim Schließen wieder auf false.

html
<!-- Menü-Knopf mit aria-label und Zustand -->
<button type="button" aria-label="Menü" aria-expanded="false" aria-controls="hauptmenue">
  <svg aria-hidden="true" focusable="false" width="24" height="24">...</svg>
</button>

<!-- Alternative: versteckter Text neben dem Symbol -->
<button type="submit">
  <i class="fa fa-search" aria-hidden="true"></i>
  <span class="visually-hidden">Suchen</span>
</button>

WordPress

Unbeschriftete Knöpfe stecken fast immer im Theme oder in einem Plugin, also in Menü, Suche, Slider oder Cookie-Banner. Im Editor kommst du da nicht ran. Prüf zuerst, ob es ein Update gibt. Sonst passt du die Vorlage im Child-Theme an oder meldest es dem Entwickler mit einem konkreten Hinweis, welcher Button betroffen ist.

Von Overlay-Plugins, die per Skript nachträglich Beschriftungen einfügen, raten wir ab. Sie greifen erst nach dem Laden, raten bei der Bedeutung und ersetzen keinen sauberen Code.

Shopify

In Shopify-Themes liegen die Knöpfe in den Liquid-Dateien unter sections und snippets. Die meisten Themes bringen eine Klasse für nur optisch versteckten Text mit, oft heißt sie visually-hidden. Den Text ergänzt du am besten über die Übersetzungsdateien des Themes, damit er in jeder Shopsprache stimmt.

Next.js

In React und Next.js gilt dasselbe wie in HTML. Icon-Bibliotheken liefern das Symbol, den Namen des Buttons musst du selbst setzen.

tsx
import { Menu } from 'lucide-react';

export function MenueKnopf({ offen, umschalten }: { offen: boolean; umschalten: () => void }) {
  return (
    <button type="button" aria-label="Menü" aria-expanded={offen} onClick={umschalten}>
      <Menu aria-hidden="true" />
    </button>
  );
}

Typische Fehler

  • Ein aria-label, das dem sichtbaren Text widerspricht. Steht auf dem Knopf "Senden", sollte der Name nicht "Formular abschicken" lauten. Wer per Sprache steuert, sagt "Senden klicken", und nichts passiert.
  • Englische Namen auf deutschen Seiten, weil der Code aus einer Vorlage stammt, etwa aria-label="Toggle navigation".
  • Symbole, die per CSS als Hintergrundbild eingebunden sind, ohne Text im Button. Für den Screenreader ist der Knopf dann leer.

So prüft checkfrei

Wir suchen <button>-Elemente ohne Text, aria-label oder title. Einer gibt eine Warnung, ab drei ist es ein Fehler.

Gewicht 2 von 3 im Bereich Barrierefreiheit.

Häufige Fragen

Was ist der Unterschied zwischen aria-label und title?

Beide liefern einen Namen. aria-label ist für Hilfsmittel gedacht und wird zuverlässig vorgelesen. title erzeugt einen Tooltip bei Mausberührung, auf Touchgeräten und per Tastatur erscheint der nicht. Nimm aria-label.

Brauche ich ein aria-label, wenn der Button sichtbaren Text hat?

Nein. Sichtbarer Text ist der beste Name, den ein Button haben kann. Ein zusätzliches aria-label überschreibt ihn und führt schnell zu Widersprüchen.

Gilt das auch für Links, die wie Buttons aussehen?

Für Links gelten dieselben Grundsätze, sie werden aber getrennt geprüft. Mehr dazu im Ratgeber zu Linktexten.

Jetzt deine Seite prüfen

checkfrei prüft Beschriftete Schaltflächen und 68 weitere Punkte in einem Durchgang. Kostenlos und ohne Anmeldung.