Navigation/Grundstruktur

Aus SELFHTML-Wiki
Wechseln zu: Navigation, Suche

Unter einer Navigation versteht man gewöhnlich in Abgrenzung zu anderen Navigationstechniken die Haupt-Navigation einer Webseite, mit der man bequem die Unterseiten des Projekts erreichen kannst. Ursprünglich als reine Liste einzelner Links angelegt, wuchs mit steigendem Umfang der Webprojekte das Bedürfnis, die Links zu sortieren und übersichtlich zu präsentieren.

Dieses Kapitel zeigt, wie eine Navigation aufgebaut werden sollte. Diese Grundstruktur wird in den folgenden Kapiteln als Grundlage für umfangreichere Navigationen verwendet.

HTML-Aufbau

Für die Navigationsleiste wird im Allgemeinen eine Aufzählungsliste verwendet. Hiermit hast Du nicht nur ein strukturelles Element, das dem Sinn einer Navigation, nämlich der Auflistung von Verweisen, recht gut entspricht, sondern auch gleich drei verschachtelte Elemente, die Du über CSS formatieren kannst: ul, li und a.

nav

Damit wir das Menü unabhängig von anderen Listen und Verweisen formatieren können, setzen wir es in ein nav-Element.

ein einfaches Menü ansehen …
<nav>
   <ul>
      <li><a href="#">Seite 1</a></li>
      <li><a href="#">Seite 2</a></li>
      <li><a href="#">Seite 3</a></li>
      <li><a href="#">Seite 4</a></li>
  </ul>
</nav>

Bei komplexeren Webprojekten können die Listen beliebig verschachtelt werden.

Hinweis:
Navigationsleisten und Menüs mit Verweisen sollten mit dem nav-Element umschlossen werden.

Das menu-Element war für Werkzeugleisten und Toolbars vorgesehen und ist obsolet.

Verlinke nicht auf die aktuelle Seite

Um Nutzer eine Orientierung zu geben, auf welcher Seite sie sich gerade befinden, sollte die aktuelle Seite deutlich gekennzeichnet und nicht anklickbar sein.

Früher wurde das Navigationselement der aktuellen Seite mit einem Klassennamen oder einem span-Element anstatt des Links gekennzeichnet. Diese Lösungen haben den Nachteil, dass sie nicht von Screenreadern und Suchmaschinen gelesen werden können.

Die aktuelle Seite wird nicht verlinkt! ansehen …
<nav>
  <ul>
    <li><a href="seite_1.html">Seite 1</a></li>
    <li><a href="" aria-current="page">aktuelle Seite</a></li>
    ...

</nav>

Die aktuelle Seite wird mit dem ARIA-Attribut aria-current="page" ausgezeichnet. So können auch Suchmaschinen und Screenreader erkennen, dass dies die aktuelle Seite ist. Mit dem Attributselektor kann dieser Menü-Punkt mit CSS formatiert werden.

Beachte: In einer früheren Version wurde das href-Attribut der aktuellen Seite weggelassen. Dies führte bei Screenreadern zu potentieller Verwirrung, da sich so beim Vorlesen die Reihenfolge/Nummer der Links beim Wechsel auf die Unterseiten änderte.

Seit Januar 2024 fügen wir ein leeres href-Attribut ein.

--Matthias Scharwies (Diskussion) 17:06, 23. Jan. 2024 (CET)

Oben oder unten?

Wo sollte ich die Navigation im Markup der Webseite platzieren? Oben wäre sie gleich erreichbar - falls Sie unten wäre, könnten Nutzer gleich auf die Inhalte zugreifen und die Navigation könnte per CSS beliebig positioniert werden.

Es ist eine Konvention, dass Inhaltsverzeichnisse am Anfang eines Buches stehen. Auch bei Webseiten sucht der Nutzer von oben links nach unten rechts und erwartet die Navigation oben.[1][2] (Dass sie nicht die halbe Seite einnehmen und mit CSS entsprechend formatiert werden sollte, wird in den Folgekapiteln besprochen.)

Die visuelle Reihenfolge sollte der Reihenfolge im DOM entsprechen; andernfalls dürften sehende Tastaturnutzer und sehende Screenreader-Nutzer ziemlich verwirrt sein. Um Nutzer von Screenreadern gleich zum Inhalt zu führen, kannst Du Skip-Links verwenden.

