Skip to content

Türchen 6 – Flexbox Patterns, die man im Schlaf können sollte

Published: at 07:00 AM

Flexbox kann unglaublich viel, aber im Alltag sind es ein paar wenige wiederkehrende Patterns, die den Unterschied machen. Diese Patterns lösen typische Layoutprobleme konsistent, sind teamfreundlich und haben sich über Jahre hinweg bewährt.

Dieses Türchen zeigt die wichtigsten Flexbox-Patterns aus der Praxis, die in nahezu jeder Codebase eingesetzt werden können. Sie sind robust, intuitiv und helfen dabei, Layouts schneller und zuverlässiger zu entwickeln.

Pattern 1: Perfekte Zentrierung

Das wohl häufigste und universellste Flexbox-Pattern ist die perfekte Zentrierung. Jahrelang war das Zentrieren von Elementen – besonders vertikal – eine der größten Herausforderungen im CSS. Mit Flexbox ist es trivial geworden:

.center {
  display: flex;
  justify-content: center;
  align-items: center;
}

Dieses Pattern funktioniert für nahezu jeden Anwendungsfall wie z.B. Modal-Overlays, die ihren Inhalt perfekt zentriert anzeigen sollen, Loader-Animationen, die in der Mitte des Viewports erscheinen, oder Icons in Buttons, die exakt mittig sitzen müssen. Leere Zustände in Anwendungen, die eine zentrierte Nachricht darstellen.

Die Eleganz liegt in der Unabhängigkeit. Die Zentrierung funktioniert entlang beider Achsen vollkommen unabhängig von Inhalt oder Größe. Egal wie groß das zu zentrierende Element ist oder wie sich der Container verändert. Das Element bleibt perfekt zentriert. Es gibt keine Berechnungen, keine negativen Margins und keine Tricks mit Positionierung. Flexbox übernimmt die gesamte Arbeit.

Pattern 2: Platz gleichmäßig verteilen

Ein weiteres fundamentales Pattern ist die gleichmäßige Verteilung von Elementen mit maximalem Abstand zwischen ihnen. space-between schiebt das erste Element an den linken Rand, das letzte an den rechten Rand und verteilt den verfügbaren Platz gleichmäßig zwischen allen Elementen:

.spread {
  display: flex;
  justify-content: space-between;
  align-items: center;
}

Dieses Pattern taucht in fast jeder Anwendung auf. Header-Komponenten nutzen es, um das Logo links und die Navigation rechts zu platzieren. Footer-Bereiche verteilen damit ihre Links gleichmäßig über die gesamte Breite. Toolbars, Menüs und Actionbars verwenden es, um Aktionen optimal zu positionieren – links die primären, rechts die sekundären Aktionen.

Ein typisches Praxisbeispiel ist ein Header mit mehreren Bereichen:

.header {
  display: flex;
  justify-content: space-between;
  align-items: center;
  padding: 1rem;
}

Seit der breiten Unterstützung der gap-Eigenschaft in Flexbox wird dieses Pattern noch robuster. Mit gap definiert man einen Mindestabstand zwischen Elementen, der auch dann erhalten bleibt, wenn sich die Breite des Containers ändert:

.header {
  display: flex;
  justify-content: space-between;
  align-items: center;
  gap: 1rem;
}

Der Vorteil: Man muss sich keine Gedanken mehr über Margins an einzelnen Elementen machen. Der Abstand wird einheitlich zwischen allen Items eingefügt, nie am Rand des Containers.

Pattern 3: Autospace – freie Fläche an eine bestimmte Stelle schieben

Ein sehr nützliches und oft unterschätztes Pattern ist die Verwendung von margin: auto in Flexbox-Containern. Dieses Pattern erlaubt es, einzelne Elemente gezielt zu trennen, ohne dass alle anderen Elemente davon betroffen sind:

.auto-space {
  margin-left: auto;
}

Die Anwendung wird in einer Toolbar besonders deutlich. Angenommen, man hat mehrere Buttons, von denen die meisten links stehen sollen, aber ein Button – etwa „Weiter” oder „Speichern” – soll ganz rechts positioniert werden:

<div class="toolbar">
  <button>Zurück</button>
  <button class="auto-space">Weiter</button>
</div>

Das zugehörige CSS ist minimal:

.toolbar {
  display: flex;
  align-items: center;
}

