Sticky Header erstellen – Tutorial

In diesem Tutorial lernst du, wie du mit CSS und JavaScript einen fixierten Header erstellst, der beim Scrollen immer oben am Bildschirm bleibt.


HTML-Struktur für den Header

Das Beispiel-HTML für deinen Header mit Navigation:

<header id="main-header">
  <h1>Meine Webseite</h1>
  <nav>
    <a href="#">Start</a>
    <a href="#">Über uns</a>
    <a href="#">Leistungen</a>
    <a href="#">Kontakt</a>
  </nav>
</header>

<main>
  <p>...dein Seiteninhalt...</p>
</main>

CSS für den Sticky Header

Das CSS sorgt dafür, dass der Header seinen Standard-Stil hat und beim Scrollen „sticky“ wird:

header {
  background-color: #0073aa;
  color: white;
  padding: 15px 30px;
  position: relative;
  transition: top 0.3s;
}

header.sticky {
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  z-index: 1000;
  box-shadow: 0 2px 5px rgba(0,0,0,0.2);
}

Wichtig: Der Inhalt muss beim Sticky-Status nach unten weichen, daher mit main { margin-top: 80px; } Platz schaffen.


JavaScript zum Umschalten des Sticky-Klassenstatus

Dieses kleine Skript fügt beim Scrollen die CSS-Klasse sticky zum Header hinzu, sobald vom Seitenanfang 100 Pixel gescrollt wurden:

<script>
window.addEventListener('scroll', function() {
  var header = document.getElementById('main-header');
  if (window.pageYOffset > 100) {
    header.classList.add('sticky');
  } else {
    header.classList.remove('sticky');
  }
});
</script>

Schritt-für-Schritt Erklärung

  • Der Header hat im Normalzustand die Position relative.
  • Beim Scrollen jenseits von 100 Pixel wird per JavaScript die Klasse sticky gesetzt.
  • Diese Klasse ändert die Position auf fixed, so bleibt der Header am oberen Rand.
  • Ein Schatten (box-shadow) gibt optisches Feedback.
  • Der Hauptinhalt bekommt über margin-top genug Platz unter dem fixierten Header.

FAQ: Sticky Header

Was ist ein Sticky Header und worin liegt der Unterschied zu position:fixed?

Ein Sticky Header bleibt beim Scrollen sichtbar — je nach Implementierung entweder dauerhaft fixiert (position: fixed) oder „klebt“ erst ab einem bestimmten Scroll‑Punkt. CSS position:sticky ist eine native Lösung, bei der das Element innerhalb seines Scroll‑Containers zuerst normal fließt und ab einer definierten Position dort kleben bleibt; position:fixed entfernt das Element aus dem Dokumentfluss und fixiert es immer am Viewport. position:sticky ist oft einfacher und vermeidet zusätzliche JS‑Logik, funktioniert aber nur in modernen Browsern und innerhalb eines eingeschränkten Containers.

Wann sollte ich CSS position:sticky statt JavaScript + class toggling verwenden?

Verwende position:sticky, wenn du eine einfache, browserseitige Lösung willst und der Header innerhalb eines scrollbaren Containers bleibt. Es reduziert JavaScript‑Overhead und ist performanter (keine Scroll‑Listener nötig). Nutze JS‑Toggling (class add/remove) wenn du komplexe Effekte brauchst (ein‑/ausblenden beim Scrollen, animationen, Schwellenwerte, Kompatibilität mit älteren Browsern oder Anpassungen der Header‑Höhe).

Wie verhindere ich, dass der Sticky Header den Seiteninhalt überdeckt (Layout‑Shift)?

Wenn der Header auf fixed wechselt, entfernst du es aus dem normalen Fluss — der Inhalt springt nach oben. Schaffe Platz, indem du beim Sticky‑Status z. B. main { margin-top: } setzt oder vor dem Header ein Platzhalter‑Element (spacer) mit gleicher Höhe einfügst. Bei dynamischer Header‑Höhe musst du die Höhe per JS messen und den Spacer aktualisieren, um Layout‑Verschiebungen zu vermeiden.

Wie optimiere ich Performance beim Scroll‑Handling in JavaScript?