Einfache Menüs mit CSS

Für unsere Navigation verwenden wir die oben besprochene Aufzählungsliste. Hiermit hast Du nicht nur ein strukturelles Element, das dem Sinn einer Navigation, nämlich der Auflistung von Verweisen, recht gut entspricht, sondern auch gleich drei verschachtelte Elemente, die Du über CSS formatieren kannst: ul, li und a.

ein einfaches Menü
<nav>
   <ul>
      <li><a href="#">Seite 1</a></li>
      <li><a href="" aria-current="page">aktuelle Seite</a></li>
      <li><a href="#">Seite 3</a></li>
      <li><a href="#">Seite 4</a></li>
      <li><a href="#">Seite 5</a></li>
      <li><a href="#">Seite 6</a></li>
  </ul>
</nav>

Verweise zu Schaltfläche machen

Damit wir jetzt anklickbare Schaltflächen bekommen, stylen wir die einzelnen Elemente mit CSS:

  • Entfernen der Aufzählungszeichen
  • Breite und Innenabstand
  • Hintergrund- und Textfarbe
ein einfaches Menü mit CSS, das den ausgewählten Link zeigt ansehen …
  nav ul {
    list-style: none; 	
	// Safari hack, see https://www.scottohara.me/blog/2019/01/12/lists-and-safari.html
	list-style: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg'/%3E");  
    width: 10em;
    border: thin solid;
    background-color: silver;

  }
  nav li {
    margin: 0.5em; 
    border: thin solid;
    background-color: #eee;
  }
  nav a {
    text-decoration: none; 
    font-weight: bold;
    color: var(--accent1-color); 
    background-color: var(--background-color);
  }
[aria-current=page]{
	background: var(--accent2-color);
}

  nav a:focus,
  nav a:hover,
  nav a:active {    
    text-decoration:underline;
  }
:root {
	--background-color: midnightblue;
	--accent1-color: gold;
	--accent2-color: darkred;	
	--text-color: black;
}

In diesem Menü sind die einzelnen Elemente eingefärbt:

  • nav ul erhält einen silbernen Hintergrund und eine Breite von 10em. Mit list-style: none werden die Aufzählungspunkte entfernt. Beachte den großen Innenabstand links vor den Listenelementen, der mit einer Festlegung von padding später entfernt wird.
Beachten Sie: Der Safari hat einen Bug, dass Listen ohne Aufzählungszeichen nicht als solche vorgelesen werden. In einen weiteren Regelsatz wird list-style ein leeres SVG-Element zugewiesen. Das Aufzählungszeichen wird so nicht dargestellt.[3]
  • nav li erhält einen grauen Hintergrund und mit margin einen Außenabstand zu den anderen Listenelementen
  • nav a verliert mit text-decoration: none; seine Unterstreichung und wird nun dunkelblau mit goldener Schrift dargestellt. Es fehlt allerdings noch das typische Balken-Aussehen, da a als Inline-Element nur den für seinen Inhalt erforderlichen Raum einnimmt.
  • nav a:focus, nav a:hover; Wenn Du einen Link mit Maus oder Tastatur anwählst, wird die Unterstreichung wieder eingeblendet.
  • Im :root-Selektor werden die Farben als custom properties definiert. So kannst Du die Navigation mit nur wenigen Handgriffen an ihr Farbschema anpassen.


Beachte: In diesem Beispiel sind Verweise durch die farbigen Schaltflächen als solche erkennbar. Ausgewählte Verweise sind nur durch den geänderten cursor bei Geräten mit Mausbedienung und die Unterstreichung erkennbar.
Kennzeichne Links als solche immer mit mindestens zwei gut erkennbaren Merkmalen wie z.B. Unterstreichung oder blaue Textfarbe!

Rollover-Effekt

Linkelemente können per Maus oder per Tastatur ausgewählt werden. Über die Pseudoklasse :hover bzw. :focus kannst Du ausgewählte Elemente selektieren und ihre Formatierung ändern.