Durch margin-left: auto auf dem Button wird der gesamte verfügbare freie Raum als linker Margin verwendet. Das Ergebnis: Der Button wird automatisch an den rechten Rand geschoben. Alles, was rechts von diesem Element kommt, wird ebenfalls nach rechts verschoben.

Dieses Pattern funktioniert zuverlässiger als space-between, wenn man nicht alle Elemente gleichmäßig verteilen möchte, sondern nur eine gezielte Trennung an einer bestimmten Stelle braucht. Es ist besonders wertvoll in dynamischen Interfaces, wo die Anzahl der Elemente variieren kann, aber ein bestimmtes Element immer am Ende stehen soll.

Pattern 4: Zwei Spalten, die sich flexibel verhalten

Das klassische Zwei-Spalten-Layout ist eines der am häufigsten benötigten Patterns in Web-Anwendungen. Mit Flexbox ist es elegant und robust umsetzbar:

.two-cols {
  display: flex;
  gap: 1rem;
}

.col {
  flex: 1;
}

Die Kurzschreibweise flex: 1 bedeutet, dass sich beide Spalten den verfügbaren Platz gleichmäßig teilen. Jede Spalte erhält exakt die Hälfte der Breite, unabhängig vom Inhalt. Die gap-Eigenschaft sorgt für einen sauberen Abstand zwischen den Spalten, ohne dass man Margins an den einzelnen Elementen definieren muss.

Für Produktionsumgebungen wird dieses Pattern oft mit flex-basis robuster gemacht:

.col {
  flex: 1 1 250px;
}

Diese Notation bedeutet: Die Spalte kann wachsen (flex-grow: 1), sie kann schrumpfen (flex-shrink: 1), und ihre Basis-Breite beträgt 250 Pixel. Die Spalten passen sich flexibel an den verfügbaren Raum an und schrumpfen bei Bedarf unter ihre Basis-Breite. Für automatisches Umbrechen muss zusätzlich flex-wrap: wrap am Container gesetzt werden, was dann ein responsives Verhalten ohne explizite Media Queries ermöglicht.

Dieses Pattern ist in Admin-Interfaces und Dashboards extrem verbreitet. Typische Anwendungsfälle sind Detailansichten mit Formular links und Vorschau rechts, Listen mit Hauptinhalt links und Metadaten rechts, oder geteilte Editoren mit Code und Vorschau.

Das Holy-Grail-Pattern für sehr viele Layouts ist der sogenannte Sticky Footer. Das ist ein Footer, der am unteren Rand des Viewports klebt, wenn der Inhalt kurz ist, aber beim Scrollen normal mitfließt, wenn der Inhalt lang genug ist. Vor Flexbox erforderte dieses Pattern komplizierte Berechnungen oder JavaScript. Mit Flexbox ist es erstaunlich einfach:

.layout {
  min-height: 100vh;
  display: flex;
  flex-direction: column;
}

.layout-content {
  flex: 1;
}

Das dazugehörige HTML ist minimal strukturiert:

<div class="layout">
  <header>Header</header>
  <main class="layout-content">Inhalt</main>
  <footer>Footer</footer>
</div>

Wie funktioniert das? Der Layout-Container nimmt mindestens die volle Viewport-Höhe ein (min-height: 100vh). Durch flex-direction: column werden die Kinder vertikal angeordnet. Der entscheidende Teil ist flex: 1 am Content-Bereich: Dieser nimmt den gesamten verfügbaren Platz ein, während Header und Footer nur so viel Raum beanspruchen, wie sie benötigen.

Das Ergebnis: Wenn der Inhalt kurz ist, dehnt sich der Content-Bereich aus und drückt den Footer an den unteren Rand. Wenn der Inhalt lang ist, wächst der Content-Bereich entsprechend und der Footer erscheint nach dem Content und das ganz natürlich und ohne position: fixed oder andere Hacks. Dieses Pattern funktioniert zuverlässig in allen modernen Browsern und ist das bevorzugte Mittel für Layouts mit Sticky Footer.

Pattern 6: Scrollbare Bereiche in Flexbox-Layouts

Ein Problem, das Teams regelmäßig vor Herausforderungen stellt: Ein Bereich innerhalb eines Flexbox-Layouts soll scrollbar sein, aber nur sein Inhalt soll scrollen, während der Rest des Layouts fixiert bleibt. Das klassische Beispiel ist ein Dashboard mit Sidebar und Hauptinhalt, bei dem nur der Hauptinhalt scrollen soll.

