Header, Sidebar und Tabellen richtig umsetzen
position:sticky ist eines der nützlichsten CSS-Features für moderne Layouts – und eines der meistmissverstandenen. Die Klasse sticky in Tailwind CSS ist schnell geschrieben, aber ohne top, ohne Elternhöhe und mit overflow auf einem Vorfahren wird sie stillschweigend ignoriert.
Inhaltsverzeichnis
- 1. Wie position:sticky wirklich funktioniert
- 2. Sticky Header mit Tailwind CSS
- 3. Die overflow-Falle: Warum sticky oft nicht funktioniert
- 4. Sticky Sidebar in einem zweispaltigen Layout
- 5. Sticky Tabellen-Header für lange Datentabellen
- 6. Mehrere sticky Elemente: Stacking und z-index
- 7. Alpine.js: Header bei Scroll kompakter machen
- 8. Mobile-Fallbacks und sticky auf Touch-Geräten
- 9. sticky vs. fixed: Vergleich und Wann was passt
- 10. Zusammenfassung
- 11. FAQ
1. Wie position:sticky wirklich funktioniert
Ein Tailwind CSS Sticky Layout basiert auf position: sticky, einem CSS-Feature, das sich wie eine Mischung aus relative und fixed verhält. Das Element ist zunächst in den normalen Dokumentenfluss eingebettet – es nimmt Platz ein, andere Elemente umfließen es wie bei relative. Sobald das Scrollen das Element an einem definierten Schwellenwert (meistens top: 0) vorbeiführen würde, wechselt es in einen "stuck"-Zustand und bleibt am definierten Offset kleben – wie bei fixed, aber nur innerhalb seines Scroll-Containers. Das Verhalten hält an, bis der Elterncontainer vollständig aus dem Sichtbereich gescrollt ist.
Der entscheidende Unterschied zu fixed: Das sticky Element bewegt sich nicht aus dem normalen Dokumentenfluss heraus. Es nimmt weiterhin seinen ursprünglichen Platz ein, und der Raum bleibt reserviert. Das verhindert das Layout-Jump, das entsteht, wenn fixed-Elemente nachträglich Platz einnehmen, und macht sticky für den Großteil der Anwendungsfälle zu der besseren Wahl. In Tailwind CSS aktiviert die Klasse sticky das Verhalten, und top-0 definiert den Schwellenwert. Ohne eine Offset-Klasse wie top-0, top-16 oder top-[4rem] hat das sticky-Verhalten keinen Effekt – das ist der häufigste Fehler beim Einrichten von Tailwind CSS Sticky Layouts.
2. Sticky Header mit Tailwind CSS
Der sticky Header ist das häufigste Tailwind CSS Sticky Layout: Der Navigationsbereich folgt dem Nutzer beim Scrollen und bleibt oben am Viewport kleben. Die Implementierung ist unkompliziert: Der Header bekommt sticky top-0 z-50. sticky aktiviert das Verhalten, top-0 setzt den Schwellenwert auf die Viewport-Oberkante, und z-50 stellt sicher, dass der Header über alle anderen Inhaltselemente gerendert wird. Ein weißer oder eingefärbter Hintergrund am Header (bg-white) ist zwingend nötig – ohne Hintergrund scrollt der Seiteninhalt durch den Header hindurch, was unlesbar ist.
In der Praxis kombiniert man den sticky Header häufig mit einem Schatten, der beim Scrollen erscheint. Alpine.js oder ein einfaches JavaScript-Scroll-Event setzt eine Klasse, wenn window.scrollY > 0. Mit Tailwind-Klassen wie shadow-md oder einer Grenzfarbe entsteht so ein Header, der im sichtbaren Bereich flach ist und beim Scrollen einen Schatten zeigt – ein visueller Hinweis, dass der Header nun "klebt". Das ist mit Alpine.js und :class-Binding in wenigen Zeilen implementiert und braucht kein externes Plugin.
<!-- Sticky header with Alpine.js scroll shadow -->
<header
x-data="{ scrolled: false }"
@scroll.window="scrolled = window.scrollY > 10"
:class="scrolled ? 'shadow-md border-b border-slate-200' : 'shadow-none'"
class="sticky top-0 z-50 bg-white transition-shadow duration-200"
>
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 h-16 flex items-center justify-between">
<a href="/" class="font-bold text-slate-900 text-xl">Mironsoft</a>
<nav class="hidden md:flex items-center gap-6 text-sm font-medium text-slate-700">
<a href="/leistungen" class="hover:text-sky-600 transition-colors">Leistungen</a>
<a href="/blog" class="hover:text-sky-600 transition-colors">Blog</a>
<a href="/kontakt" class="bg-sky-600 text-white px-4 py-2 rounded-lg hover:bg-sky-700 transition-colors">Kontakt</a>
</nav>
</div>
</header>
3. Die overflow-Falle: Warum sticky oft nicht funktioniert
Das häufigste Problem bei Tailwind CSS Sticky Layouts ist ein Vorfahren-Element mit einer overflow-Eigenschaft, die nicht visible ist. position: sticky funktioniert nur im Kontext seines nächsten scrollenden Vorfahren-Elements. Wenn ein Vorfahre overflow: hidden, overflow: auto oder overflow: scroll hat – auch wenn dieser Vorfahre gar nicht scrollt –, wird das sticky-Verhalten an diesem Vorfahren "eingeschlossen". Das Element verhält sich dann relativ zu diesem Container, nicht zum Viewport. In Tailwind CSS sind die problematischen Klassen: overflow-hidden, overflow-auto, overflow-scroll, overflow-x-hidden und overflow-y-hidden.
Dieses Problem tritt besonders häufig auf, wenn ein Haupt-Layout-Container overflow-hidden für einen horizontalen Scroll-Schutz (um horizontales Überlaufen zu verhindern) gesetzt hat. Der Sticky Header klappt dann zusammen, weil sein nächster scrollbarer Vorfahre der overflow-hidden-Container ist, nicht das Dokumentfenster. Die Lösung: Entweder den overflow-hidden-Container entfernen und durch andere Mittel (etwa max-w und mx-auto) die Breite begrenzen, oder den sticky Header aus dem problematischen Container in der DOM-Hierarchie nach oben verschieben. In Tailwind CSS v3 und v4 gibt es keine Utility, die das Problem automatisch löst – das DOM muss korrekt strukturiert sein.
4. Sticky Sidebar in einem zweispaltigen Layout
Die sticky Sidebar ist ein klassisches Layout-Muster: Die linke Spalte enthält langen Inhalt, die rechte Spalte enthält eine Sidebar, die beim Scrollen kleben bleiben soll. In Tailwind CSS wird das mit einem Grid-Container und zwei Spalten umgesetzt. Die Sidebar-Spalte bekommt sticky top-24 (top-24 = 96px, um Platz für den sticky Header zu lassen) und eine maximale Höhe mit max-h-[calc(100vh-6rem)] overflow-y-auto, damit die Sidebar selbst scrollbar wird, wenn ihr Inhalt größer als der sichtbare Bereich ist.
Der kritische Punkt beim Tailwind CSS Sticky Layout der Sidebar: Die Sidebar-Spalte selbst muss so hoch oder höher sein als ihr Scroll-Container, damit das sticky-Verhalten Sinn ergibt. Wenn die Hauptspalte und die Sidebar-Spalte gleich lang sind, klebt die Sidebar bis zum Ende des Inhalts. Wenn die Hauptspalte deutlich länger ist, klebt die Sidebar so lange, bis der Viewport-Offset erreicht ist. Der Grid-Elterncontainer darf dabei kein overflow-hidden haben, sonst greift die overflow-Falle aus dem vorherigen Abschnitt. Die Sidebar-Klassen zusammengefasst: sticky top-24 self-start max-h-[calc(100vh-6rem)] overflow-y-auto. self-start verhindert, dass Flexbox oder Grid die Sidebar auf die volle Höhe der Spalte dehnt.