Eine Navigationsleiste mit nav
Pack dein Menü in <nav> und setz die Links in eine Liste. Flexbox macht aus der Liste eine horizontale Leiste:
list-style: none und padding: 0 entfernen die Aufzählungspunkte und die Einrückung. display: block an jedem Link lässt seinen Innenabstand echten Platz in der Leiste einnehmen, der ganze Kasten mit Innenabstand ist also die Klickfläche. Lösch die Zeile mit display: flex, und dasselbe Menü wird zu einer senkrechten Liste, so sieht ein Menü in einer Seitenleiste aus.
<nav> selbst sieht nach nichts aus. Seine Aufgabe ist die Bedeutung: Screenreader stellen es als Landmark navigation bereit, ein Nutzer kann also mit einer Taste zum Menü springen oder es überspringen.
Die aktuelle Seite markieren
Füg dem Link zur angezeigten Seite aria-current="page" hinzu. Das sagt Screenreadern „du bist hier“ und gibt CSS einen Ansatzpunkt, um den Link hervorzuheben:
Verschieb aria-current="page" zu einem anderen Link, und die Hervorhebung folgt ihm. Wenn du das Attribut stylst statt einer Klasse .active, bleiben Aussehen und Barrierefreiheit synchron: Das eine gibt es nicht ohne das andere.
Mehrere navs auf einer Seite: Labels und Breadcrumbs
Eine Seite kann ein Hauptmenü, Breadcrumbs und ein Inhaltsverzeichnis haben, jedes in seinem eigenen <nav>. Gib jedem ein aria-label, damit ein Screenreader „Breadcrumb Navigation“ ansagt statt dreimal „Navigation“:
Breadcrumbs verwenden eine geordnete Liste <ol>, weil die Reihenfolge zählt. Die Schrägstriche kommen aus CSS ::before, Screenreader lesen also nicht zwischen jedem Eintrag „Schrägstrich“ vor. Der letzte Eintrag ist die aktuelle Seite und kein Link.
Ein Inhaltsverzeichnis
Eine Liste von Links zu Abschnitten derselben Seite ist ebenfalls Navigation. Links mit #id springen zu dem Element mit dieser id; probier sie in der Vorschau aus:
Hier kommt das Label von einer sichtbaren Überschrift über aria-labelledby, was besser ist als aria-label, wenn die Überschrift schon auf dem Bildschirm steht.
Ein Menü für Mobilgeräte zum Aufklappen
Auf schmalen Bildschirmen verstecken sich Menüs meistens hinter einem Button. Nimm einen echten <button> mit aria-expanded und lass die Links in <nav>:
aria-expanded sagt einem Screenreader, ob das Menü offen ist, und das Attribut hidden entfernt die Liste im geschlossenen Zustand sowohl vom Bildschirm als auch aus dem Barrierefreiheitsbaum. Auf breiten Bildschirmen würdest du die Liste per Media Query anzeigen und den Button verstecken.
Häufige Fehler
- Jede Gruppe von Links in
<nav>packen. Nimm es für das Hauptmenü, Breadcrumbs, Seitennummerierung und Inhaltsverzeichnisse. Links im Fließtext sind keine Navigationsblöcke. - Ein Menü-Button aus einem
<div>. Er lässt sich per Tastatur weder fokussieren noch auslösen. Nimm<button>. - Mehrere navs ohne Labels. Füg jedem
aria-labeloderaria-labelledbyhinzu, damit man sie auseinanderhalten kann. - Den aktuellen Link nur einfärben. Füg
aria-current="page"hinzu; Farbe allein wird nicht angesagt und ist vielleicht nicht für alle sichtbar. - Links mit
href="#"im Livebetrieb. In einer Demo sind sie in Ordnung, aber echte Menüeinträge brauchen echte URLs, damit sie auch in einem neuen Tab funktionieren. Wiehref-Werte funktionieren, erklärt die Seite zum HTML Link.
Häufig gestellte Fragen
Was ist das nav-Tag in HTML?
<nav> ist ein semantisches Element, das einen Block mit wichtigen Navigationslinks umschließt, etwa das Menü der Website, ein Inhaltsverzeichnis oder Breadcrumbs. Screenreader führen es als Landmark navigation auf, damit Nutzer direkt dorthin springen können.
Sollen Links in nav in einer Liste stehen?
Das ist das übliche Muster und ein gutes: Ein <ul> mit <li>-Einträgen lässt Screenreader ansagen, wie viele Links das Menü hat. Einfache Links direkt in <nav> sind ebenfalls gültig, zum Beispiel bei zwei oder drei Links in einer Reihe.
Braucht jede Gruppe von Links ein nav-Element?
Nein. Nimm <nav> nur für wichtige Navigationsblöcke. Ein paar Links in einem Absatz oder eine kurze Liste rechtlicher Links im Footer brauchen es nicht, und zu viele nav-Landmarks machen jede einzelne schwerer auffindbar.
Wie mache ich eine horizontale Navigationsleiste?
Setz die Links in ein <ul> in <nav> und gib der Liste display: flex; list-style: none; padding: 0; und ein gap. Flexbox ordnet die Einträge in einer Reihe an.
Wie zeige ich die aktuelle Seite in einer Navbar an?
Füg dem Link zur Seite, auf der der Nutzer gerade ist, aria-current="page" hinzu und style ihn mit dem Selektor [aria-current="page"]. Screenreader sagen ihn dann auch als aktuelle Seite an.
Darf eine Seite mehr als ein nav haben?
Ja, zum Beispiel ein Hauptmenü, eine Breadcrumb-Leiste und ein Inhaltsverzeichnis. Gib jedem ein anderes aria-label wie "Main" oder "Breadcrumb", damit Screenreader-Nutzer sie auseinanderhalten können.