Rollover-Effekt ansehen …
    nav a {
      display: block;
      padding: 0.4em;
      text-decoration: none; 
      font-weight: bold;
      border: thin solid var(--background-color);
      border-radius: .5em;
    color: var(--accent1-color); 
    background-color: var(--background-color);
      transition: all .25s ease-in;	  
    }

  nav li[aria-current] a {
	background-color: var(--accent2-color); 
  }
	
    nav a:focus,
    nav a:hover,
    nav li[aria-current] a:focus,
    nav li[aria-current] a:hover {    
      color: var(--background-color); 
      background-color: var(--accent1-color); 
    }

Durch display: block nimmt das Linkelement die gesamte zur Verfügung stehende Breite (=Breite des Listenelements innerhalb der 10em breiten Liste) ein.

Ausgewählte Verweise werden durch eine Änderung der Hintergrundfarbe (sowie dazu passend der Schriftfarbe) gekennzeichnet. Hierdurch ergibt sich ein Rollover-Effekt. Um dies eleganter wirken zu lassen, wird die Farbänderung bei :hover oder :focus durch transition um 0.25 Sekunden verzögert, sodass ein Nachglüh-Effekt entsteht.

Empfehlung: Halte Deine Navigation so kurz wie möglich!

Nachträglich eingefügte Listenelemente erschweren den Nutzern die schnelle Orientierung!

Gerade vertikale Menüs verführen dazu, noch schnell einen weiteren Listenpunkt anzuhängen!


Vertikal oder horizontal?

Du kannst eine Navigationsleiste mit wenigen Menüpunkten auch horizontal anordnen (Quernavigation). Hierfür existieren mehrere verschiedene Möglichkeiten mit unterschiedlichen Vor- und Nachteilen. Die einfachere Möglichkeit ist, die li-Elemente per display: inline darzustellen. Dies ermöglicht auch deren Zentrierung über eine auf das Eltern-Element angewandte Eigenschafts-/Wertkombination von text-align: center.

horizontale Formatierung der Listenelemente
nav ul {
    text-align: center;
    /* weitere Angaben */
}

nav li {
    display: inline-block;
    /* weitere Angaben */
}

Einen Nachteil hat diese Methode jedoch: Bei einem Umbruch der Navigationsleiste in zu kleinen Browserfenstern kommt es zu Überlagerungen. Dieser Effekt kann zwar auch bewusst zu gestalterischen Zwecken eingesetzt werden, verschlechtert allerdings die Nutzbarkeit. Achte darauf, dass in den Menütexten kein Zeilenumbruch stattfindet. Falls die Menüpunkte Leerzeichen enthalten, kannst Du mithilfe von white-space: nowrap; den automatischen Zeilenumbruch verbieten.

Responsive Navigation

Besser wäre es, wenn sich die Navigation bei einem genügend großen Viewport horizontal anordnen würde, auf kleineren Geräten jedoch weiterhin untereinander positioniert würde.

Dafür eignen sich Grid Layout oder Flexbox.

Responsive Navigation ansehen …
nav ul {
  display: flex;
  flex-direction: column;
} 

nav li {
  list-style: none;
  margin: 0.5em;
  padding: 0;
  font-size: 1.5em;  
}

@media (min-width: 45em) {
  nav ul {	
    flex-direction: row;  
  }
  nav li {
    font-size: 1em;
  }  
}
  • nav ul wird mit display: flex; zum Flex-Container, in dem die Kindelemente durch flex-direction: column; untereinander angeordnet werden.
  • nav li erhält mit font-size: 1.5em eine größere Schriftgröße, dass die Schaltflächen auch auf kleinen Viewports groß genug sind.
  • In einer media query wird für größere Viewports ab 45em Breite eine andere Formatierung festgelegt:
    • flex-direction: row; wechselt auf horizontale Darstellung innerhalb einer Reihe.
    • nav li erhält wieder die „normale“ Schriftgröße

Dieses Beispiel verzichtet auf feste Breiten. Diese werden je nach Platz vom Browser festglegt!


Empfehlung: Öffne dieses Beispiel mit Rechtsklick in einem neuen Tab und verändere die Größe des Browserfensters.


Weblinks

  1. Erwartungskonformität (kommdesign.de).
  2. Dialogprinzipien wurden überarbeitet und heißen jetzt Interaktionsprinzipien Usability-Norm ISO 9241-110 in neuer Auflage erschienen
  3. Fixing Lists! (scottohara.me)