HTML Multi-Level Navigation
Verschachtelte Dropdown-Menüs mit mehreren Ebenen - für komplexere Navigationsstrukturen.
Was ist eine Multi-Level Navigation?
Eine Multi-Level Navigation (oder Flyout-Menü) ist ein Dropdown mit verschachtelten Untermenüs. Wenn du über oder auf einen Menüpunkt hoverst/klickst, öffnet sich ein Dropdown. Und wenn dieser Dropdown selbst noch Unterpunkte hat, erscheint ein weiteres Menü - typischerweise rechts davon.
- Große Websites mit vielen Kategorien und Unterkategorien
- E-Commerce-Shops mit Produktkategorien
- Dokumentationen mit hierarchischer Struktur
- Firmen-Websites mit vielen Abteilungen/Services
Multi-Level-Menüs mit mehr als 2-3 Ebenen werden schnell unübersichtlich und sind auf Mobilgeräten schwer zu bedienen. Überlege, ob du die Struktur vereinfachen oder eine andere Lösung (z.B. Mega-Menü) verwenden kannst.
Multi-Level Navigation mit Hover
Das klassische Flyout-Menü: Bei Hover über einen Menüpunkt mit Untermenü erscheint dieses
automatisch rechts davon. Die Struktur besteht aus verschachtelten
<ul>-Listen.
Die HTML-Struktur
Der Schlüssel ist die Verschachtelung: Ein <li> enthält nicht nur einen Link, sondern auch eine
komplette
<ul> als Untermenü.
<nav>
<ul class="menu">
<li><a href="#">Home</a></li>
<li class="dropdown">
<a href="#">Themen</a>
<ul class="dropdown-menu">
<li><a href="#">Thema 1</a></li>
<li><a href="#">Thema 2</a></li>
<!-- Hier kommt das Sub-Menü! -->
<li class="dropdown-sub">
<a href="#">Thema 3 mit Sub-Menu</a>
<ul class="dropdown-submenu">
<li><a href="#">Unterthema 1</a></li>
<li><a href="#">Unterthema 2</a></li>
<li><a href="#">Unterthema 3</a></li>
</ul>
</li>
</ul>
</li>
<li><a href="#">Kontakt</a></li>
</ul>
</nav>
Demo: Hover über "Themen" → dann über "Thema 3 mit Sub-Menu"
Das CSS für Multi-Level Hover
Das Submenu wird mit position: absolute und
left: 100% rechts neben dem Eltern-Element positioniert.
/* Das Sub-Dropdown-Element (hat selbst ein Untermenü) */
.dropdown-sub {
position: relative; /* Anker für das Sub-Menü */
}
/* Link im Sub-Dropdown mit Pfeil-Indikator */
.dropdown-sub > a {
display: flex;
justify-content: space-between;
align-items: center;
}
/* Pfeil zeigt an: "Hier gibt's noch mehr" */
.dropdown-sub > a::after {
content: '►';
font-size: 0.6em;
margin-left: auto;
padding-left: 1rem;
opacity: 0.7;
}
/* Das Sub-Menü (drittes Level) */
.dropdown-submenu {
position: absolute;
top: 0; /* Auf gleicher Höhe wie Eltern */
left: 100%; /* Rechts neben dem Eltern-Element */
background: var(--bg-tertiary);
border: 1px solid var(--border-color);
border-radius: 8px;
min-width: 200px;
list-style: none;
padding: 0.5rem 0;
margin: 0;
/* Vertikale Anordnung der Items */
display: flex;
flex-direction: column;
/* Versteckt bis Hover */
opacity: 0;
visibility: hidden;
transform: translateX(-10px);
transition: all 0.3s ease;
box-shadow: 0 10px 25px rgba(0, 0, 0, 0.3);
z-index: 101; /* Über dem ersten Dropdown */
}
/* HOVER: Sub-Menü einblenden */
.dropdown-sub:hover .dropdown-submenu {
opacity: 1;
visibility: visible;
transform: translateX(0); /* Gleitet nach rechts */
}
/* Links im Sub-Menü */
.dropdown-submenu li a {
padding: 0.5rem 1rem;
display: block;
}
.dropdown-submenu li a:hover {
background: var(--bg-secondary);
}
Jedes Element mit einem Untermenü braucht position: relative,
damit das absolut positionierte Untermenü sich daran orientiert - nicht am ganzen
Dokument.
Praxis-Beispiel: Navigation mit Logo
So könnte eine Multi-Level Navigation in einem echten Header aussehen - mit Logo links und Menü rechts:
Das Layout mit Logo links und Menü rechts erreichst du mit Flexbox:
/* Header-Layout: Logo links, Menü rechts */
.header-inner {
display: flex;
justify-content: space-between;
align-items: center;
padding: 1rem 2rem;
}
Multi-Level Navigation auf Klick
Für Touch-Geräte oder wenn du mehr Kontrolle willst: Hier öffnet sich das Menü erst bei Klick statt bei Hover. Das JavaScript handhabt das Öffnen und Schließen.
Die HTML-Struktur
Identisch zur Hover-Variante - nur die CSS-Klassen sind anders benannt, um die Stile zu trennen:
<nav>
<ul class="menu-click">
<li><a href="#">Home</a></li>
<li class="dropdown-click">
<a href="#">Themen</a>
<ul class="dropdown-menu-click">
<li><a href="#">Thema 1</a></li>
<li><a href="#">Thema 2</a></li>
<li class="dropdown-sub-click">
<a href="#">Thema 3 mit Sub-Menu</a>
<ul class="dropdown-submenu-click">
<li><a href="#">Unterthema 1</a></li>
<li><a href="#">Unterthema 2</a></li>
<li><a href="#">Unterthema 3</a></li>
</ul>
</li>
</ul>
</li>
<li><a href="#">Kontakt</a></li>
</ul>
</nav>
Demo: Klicke auf "Themen" → dann auf "Thema 3 mit Sub-Menu"
Das JavaScript
Das Script handhabt: Haupt-Dropdowns öffnen/schließen, Sub-Dropdowns öffnen/schließen, und alles schließen bei Klick außerhalb.
// Haupt-Dropdowns
document.querySelectorAll('.dropdown-click > a').forEach(trigger => {
trigger.addEventListener('click', function(e) {
e.preventDefault();
const dropdown = this.parentElement;
// Andere Haupt-Dropdowns schließen
document.querySelectorAll('.dropdown-click.open').forEach(open => {
if (open !== dropdown) {
open.classList.remove('open');
// Sub-Menüs auch schließen
open.querySelectorAll('.dropdown-sub-click.open').forEach(sub => {
sub.classList.remove('open');
});
}
});
dropdown.classList.toggle('open');
});
});
// Sub-Dropdowns
document.querySelectorAll('.dropdown-sub-click > a').forEach(trigger => {
trigger.addEventListener('click', function(e) {
e.preventDefault();
e.stopPropagation(); // Verhindert Schließen des Haupt-Dropdowns
const subDropdown = this.parentElement;
// Andere Sub-Dropdowns auf gleicher Ebene schließen
const siblings = subDropdown.parentElement.querySelectorAll('.dropdown-sub-click.open');
siblings.forEach(open => {
if (open !== subDropdown) {
open.classList.remove('open');
}
});
subDropdown.classList.toggle('open');
});
});
// Klick außerhalb schließt alles
document.addEventListener('click', function(e) {
if (!e.target.closest('.dropdown-click') && !e.target.closest('.dropdown-sub-click')) {
document.querySelectorAll('.dropdown-click.open, .dropdown-sub-click.open').forEach(open => {
open.classList.remove('open');
});
}
});
Das CSS für die Klick-Variante
Der Unterschied zur Hover-Variante: Statt :hover wird die Klasse
.open per JavaScript gesetzt.
Open CSS
/* Hauptmenü */
.menu-click {
display: flex;
gap: 2rem;
list-style: none;
align-items: center;
margin: 0;
padding: 0;
}
.menu-click > li {
position: relative;
}
/* Dropdown-Trigger */
.dropdown-click {
position: relative;
}
.dropdown-click > a {
cursor: pointer;
user-select: none;
}
/* Pfeil-Indikator */
.dropdown-click > a::after {
content: ' ▼';
margin-left: 0.5rem;
font-size: 0.7em;
transition: transform 0.3s;
display: inline-block;
}
/* Pfeil dreht sich wenn offen */
.dropdown-click.open > a::after {
transform: rotate(180deg);
}
/* Das Dropdown-Menü (versteckt) */
.dropdown-menu-click {
position: absolute;
top: 100%;
left: 0;
background: var(--bg-tertiary);
border: 1px solid var(--border-color);
border-radius: 8px;
min-width: 180px;
list-style: none;
padding: 0.5rem 0;
margin: 0;
display: flex;
flex-direction: column;
opacity: 0;
visibility: hidden;
transform: translateY(-10px);
transition: all 0.3s ease;
box-shadow: 0 10px 25px rgba(0, 0, 0, 0.3);
z-index: 100;
}
/* KLICK: Dropdown sichtbar (via .open Klasse) */
.dropdown-click.open > .dropdown-menu-click {
opacity: 1;
visibility: visible;
transform: translateY(0);
}
/* Sub-Dropdown */
.dropdown-sub-click {
position: relative;
}
.dropdown-sub-click > a {
cursor: pointer;
user-select: none;
display: flex;
justify-content: space-between;
align-items: center;
}
/* Pfeil für Sub-Menü */
.dropdown-sub-click > a::after {
content: '►';
font-size: 0.6em;
margin-left: auto;
padding-left: 1rem;
transition: transform 0.3s;
}
.dropdown-sub-click.open > a::after {
transform: rotate(90deg);
}
/* Das Sub-Menü */
.dropdown-submenu-click {
position: absolute;
top: 0;
left: 100%;
background: var(--bg-tertiary);
border: 1px solid var(--border-color);
border-radius: 8px;
min-width: 200px;
list-style: none;
padding: 0.5rem 0;
margin: 0;
display: flex;
flex-direction: column;
opacity: 0;
visibility: hidden;
transform: translateX(-10px);
transition: all 0.3s ease;
box-shadow: 0 10px 25px rgba(0, 0, 0, 0.3);
z-index: 101;
}
/* KLICK: Sub-Menü sichtbar */
.dropdown-sub-click.open > .dropdown-submenu-click {
opacity: 1;
visibility: visible;
transform: translateX(0);
}
Zusammenfassung
Hover-Variante
- Kein JavaScript nötig
- Schneller Zugriff auf Untermenüs
- Problematisch auf Touch-Geräten
- Gut für Desktop-Websites
Klick-Variante
- Erfordert JavaScript
- Bessere Kontrolle für User
- Touch-freundlich
- Gut für Mobile-First-Designs
- Lerne, wie du die Navigation responsive für Mobile machst
- Füge einen Skip-Link für Accessibility hinzu
- Markiere den aktiven Menüpunkt visuell
Mehr aus HTML
Tutorials werden geladen...