Skip to content

Türchen 5 – Flexbox Fundament

Published: at 07:00 AM

Flexbox gehört zu den wichtigsten Layout-Tools im modernen CSS. Doch auch wenn es seit Jahren Standard ist, sehe ich in Code Reviews immer wieder dieselben Stolpersteine. Flexbox wirkt auf den ersten Blick simpel, aber viele seiner Regeln sind nicht intuitiv und genau das führt zu unerwartetem Verhalten im Alltag.

Wer Flexbox wirklich versteht, baut stabilere Layouts, vermeidet unnötige Overrides und spart enorm viel Debugging-Zeit. Deshalb widme ich diesem Thema ein ganzes Türchen, bevor wir im nächsten Schritt zu fortgeschrittenen Flexbox-Patterns übergehen.

Die zentrale Idee von Flexbox

Flexbox ist ein Layout-Modell für eine Dimension.

Das bedeutet:

Die wichtigste Frage bei jeder Flexbox-Komponente lautet daher:

Was ist die Hauptachse? Horizontal oder vertikal?

Erst wenn das klar ist, ergeben die restlichen Eigenschaften Sinn.

Der wichtigste Einstieg: flex-direction

Viele Fehler entstehen, weil die Hauptachse nicht bewusst festgelegt wird.

.container {
  display: flex;
  flex-direction: row;   /* Standard */
}

Vertikale Layouts:

.container {
  display: flex;
  flex-direction: column;
}

In realen Projekten wird flex-direction erstaunlich oft vergessen und man wundert sich dann, warum etwa justify-content nicht das tut, was man erwartet.

justify-content vs. align-items – die häufigste Verwechslung

Die Grundregel ist simpel:

Wenn flex-direction: row:

justify-content: center; /* horizontal ausrichten */
align-items: center;     /* vertikal ausrichten */

Wenn flex-direction: column:

justify-content: center; /* vertikal ausrichten */
align-items: center;     /* horizontal ausrichten */

Viele „Flexbox funktioniert nicht“-Bugs sind eigentlich nur ein Fall von vertauschten Achsen.

Ein Beispiel: Button-Gruppe

Ein:e Entwickler:in möchte Buttons in einer Zeile gleichmäßig verteilen:

.btn-group {
  display: flex;
  justify-content: space-between;
}

Soweit gut. Dann soll die Gruppe aber vertikal arbeiten:

.btn-group {
  display: flex;
  flex-direction: column;
  justify-content: space-between;
}

Plötzlich verteilt space-between nicht mehr horizontal, sondern vertikal! Viele ändern nur flex-direction, verstehen aber nicht, dass sich damit die gesamte Achsenlogik ändert – und wundern sich über verschobene Layouts.

flex-grow, flex-shrink, flex-basis – der Motor von Flexbox

Flexbox verteilt verfügbaren Raum dynamisch. Der Schlüssel dazu liegt in den drei Untereigenschaften von flex:

flex-grow

Wie viel zusätzlich vorhandenen Platz ein Item einnehmen darf.

.item {
  flex-grow: 1; /* Item darf wachsen */
}

flex-shrink

Wie stark Items schrumpfen dürfen, wenn nicht genug Platz da ist.

.item {
  flex-shrink: 0; /* Item darf NICHT schrumpfen */
}

Ein häufiger Fehler in realen Projekten:

input {
  flex: 1;
}

Das bedeutet:

flex-grow: 1
flex-shrink: 1
flex-basis: 0

Das Shrinking kann dazu führen, dass Input-Felder kleiner werden als erwartet.

flex-basis

Die Startbreite (oder -höhe) eines Items.

.card {
  flex-basis: 200px;
}

Ein Klassiker: flex-basis hat Vorrang vor width, wenn beides gesetzt ist – es sei denn, flex-basis ist auto, dann greift wieder width.

Praxisbeispiel: Drei Cards mit automatischem Platzverhalten

Viele Teams bauen folgendes Raster:

.cards {
  display: flex;
}

.card {
  flex: 1;
  margin: 1rem;
}

Das Problem: Auf kleinen Screens schrumpfen die Cards bis zur Unlesbarkeit, weil flex-shrink: 1 aktiv ist.

Die bessere Variante:

.card {
  flex: 1 1 250px; /* grow, shrink, basis */
}

Damit:

Das Muster ist robust und gehört zu den zentralen Flexbox-Patterns.

gap – der unterschätzte Game Changer

Jahrelang waren Abstände in Flexbox ein Pain-Point. Jetzt gibt es gap – und es löst viele dieser Probleme.

Früher:

.item {
  margin-right: 1rem;
}

Heute:

.container {
  display: flex;
  gap: 1rem;
}

Keine Selektorprobleme. Keine negativen Margins. Keine letzten Elemente, die korrigiert werden müssen.

Moderne Layouts sollten fast immer gap statt margin für interne Abstände nutzen.

Häufige Flexbox-Fallen in großen Projekten

1. Der Default align-items: stretch wird nicht bedacht

Standardverhalten bei row:

Das führt oft zu:

Die Lösung: align-items explizit setzen:

.form-group {
  display: flex;
  align-items: center;
}

Ohne explizites align-items bleibt stretch aktiv und verursacht unsaubere Zeilenhöhen.

2. Fixe Höhen + Flexbox = Probleme

Viele Teams deklarieren:

.header {
  display: flex;
  height: 60px;
}

Wenn dann der Inhalt überläuft, bricht das Layout oder verändert sich unsichtbar. Besser:

.header {
  min-height: 60px;
}

Flexbox ist für flexible Layouts gemacht – fixe Höhen widersprechen dem oft.

3. Flexbox wird dort genutzt, wo Grid besser wäre

Typischer Fall:

.stats {
  display: flex;
  justify-content: space-between;
}

Wenn man aber eigentlich ein 2D-Layout braucht, ist Grid klarer und stabiler. Flexbox sollte nur dann genutzt werden, wenn man in einer Achse denkt.

Ein kleines Praxispattern: Flexbox zum Zentrieren

Das wichtigste Flexbox-Pattern überhaupt:

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

Man nutzt es so oft, dass es sich lohnt, es als Utility zu pflegen.

Fazit

Flexbox wirkt einfach, aber seine Logik unterscheidet sich stark vom klassischen Box-Modell. Wer die Grundprinzipien versteht – Hauptachse, Grow/Shrink/Basis und die Rolle von align/justify – löst Layoutprobleme schneller und baut robustere Komponenten.

In Türchen 6 geht es dann weiter mit Flexbox-Patterns, die in jeder Codebase vorkommen und die man im Alltag einfach im Kopf haben sollte.


☕ 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 6 – Flexbox Patterns, die man im Schlaf können sollte
Next Post
Türchen 4 – Das Box-Modell meistern

Kommentare