Mobile Navigation
Responsive Hamburger-Menü für kleine Bildschirme - mit CSS-Animation und JavaScript.
Warum Mobile Navigation?
Auf kleinen Bildschirmen (Smartphones, Tablets) passt die normale horizontale Navigation oft nicht. Die Lösung: Ein Hamburger-Menü (☰), das die Navigation versteckt und bei Klick einblendet.
Moderne Websites werden oft Mobile First entwickelt: Zuerst das mobile Layout, dann per Media Query die Desktop-Version. Der Hamburger ist auf Mobile sichtbar, auf Desktop versteckt.
Desktop (ab ~768px)
- Horizontale Navigation sichtbar
- Hamburger-Button versteckt
- Dropdowns bei Hover/Klick
Mobile (unter ~768px)
- Navigation versteckt
- Hamburger-Button sichtbar
- Menü öffnet bei Klick
Der Hamburger-Button
Der klassische Hamburger besteht aus drei horizontalen Linien, die mit
<span>-Elementen erstellt werden. Bei Klick animieren sie
zu
einem "X".
Die HTML-Struktur
<button class="hamburger-btn"
id="hamburgerBtn"
aria-label="Menü öffnen"
aria-expanded="false">
<span></span>
<span></span>
<span></span>
</button>
aria-labelbeschreibt den Button für Screenreaderaria-expandedzeigt an, ob das Menü offen ist- Beide Attribute werden per JavaScript aktualisiert!
Das CSS für den Hamburger
/* Der Hamburger-Button */
.hamburger-btn {
display: flex;
flex-direction: column;
justify-content: space-between;
width: 30px;
height: 21px;
background: none;
border: none;
cursor: pointer;
padding: 0;
}
/* Die drei Linien */
.hamburger-btn span {
display: block;
height: 3px;
width: 100%;
background: var(--text-primary);
border-radius: 3px;
transition: all 0.3s ease;
transform-origin: center;
}
/* Animation: Hamburger → X */
.hamburger-btn.active span:nth-child(1) {
transform: rotate(45deg) translate(5px, 5px);
}
.hamburger-btn.active span:nth-child(2) {
opacity: 0;
transform: scaleX(0);
}
.hamburger-btn.active span:nth-child(3) {
transform: rotate(-45deg) translate(7px, -6px);
}
Die Animation funktioniert so: Die mittlere Linie verschwindet (opacity: 0),
die obere und untere rotieren und verschieben sich zu einem "X".
Variante 1: Slide-Down Menü
Das Menü klappt unterhalb des Headers auf - klassisch und einfach umzusetzen.
Die HTML-Struktur
<header>
<div class="header-content">
<a href="/" class="logo">MeineLogo</a>
<button class="hamburger-btn" id="hamburgerBtn"
aria-label="Menü öffnen" aria-expanded="false">
<span></span>
<span></span>
<span></span>
</button>
</div>
<nav class="mobile-menu" id="mobileMenu">
<ul>
<li><a href="#">Home</a></li>
<li><a href="#">Über uns</a></li>
<li><a href="#">Leistungen</a></li>
<li><a href="#">Kontakt</a></li>
</ul>
</nav>
</header>
Das CSS für Slide-Down
/* Mobile Menu - versteckt */
.mobile-menu {
max-height: 0;
overflow: hidden;
transition: max-height 0.3s ease;
}
/* Mobile Menu - offen */
.mobile-menu.open {
max-height: 300px; /* Groß genug für den Inhalt */
}
/* Menü-Liste */
.mobile-menu ul {
list-style: none;
padding: 1rem 0;
margin: 0;
}
.mobile-menu li {
border-bottom: 1px solid var(--border-color);
}
.mobile-menu li:last-child {
border-bottom: none;
}
.mobile-menu a {
display: block;
padding: 0.75rem 1rem;
color: var(--text);
text-decoration: none;
}
.mobile-menu a:hover {
background: var(--bg-secondary);
color: var(--accent-blue);
}
Das JavaScript
const hamburgerBtn = document.getElementById('hamburgerBtn');
const mobileMenu = document.getElementById('mobileMenu');
hamburgerBtn.addEventListener('click', function() {
// Button-Animation togglen
this.classList.toggle('active');
// Menü öffnen/schließen
mobileMenu.classList.toggle('open');
// Accessibility: aria-Attribute aktualisieren
const isOpen = mobileMenu.classList.contains('open');
this.setAttribute('aria-expanded', isOpen);
this.setAttribute('aria-label', isOpen ? 'Menü schließen' : 'Menü öffnen');
});
Variante 2: Slide-In von der Seite
Das Menü schiebt sich von links (oder rechts) ins Bild - oft mit einem halbtransparenten Overlay dahinter. Das ist bei Apps und modernen Websites sehr beliebt.
Das CSS für Slide-In
/* Slide-In Menu (von links) */
.slide-menu {
position: fixed; /* Oder absolute im Container */
top: 0;
left: 0;
width: 250px;
height: 100%;
background: var(--bg-tertiary);
border-right: 1px solid var(--border-color);
transform: translateX(-100%); /* Versteckt links */
transition: transform 0.3s ease;
z-index: 1000;
}
/* Menu offen */
.slide-menu.open {
transform: translateX(0); /* Eingeblendet */
}
/* Overlay (halbtransparent) */
.slide-overlay {
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: rgba(0, 0, 0, 0.5);
opacity: 0;
visibility: hidden;
transition: all 0.3s ease;
z-index: 999;
}
.slide-overlay.active {
opacity: 1;
visibility: visible;
}
Ändere einfach left: 0 zu right: 0
und translateX(-100%) zu
translateX(100%)!
Responsive: Mobile vs. Desktop
Mit Media Queries bestimmst du, wann der Hamburger sichtbar ist und wann die normale Navigation:
/* Mobile First: Hamburger sichtbar, Nav versteckt */
.hamburger-btn {
display: flex;
}
.desktop-nav {
display: none;
}
.mobile-menu {
/* Slide-Down oder Slide-In Styles */
}
/* Ab 768px: Desktop-Ansicht */
@media (min-width: 768px) {
/* Hamburger verstecken */
.hamburger-btn {
display: none;
}
/* Mobile Menu nie anzeigen */
.mobile-menu {
display: none !important;
}
/* Desktop Navigation anzeigen */
.desktop-nav {
display: flex;
gap: 2rem;
}
}
768px ist ein guter Standard-Breakpoint, aber teste immer mit deinem echten Inhalt! Manchmal braucht man 900px oder 1024px, je nachdem wie viele Menüpunkte es gibt.
Zusammenfassung
Slide-Down
- Menü klappt unter dem Header auf
- Einfach zu implementieren
- Gut für wenige Menüpunkte
- Schiebt den Content nach unten
Slide-In
- Menü schiebt von der Seite rein
- Overlay verdunkelt die Seite
- Gut für viele Menüpunkte
- Content bleibt an Ort und Stelle
aria-labelundaria-expandedfür Accessibility- Hamburger-Button groß genug für Touch (min. 44×44px Tappable Area)
- Menü schließt bei Klick auf einen Link
- ESC-Taste schließt das Menü (optional aber nice)
- Focus-Trap im offenen Menü (für Keyboard-Navigation)
Mehr aus HTML
Tutorials werden geladen...