Vermeide teure Operationen im Scroll‑Event. Nutze passive listeners, rAF (requestAnimationFrame) oder Throttling/Debouncing, um DOM‑Änderungen zu batchen. Besser: nur class toggling (ein leichter reflow) durchführen, keine komplexen Layout‑Messungen pro Frame. Wenn möglich, setze auf CSS position:sticky, um Scroll‑Listener ganz zu vermeiden.

Wie gehe ich mit mobilen Geräten und kleinem Viewport um?

Auf Mobilgeräten ist Platz begrenzt — reduziere Header‑Höhe, nutze kompakte Navigation (Hamburger) und teste Touch‑Targets. Manche Seiten zeigen Sticky Header nur beim Scrollen nach oben (zurück) und verbergen ihn beim Scrollen nach unten, um Platz zu sparen. Außerdem prüfen, ob position:sticky im Mobilbrowser korrekt unterstützt wird, und teste die Interaktion mit Soft‑Keyboards und Browser‑UIs (iOS Safari).

Wie setze ich ein ein‑/ausblendendes Sticky Header (hide on scroll down, show on scroll up) um?

Das erfordert JavaScript: tracke die letzte Scroll‑Position, vergleiche mit aktueller; beim Scrollen nach unten setzt du z. B. header.classList.add(‚hidden‘), beim Scrollen nach oben entfernst du die Klasse. Nutze rAF oder Throttling, um Performance zu wahren. Ergänze CSS‑Transitions für sanfte Animationen (transform: translateY(-100%) statt top‑Änderung für GPU‑beschleunigte Bewegung).

Welche z‑Index‑Probleme können auftreten und wie löse ich sie?

Sticky/Header liegt über anderem Inhalt — ein zu niedriger z‑index kann dazu führen, dass andere Elemente (Modals, Drop‑Downs) über dem Header erscheinen, oder umgekehrt. Verwende gezielte z‑Index‑Stacking (z. B. Header z‑index:1000; Modals z‑index:2000) und vermeide sehr hohe „magic“‑Werte. Verwende CSS‑Kontext (positionierte Eltern) bewusst, denn z‑Index wirkt nur innerhalb des Stacking‑Contexts.

Wie mache ich die Navigation in einem Sticky Header zugänglich (A11y)?

Sorgen: sichtbare Fokuszustände für Links, große Touch‑Targets, semantisches Markup (nav, ul/li/a), korrektes aria‑label für Toggle‑Buttons (z. B. für Hamburger), und keyboard‑freundliche Interaktionen. Wenn Header dynamisch ein‑/ausgeblendet wird, informiere assistive Technologien (aria‑hidden setzen oder live‑regions nutzen), damit Nutzer nicht den Kontext verlieren. Teste mit Tastatur und Screenreadern.

Wie integriere ich Sticky Header in WordPress‑Themes und Page Builder?

Implementiere das Markup als Template‑Part (z. B. header.php oder template‑parts/header.php) und lade CSS/JS über wp_enqueue_*. Verwende conditional tags (is_front_page()) wenn nötig. Bei Page Buildern (Elementor, WPBakery) biete eine kompakte Variante deiner Header‑Vorlage an oder aktiviere Sticky‑Optionen der Builder‑Funktionen, falls sie vorhanden. Achte auf Plugin‑Konflikte (z. B. andere Sticky‑Scripts) und teste auf verschiedenen Themes.

Welche Best‑Practices und Fehlervermeidung empfiehlst du?

Best‑Practices: mobile‑freundliches Design, vermeide große Header‑Höhen; benutze CSS‑Transitions/transform für flüssige Animationen; messe Header‑Höhe dynamisch, wenn nötig; priorisiere Performance (keine unnötigen Scroll‑Listener); teste in allen Browsern und Geräten; implementiere saubere z‑Index‑Strategie; dokumentiere Header‑Styles im Design‑System; und immer Fallbacks anbieten (z. B. kein Sticky auf sehr alten Browsern). Häufige Fehler: fehlender Platz für Inhalt (keine spacer), heavy JS in Scroll‑Handler, vergessene wp_enqueue in WordPress, fehlende Accessibility‑Funktionen.

Kontakt

Webdesignstudio WedDesign

Eduard Wischnewski

Am Justusberg 7
41849 Wassenberg

    Ja, ich möchte den Newsletter erhalten