Der Schlüssel zur Lösung liegt in einer oft übersehenen CSS-Eigenschaft: min-width: 0 (oder min-height: 0 bei vertikalen Layouts).

Ein vollständiges Beispiel verdeutlicht das Problem und die Lösung:

.wrapper {
  display: flex;
  height: 100vh;
}

.sidebar {
  width: 250px;
}

.content {
  flex: 1;
  min-width: 0; /* erlaubt Schrumpfen unter Content-Breite */
  overflow-y: auto;
}

Ohne min-width: 0 blockiert Flexbox das Scrollen. Der Grund liegt im Default-Verhalten von Flexbox. Items haben standardmäßig min-width: auto, was bedeutet, dass sie nicht kleiner werden können als ihr Inhalt. Wenn der Content-Bereich also sehr breiten Inhalt enthält, wie etwa eine Tabelle oder ein Code-Block, würde das Flex-Item versuchen, sich auf diese Breite auszudehnen, statt zu scrollen.

Mit min-width: 0 überschreibt man dieses Verhalten und erlaubt dem Item, kleiner als sein Inhalt zu werden. Erst dann kann overflow-y: auto greifen und einen Scrollbalken anzeigen.

Dieses Problem taucht regelmäßig in Enterprise-Dashboards, Admin-Panels und komplexen Anwendungen auf. Die Lösung ist simpel, aber nicht intuitiv, weshalb sie oft übersehen wird und zu Stunden an Debugging führt.

Pattern 7: Flex-Wrapping für responsive Layouts

Eine häufige Aufgabenstellung in modernen Webseiten ist, dass Items sollen nebeneinander angeordnet werden, wenn genug Platz vorhanden ist, aber automatisch umbrechen, wenn der Viewport schmaler wird. Flexbox bietet dafür eine elegante Lösung mit flex-wrap:

.wrap {
  display: flex;
  flex-wrap: wrap;
  gap: 1rem;
}

.item {
  flex: 1 1 200px;
}

Das Verhalten ist intelligent und vorhersehbar. Solange genügend Platz für alle Items vorhanden ist (basierend auf der flex-basis von 200px plus Gap), werden sie nebeneinander angezeigt. Sobald der Platz nicht mehr ausreicht, bricht das letzte Item in eine neue Zeile um. Die Items wachsen und schrumpfen dynamisch, um den verfügbaren Raum optimal zu nutzen.

Das Ergebnis ist ein schönes, fluides Grid-artiges Layout und das ganz ohne CSS Grid. Der Vorteil gegenüber Grid ist, dass Items unterschiedliche Breiten haben und sich flexibel an den Inhalt anpassen können, während sie trotzdem in einem strukturierten Raster erscheinen.

Dieses Pattern ist besonders sinnvoll, wenn man keine vollständige zweidimensionale Grid-Struktur braucht, sondern ein variables Row-Layout mit flexible Breiten. Typische Anwendungsfälle sind Tag-Listen, Chip-Komponenten, Bildergalerien mit unterschiedlichen Bildgrößen oder Karten-Layouts, bei denen die Anzahl der Spalten von der Viewport-Breite abhängen soll, ohne explizite Breakpoints zu definieren.

Pattern 8: Vertikale Alignment-Probleme lösen

Ein typisches Problem in Formularen und Eingabe-Layouts: Labels, Inputs, Buttons und andere Formular-Elemente haben unterschiedliche Höhen und Baseline-Positionen. Das führt zu unschönen optischen Sprüngen und einer unprofessionellen Anmutung. Flexbox löst dieses Problem elegant:

.form-row {
  display: flex;
  align-items: center;
  gap: 1rem;
}

Durch align-items: center werden alle Elemente entlang der Cross-Axis (vertikal in diesem Fall) zentriert. Ein Label mit unterschiedlicher Höhe, ein Input-Feld, ein Icon-Button. Sie alle werden perfekt mittig ausgerichtet, unabhängig von ihrer individuellen Größe.

Das Pattern funktioniert nicht nur für Formulare. Überall, wo Elemente unterschiedlicher Höhe horizontal nebeneinander stehen sollen, verhindert dieses Pattern optische Unstimmigkeiten. Navigationselemente mit Icons und Text, Listeneinträge mit Avatars und Beschreibungen, Toolbars mit unterschiedlichen Button-Größen. Das Pattern ist universell einsetzbar.

