CSS Navigation States
Active, Hover, Focus und Visited - so gestaltest du interaktive Navigations-Links.
Was sind Navigation States?
Links in einer Navigation haben verschiedene Zustände (States), die du visuell unterschiedlich gestalten kannst. Das hilft Nutzern zu verstehen, wo sie sind und was sie tun können.
Die vier States
- Normal - Standardzustand
- Hover - Maus darüber
- Focus - Per Tastatur ausgewählt
- Active/Current - Aktuelle Seite
Bonus-State
- Visited - Bereits besucht
- Seltener verwendet in Navigationen
- Nützlicher bei Link-Listen/Suchergebnissen
Die Reihenfolge der Pseudo-Klassen im CSS ist wichtig!
a:link { } /* L - Unbesuchter Link */
a:visited { } /* V - Besuchter Link */
a:hover { } /* H - Maus darüber */
a:focus { } /* F - Tastatur-Fokus */
a:active { } /* A - Wird gerade geklickt */
Active State - Aktuelle Seite markieren
Der Active State zeigt dem Nutzer: "Du bist hier!". Es gibt zwei Ansätze:
Eine CSS-Klasse .active oder das ARIA-Attribut
aria-current="page".
Variante 1: Mit CSS-Klasse
Der klassische Ansatz - du setzt manuell eine Klasse auf den aktuellen Link:
<nav>
<ul>
<li><a href="/">Home</a></li>
<li><a href="/about/" class="active">Über uns</a></li>
<li><a href="/contact/">Kontakt</a></li>
</ul>
</nav>
Variante 2: Mit aria-current (empfohlen)
Besser für Accessibility - Screenreader verstehen das Attribut:
<nav>
<ul>
<li><a href="/">Home</a></li>
<li><a href="/about/" aria-current="page">Über uns</a></li>
<li><a href="/contact/">Kontakt</a></li>
</ul>
</nav>
/* Styling mit aria-current */
nav a[aria-current="page"] {
background: var(--accent-blue);
color: white;
}
/* Oder kombiniert mit Klasse */
nav a.active,
nav a[aria-current="page"] {
background: var(--accent-blue);
color: white;
}
Styling-Varianten für Active State
Verschiedene Möglichkeiten, die aktuelle Seite hervorzuheben:
Background-Farbe
nav a.active {
background: var(--accent-blue);
color: white;
}
Unterstreichung
nav a {
position: relative;
}
nav a.active::after {
content: '';
position: absolute;
bottom: 0;
left: 0;
width: 100%;
height: 2px;
background: var(--accent-blue);
}
Border links (gut für Sidebar-Navs)
nav a.active {
border-left: 3px solid var(--accent-blue);
padding-left: calc(1rem - 3px); /* Padding anpassen */
background: var(--bg-tertiary);
}
Fettschrift + Farbe
nav a.active {
font-weight: 700;
color: var(--accent-blue);
}
Wenn du font-weight änderst, kann sich die Breite des Links
ändern und die Navigation "springt". Lösung: Feste Breite oder
letter-spacing anpassen.
Hover States - Interaktives Feedback
Hover-Effekte zeigen dem Nutzer: "Das ist klickbar!". Sie sollten subtil sein, aber deutlich genug, um wahrgenommen zu werden.
Verschiedene Hover-Effekte
Farbwechsel (einfach)
nav a {
color: var(--text);
transition: color 0.2s ease;
}
nav a:hover {
color: var(--accent-blue);
}
Background-Wechsel
nav a {
padding: 0.5rem 1rem;
border-radius: 4px;
transition: all 0.2s ease;
}
nav a:hover {
background: var(--bg-tertiary);
color: var(--accent-blue);
}
Animierte Unterstreichung
nav a {
position: relative;
}
/* Unsichtbare Linie */
nav a::after {
content: '';
position: absolute;
bottom: 0;
left: 50%; /* Startet in der Mitte */
width: 0; /* Unsichtbar */
height: 2px;
background: var(--accent-blue);
transition: all 0.3s ease;
}
/* Bei Hover: Linie wächst */
nav a:hover::after {
left: 0; /* Startet links */
width: 100%; /* Volle Breite */
}
Scale (Vergrößern)
nav a {
transition: transform 0.2s ease, color 0.2s ease;
}
nav a:hover {
transform: scale(1.05);
color: var(--accent-blue);
}
Text-Glow (subtil)
nav a {
transition: all 0.2s ease;
}
nav a:hover {
color: var(--accent-blue);
text-shadow: 0 0 10px rgba(79, 172, 254, 0.5);
}
Für flüssige Animationen: Nutze transform und
opacity statt width,
height oder margin. Diese
Properties können von der GPU beschleunigt werden.
Hover auf Touch-Geräten
Auf Touch-Geräten gibt es keine echte Hover-Funktion. Das kann zu Problemen führen, wenn wichtige Informationen nur bei Hover sichtbar werden.
/* Hover nur auf Geräten mit Maus/Trackpad */
@media (hover: hover) and (pointer: fine) {
nav a:hover {
color: var(--accent-blue);
background: var(--bg-tertiary);
}
nav a:hover::after {
left: 0;
width: 100%;
}
}
/* Für Touch-Geräte: Focus als Alternative */
@media (hover: none) {
nav a:active {
color: var(--accent-blue);
background: var(--bg-tertiary);
}
}
hover: hover- Gerät unterstützt echtes Hovernpointer: fine- Präzises Zeigegerät (Maus, Trackpad)hover: none- Kein echtes Hovern möglich (Touch)pointer: coarse- Unpräzises Zeigegerät (Finger)
Focus States - Tastatur-Navigation
Focus-Styles zeigen Tastatur-Nutzern, welches Element gerade ausgewählt ist. Sie müssen deutlich sichtbar sein - das ist keine Option, sondern Pflicht für Accessibility!
Verschiedene Focus-Styles
Demo: Tabbe Tab ⇥ durch die Links, um den Focus zu sehen:
Outline (Standard, verbessert)
nav a:focus {
outline: 2px solid var(--accent-blue);
outline-offset: 2px; /* Abstand zum Element */
}
Box-Shadow (folgt dem border-radius)
Tipp: outline
ignoriert
border-radius und bleibt eckig.
box-shadow passt sich der Form an.
nav a:focus {
outline: none; /* Nur OK wenn Ersatz vorhanden! */
box-shadow: 0 0 0 3px rgba(79, 172, 254, 0.4);
}
Kombination (Outline + Background)
nav a:focus {
outline: 2px solid var(--accent-cyan);
outline-offset: 2px;
background: var(--bg-tertiary);
}
:focus vs :focus-visible
Mit :focus-visible zeigst du den Focus-Ring nur bei
Tastatur-Navigation, nicht bei Mausklicks:
/* Focus nur bei Tastatur-Navigation */
nav a:focus-visible {
outline: 2px solid var(--accent-blue);
outline-offset: 2px;
}
/* Fallback für ältere Browser */
nav a:focus {
outline: 2px solid var(--accent-blue);
outline-offset: 2px;
}
/* Moderner Ansatz: Entferne bei Maus, behalte bei Tastatur */
nav a:focus:not(:focus-visible) {
outline: none;
}
Visited State - Besuchte Links
Der :visited-State zeigt an, welche Links bereits besucht wurden.
In Navigationen ist das selten sinnvoll, aber bei Link-Listen oder
Suchergebnissen sehr hilfreich.
/* Besuchte Links ausgrauen */
a:visited {
color: var(--text-muted);
}
/* Mit Häkchen-Indikator */
a:visited::before {
content: '✓ ';
color: var(--accent-green);
}
Aus Datenschutzgründen sind :visited-Styles stark
eingeschränkt. Du kannst nur diese Properties ändern:
colorbackground-color
border-coloroutline-color
Keine content, background-image
oder andere Properties - das würde erlauben, die Browsing-History auszulesen!
Wann :visited verwenden?
- Suchergebnisse
- Blog-Artikel-Listen
- Dokumentations-Inhaltsverzeichnisse
- Hauptnavigation (verwirrend)
- Footer-Links
Alles zusammen: Komplettes Beispiel
So sieht eine Navigation aus, die alle States kombiniert:
Demo: Hover, Focus (Tab) und Active kombiniert
/* Basis-Styles */
nav a {
position: relative;
padding: 0.75rem 1.25rem;
border-radius: 6px;
color: var(--text);
text-decoration: none;
transition: all 0.2s ease;
}
/* Animierte Unterstreichung vorbereiten */
nav a::after {
content: '';
position: absolute;
bottom: 0;
left: 50%;
width: 0;
height: 2px;
background: var(--accent-blue);
transition: all 0.3s ease;
}
/* Hover */
nav a:hover {
color: var(--accent-blue);
background: var(--bg-tertiary);
}
nav a:hover::after {
left: 0;
width: 100%;
}
/* Focus (Tastatur) */
nav a:focus {
outline: 2px solid var(--accent-cyan);
outline-offset: 2px;
}
/* Active (aktuelle Seite) */
nav a.active,
nav a[aria-current="page"] {
color: white;
background: var(--accent-blue);
}
/* Keine Unterstreichung bei aktiver Seite */
nav a.active::after,
nav a[aria-current="page"]::after {
display: none;
}
Zusammenfassung
| State | Wann? | Typisches Styling |
|---|---|---|
:hover |
Maus über Element | Farbwechsel, Background, Underline |
:focus |
Tastatur-Auswahl | Outline, Box-Shadow (sichtbar!) |
.active |
Aktuelle Seite | Hervorhebung (Background, Bold, Border) |
:visited |
Bereits besucht | Ausgegraute Farbe (nur bei Link-Listen) |
- Immer
transitionfür sanfte Übergänge - Focus-Style nie entfernen, nur ersetzen
aria-current="page"für Accessibility
- Hover und Focus ähnlich stylen (beide = "ausgewählt")
- Active State deutlich anders als Hover
- Nicht zu viele verschiedene Effekte kombinieren
Mehr aus CSS
Tutorials werden geladen...