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.

Wann brauchst du Multi-Level Navigation?
  • Große Websites mit vielen Kategorien und Unterkategorien
  • E-Commerce-Shops mit Produktkategorien
  • Dokumentationen mit hierarchischer Struktur
  • Firmen-Websites mit vielen Abteilungen/Services
Vorsicht bei zu vielen Ebenen!

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ü.

HTML
<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.

CSS
/* 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);
}
Wichtig: position: relative

Jedes Element mit einem Untermenü braucht position: relative, damit das absolut positionierte Untermenü sich daran orientiert - nicht am ganzen Dokument.

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:

CSS
/* 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:

HTML
<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.

JavaScript
// 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
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
Nächste Schritte
  • 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...