Die Alternative wäre manuelles Padding oder Margin-Tuning für jedes Element. ein wartungstechnischer Albtraum, der bei jeder Änderung der Schriftgröße oder des Content neu justiert werden müsste. Mit Flexbox ist das Alignment dynamisch und passt sich automatisch an.

Pattern 9: Flexbox für Buttons oder Tabs

Ein häufiges UI-Muster in modernen Interfaces: Buttons oder Tabs, die eine Gruppe bilden und sich die verfügbare Breite gleichmäßig teilen. Jeder Button soll gleich breit sein, aber die Gruppe als Ganzes soll flexibel bleiben und sich dem Container anpassen:

.tabs {
  display: flex;
}

.tab {
  flex: 1;
  text-align: center;
  padding: 0.75rem;
}

Mit flex: 1 erhält jeder Tab exakt den gleichen Anteil am verfügbaren Platz. Egal ob zwei, drei oder fünf Tabs. Sie teilen sich die Breite immer gleichmäßig auf. Das text-align: center sorgt dafür, dass der Text innerhalb jedes Tabs zentriert erscheint.

Dieses Pattern ist extrem robust für horizontale Navigationselemente. Es funktioniert auf schmalen Mobile-Screens genauso gut wie auf breiten Desktop-Monitoren. Die Tabs passen sich automatisch an die Container-Breite an, ohne dass Media Queries oder JavaScript notwendig wären.

Varianten dieses Patterns finden sich in Tab-Navigationen, Segmented Controls, Button-Groups für Ansichtswechsel (List/Grid), Filter-Buttons und allen anderen Szenarien, in denen eine Gruppe von Optionen gleichberechtigt präsentiert werden soll. Die Gleichverteilung signalisiert visuell, dass alle Optionen den gleichen Stellenwert haben. Ein wichtiges UX-Detail, das mit anderen Layout-Methoden schwerer zu erreichen ist.

Pattern 10: Content und Icon sauber ausrichten

Ein alltägliches UI-Muster, das überraschend oft Probleme bereitet: Buttons oder Links, die sowohl Text als auch ein Icon enthalten. Ohne spezielle Behandlung sitzt das Icon oft nicht korrekt. Es ist zu hoch, zu tief oder steht nicht im richtigen Abstand zum Text. Flexbox löst dieses Problem vollständig:

.button {
  display: inline-flex;
  align-items: center;
  gap: 0.5rem;
}

Die Verwendung von inline-flex statt flex ist hier wichtig. Der Button verhält sich wie ein Inline-Element im Textfluss, während sein Innenleben Flexbox-basiert ist. align-items: center richtet Icon und Text perfekt mittig aus, unabhängig von Schriftgröße oder Icon-Größe. Die gap-Eigenschaft sorgt für konsistenten Abstand zwischen Icon und Text.

Dieses Pattern eliminiert das berüchtigte Problem “Icon sitzt nicht korrekt” vollständig. Egal ob das Icon vor oder nach dem Text steht, ob die Schriftgröße sich ändert oder ob man verschiedene Icon-Größen verwendet. Die Ausrichtung bleibt immer perfekt.

Das Pattern funktioniert nicht nur für Buttons. Navigationslinks mit Icons, Listeneinträge mit Status-Indikatoren, Labels mit Badges, Menü-Items mit Shortcuts. Überall, wo Icon und Text kombiniert werden, sorgt dieses Pattern für professionelles, pixelgenaues Alignment. Die Alternative wäre manuelles Tuning mit relativer Positionierung oder vertikalen Margins. Beides wartungsintensiv und fehleranfällig bei Änderungen in der Typografie oder den Icons.

Fazit

Diese Flexbox-Patterns bilden die Basis für sehr viele UI-Komponenten, die wir täglich bauen. Wer sie verinnerlicht, löst wiederkehrende Layoutprobleme nicht nur schneller, sondern mit größerer Stabilität und weniger CSS.


☕ Buy me a coffee

Wenn Dir meine Beiträge gefallen und sie Dir bei Deiner Arbeit helfen, würde ich mich über einen "Kaffee" und ein paar nette Worte von Dir freuen.

Buy me a coffee

Previous Post
Türchen 7 – Grid Basics
Next Post
Türchen 5 – Flexbox Fundament

Kommentare