CSS Flexbox: Jedes Layout in Minuten mit einem visuellen Generator erstellen
📷 Sai Kiran Anagani / PexelsCSS Flexbox: Jedes Layout in Minuten mit einem visuellen Generator erstellen
flex-direction, justify-content, align-items — sehen Sie genau, was jede Eigenschaft bewirkt, mit einem Live-Visual-Playground. Inklusive gängiger Layout-Rezepte.
Meine Flexbox-Reise (und warum ich noch immer nachschlage)
Ich erinnere mich genau an den Moment, in dem ich dachte, ich hätte Flexbox verstanden. Ich hatte den besseren Teil eines Nachmittags mit einer Navigationsleiste gerungen, Floats taten nicht was ich wollte, inline-block fügte Phantom-Abstände hinzu, und dann sagte jemand in einem Stack-Overflow-Kommentar "verwende einfach Flexbox." Also tat ich es. Ich tippte display: flex und alles war ausgerichtet. Magie.
Am nächsten Tag versuchte ich, etwas vertikal zu zentrieren, und war wieder völlig verloren.
Das ist das Ding mit Flexbox — der Einstieg fühlt sich einfach an, aber das mentale Modell braucht eine Weile, um wirklich zu klicken. Der Moment, in dem es für mich klickte, war als ich aufhörte, in Begriffen wie "links, rechts, oben, unten" zu denken und stattdessen in Achsen zu denken. Sobald diese Umstellung geschah, wurde Flexbox zu einem der befriedigendsten Werkzeuge in CSS.
Wenn Sie beim Lesen visuell experimentieren möchten, schauen Sie sich den CSS Flexbox Generator auf ToolBox Hubs an — er lässt Sie Eigenschaften anpassen und das Ergebnis in Echtzeit sehen, was ehrlich gesagt die schnellste Möglichkeit ist, das mentale Modell aufzubauen.
Das Flex-Container-Modell
Alles in Flexbox beginnt mit einer Regel: Sie haben einen Container und darin Elemente. Sie setzen display: flex auf dem Container, und die direkten Kinder werden zu Flex-Elementen. Das ist die gesamte Hierarchie — Container und Elemente.
.container {
display: flex;
}
Diese eine Zeile ändert viel. Ihre Elemente sitzen jetzt standardmäßig in einer Zeile, sie strecken sich, um die Containerhöhe zu füllen, und sie schrumpfen, wenn nicht genug Platz vorhanden ist. Die meisten Flexbox-Eigenschaften werden auf dem Container gesetzt, nicht auf den Elementen.
Die zwei Achsen
Das ist der Teil, der fast jeden verwirrt, der Flexbox lernt, und ich würde argumentieren, es ist das wichtigste Konzept, das verinnerlicht werden sollte. Flexbox arbeitet auf zwei Achsen:
- Hauptachse — die Richtung, in der Ihre Elemente fließen (Zeile oder Spalte)
- Querachse — senkrecht zur Hauptachse
Wenn flex-direction row ist (Standard), verläuft die Hauptachse von links nach rechts, und die Querachse von oben nach unten. Wenn Sie zu column wechseln, kehren sich diese um. Das ist enorm wichtig, weil justify-content und align-items relativ zu diesen Achsen definiert sind, nicht relativ zu absoluten Richtungen.
Sobald Sie sich merken, dass justify immer "entlang der Hauptachse" und align immer "entlang der Querachse" bedeutet, wird alles andere vorhersehbar.
Alle Eigenschaften, die Sie wirklich brauchen
flex-direction
Steuert, in welche Richtung Ihre Elemente fließen.
.container {
display: flex;
flex-direction: row; /* Standard — links nach rechts */
flex-direction: row-reverse; /* rechts nach links */
flex-direction: column; /* oben nach unten */
flex-direction: column-reverse; /* unten nach oben */
}
column ist etwas, das ich öfter verwende als ich erwartet hatte. Immer wenn Sie Dinge vertikal stapeln und deren Abstände kontrollieren möchten, ist flex-direction: column kombiniert mit gap fantastisch.
justify-content
Richtet Elemente entlang der Hauptachse aus. In einer Zeile ist das horizontal. In einer Spalte ist das vertikal.
.container {
display: flex;
justify-content: flex-start; /* Standard — Elemente am Anfang */
justify-content: flex-end; /* Elemente am Ende */
justify-content: center; /* Elemente in der Mitte */
justify-content: space-between; /* gleicher Abstand zwischen Elementen, keiner an den Rändern */
justify-content: space-around; /* gleicher Abstand um jedes Element */
justify-content: space-evenly; /* überall wirklich gleicher Abstand */
}
space-between ist das, was ich am häufigsten für Navigationsleisten verwende — Elemente verteilen sich auf beide Enden mit gleichen Abständen dazwischen. center ist das, was Sie wollen, wenn Sie einfach etwas in die Mitte brauchen.
align-items
Richtet Elemente entlang der Querachse aus. In einer Zeile ist das vertikal. In einer Spalte ist das horizontal.
.container {
display: flex;
align-items: stretch; /* Standard — Elemente strecken sich zur Containerhöhe */
align-items: flex-start; /* Elemente sitzen oben */
align-items: flex-end; /* Elemente sitzen unten */
align-items: center; /* Elemente vertikal zentriert */
align-items: baseline; /* Elemente an Textgrundlinie ausgerichtet */
}
stretch als Standard ist tatsächlich ziemlich nützlich — das ist der Grund, warum Flex-Elemente in einer Zeile alle die gleiche Höhe haben, auch wenn sie unterschiedliche Inhaltsmengen haben. Aber sobald Sie vertikale Zentrierung wollen, greifen Sie nach align-items: center.
flex-wrap
Standardmäßig versuchen Flex-Elemente, in einer Zeile zu passen und schrumpfen dafür. flex-wrap lässt Sie dieses Verhalten ändern.
.container {
display: flex;
flex-wrap: nowrap; /* Standard — Elemente bleiben in einer Zeile */
flex-wrap: wrap; /* Elemente umbrechen in neue Zeilen */
flex-wrap: wrap-reverse; /* Elemente umbrechen nach oben */
}
flex-wrap: wrap ist für responsive Karten-Grids unerlässlich. Ohne es werden Ihre Elemente weiter schrumpfen, egal wie klein der Viewport wird.
gap
gap ist technisch gesehen keine nur-flex-Eigenschaft — sie kam von CSS Grid — aber sie funktioniert mit Flexbox und ist wirklich großartig. Früher machten wir Margin-Hacks. Jetzt:
.container {
display: flex;
gap: 16px; /* gleicher Abstand in beide Richtungen */
gap: 12px 24px; /* Zeilenabstand Spaltenabstand */
}
Überall verwenden. Es ist einfacher als Margin und fügt keinen Abstand an den Rändern hinzu.
align-content
Diese ist leicht zu übersehen. align-content ist wie justify-content, aber für die Querachse, und es tut nur etwas, wenn Sie mehrere Zeilen haben (d.h. wenn flex-wrap: wrap aktiv ist und Elemente tatsächlich umgebrochen sind). Wenn alle Elemente in einer Zeile sind, hat align-content keinen sichtbaren Effekt.
.container {
display: flex;
flex-wrap: wrap;
align-content: flex-start;
align-content: center;
align-content: space-between;
}
Das ist wahrscheinlich die am häufigsten missverstandene Flexbox-Eigenschaft — Leute setzen sie und erwarten etwas und nichts passiert, weil ihre Elemente nicht umbrechen.
Eigenschaften auf Element-Ebene
Einige Eigenschaften werden auf den Flex-Elementen selbst gesetzt, nicht auf dem Container.
flex-grow — wie viel ein Element wächst, um verfügbaren Platz zu füllen (Standard: 0)
flex-shrink — wie viel ein Element schrumpft, wenn der Platz knapp ist (Standard: 1)
flex-basis — die Startgröße des Elements vor dem Wachsen oder Schrumpfen (Standard: auto)
Diese drei werden oft mit dem Kurzschreibweise flex kombiniert:
.item {
flex: 1; /* grow: 1, shrink: 1, basis: 0 — gleichbreite Elemente */
flex: 0 0 200px; /* feste Breite, kein Wachsen oder Schrumpfen */
flex: 2; /* dieses Element wächst doppelt so schnell wie flex: 1 Geschwister */
}
align-self lässt ein einzelnes Element die align-items-Einstellung des Containers überschreiben:
.special-item {
align-self: flex-end; /* dieses Element bleibt unten, auch wenn Geschwister es nicht tun */
}
Häufige Muster
Alles zentrieren (der Klassiker)
Das ist wahrscheinlich der am häufigsten gegoogelte CSS-Schnipsel der Geschichte. Ein Div sowohl horizontal als auch vertikal zentrieren:
.container {
display: flex;
justify-content: center;
align-items: center;
height: 100vh; /* braucht eine Höhe, um darin vertikal zu zentrieren */
}
Das war's. Zwei Zeilen (drei, wenn Sie die Höhe mitzählen). Vor Flexbox war vertikales Zentrieren wirklich schmerzhaft. Jetzt ist es Muskelgedächtnis.
Responsive Navigationsleiste
Eine horizontale Navigation, die das Logo nach links und Nav-Links nach rechts schiebt:
.navbar {
display: flex;
justify-content: space-between;
align-items: center;
padding: 0 24px;
}
Und für Mobile könnten Sie zu Spalte wechseln:
@media (max-width: 768px) {
.navbar {
flex-direction: column;
gap: 12px;
}
}
Responsives Karten-Grid
Karten, die auf dem Desktop nebeneinander sitzen und auf Mobile stapeln:
.card-grid {
display: flex;
flex-wrap: wrap;
gap: 24px;
}
.card {
flex: 1 1 300px; /* wachsen, schrumpfen, Mindestbreite 300px */
max-width: 400px;
}
Das flex: 1 1 300px ist der Schlüssel — es sagt "starte bei 300px Breite, aber wachse und schrumpfe nach Bedarf." Karten werden bei kleineren Bildschirmen natürlich in weniger Spalten umfließen, ohne eine einzige Media Query.
Sticky Footer
Klassisches "Footer bleibt unten, auch bei wenig Inhalt"-Muster:
body {
display: flex;
flex-direction: column;
min-height: 100vh;
}
main {
flex: 1; /* Hauptinhalt wächst, um Footer nach unten zu drücken */
}
footer {
/* bleibt unten */
}
Das ist in fast jedem Projekt, das ich baue.
Flexbox vs. CSS Grid: Wann was verwenden
Darüber gibt es online viel unnötige Debatte. Die ehrliche Antwort ist: Beide verwenden, sie sind für verschiedene Dinge.
Greifen Sie zu Flexbox, wenn:
- Sie eine einzelne Zeile oder Spalte von Elementen haben
- Elemente natürlich umbrechen sollen (wie Tags, Kartenlisten)
- Sie eine Navigationsleiste, eine Toolbar oder eine Schaltflächengruppe bauen
- Sie eine Achse der Kontrolle mit flexibler Elementgröße brauchen
Greifen Sie zu CSS Grid, wenn:
- Sie ein zweidimensionales Layout mit Zeilen und Spalten haben
- Sie ein Seiten-Level-Layout mit Kopfzeile, Sidebar, Hauptinhalt, Fußzeile bauen
- Sie explizite Platzierung von Elementen in bestimmten Zellen wollen
- Sie konsistente Zeilenhöhen über mehrere Spalten benötigen
In der Praxis könnte eine echte Seite Grid für das Gesamtseitenlayout, Flexbox für die Navigation, Flexbox für das interne Layout einer Karte und Grid wieder für eine Datentabelle verwenden. Sie ergänzen sich gut.
Häufige Fehler und Fallstricke
flex-shrink: 0 für Bilder
Standardmäßig können Flex-Elemente schrumpfen. Bilder in Flex-Containern schrumpfen unter ihre natürliche Größe, was schrecklich aussieht. Beheben Sie es:
img {
flex-shrink: 0;
}
Oder verwenden Sie die Kurzschreibweise:
img {
flex: 0 0 auto; /* nicht wachsen, nicht schrumpfen, natürliche Größe verwenden */
}
Das min-width: 0 Overflow-Problem
Das ist subtil und treibt Leute in den Wahnsinn. Standardmäßig haben Flex-Elemente min-width: auto, was bedeutet, sie schrumpfen nicht unter ihre Inhaltsgröße. Wenn Sie ein Flex-Element mit langem Text oder einem breiten Element haben, könnte es seinen Container überlaufen, auch wenn flex: 1 gesetzt ist.
Die Lösung:
.flex-item {
min-width: 0; /* erlaubt dem Element, unter die Inhaltsgröße zu schrumpfen */
overflow: hidden; /* oder overflow: auto, wenn Sie Scrollen möchten */
}
align-content funktioniert nur mit Umbrechen
Wie oben erwähnt, tut das Setzen von align-content auf einem einzeiligen Flex-Container absolut nichts. Sie brauchen:
flex-wrap: wrapauf dem Container- Genug Elemente, um tatsächlich in mehrere Zeilen umzubrechen
margin: auto ist in Flex-Containern mächtig
Das ist eher eine Geheimwaffe als ein Fallstrick, aber es überrascht Leute: Das Setzen von margin-left: auto auf einem Flex-Element schiebt es (und alles danach) zum fernen Ende des Containers. So können Sie Nav-Layouts mit einem Logo links und einem Login-Button ganz rechts machen, ohne Wrapper-Elemente:
.nav {
display: flex;
align-items: center;
}
.nav-login {
margin-left: auto; /* schiebt den Login-Button zum rechten Rand */
}
Layouts visuell erstellen
Über Flexbox-Eigenschaften zu lesen ist nützlich, aber der schnellste Weg, das mentale Modell wirklich zu verinnerlichen, ist zu spielen. Der CSS Flexbox Generator lässt Sie jede Eigenschaft umschalten und das Layout in Echtzeit aktualisieren sehen.
Verbringen Sie ernsthaft 10 Minuten damit, durch die Eigenschaften zu klicken. Sie werden das mentale Modell schneller einschließen als stundenlange Dokumentation zu lesen.
Browser-Unterstützung
Eine Sache, über die Sie sich bei Flexbox keine Sorgen machen müssen: Browser-Unterstützung. Flexbox wird seit etwa 2015 universell unterstützt. Jeder moderne Browser unterstützt es vollständig. Sogar IE 11 hatte teilweise Unterstützung (obwohl wenn Sie noch IE 11 unterstützen, haben Sie größere Probleme).
Sie können Flexbox zuversichtlich ohne Vendor-Präfixe oder Polyfills verwenden. Die alten -webkit-flex- und -ms-flexbox-Präfixe sind längst im Ruhestand. Schreiben Sie einfach standard Flexbox und liefern Sie es aus.
Fazit
Flexbox klickte für mich in dem Moment, in dem ich aufhörte, es als "eine Möglichkeit, Dinge nach links oder rechts zu bringen" zu denken, und anfing, es als ein System von Achsen und Element-Verhaltensweisen zu denken. Die Hauptachse ist, wo Ihre Elemente fließen. Die Querachse ist senkrecht dazu. justify-content steuert die Hauptachse. align-items steuert die Querachse. Alles andere ergibt sich daraus.
Die Muster, die ich täglich verwende:
display: flex; justify-content: center; align-items: centerzum Zentrierenjustify-content: space-betweenfür Navbars und Toolbarsflex-wrap: wrapmitgapfür responsive Gridsflex: 1für gleichbreite Elemente oder wachsende Inhaltsbereicheflex-direction: column; min-height: 100vhmitflex: 1auf main für Sticky Footers
Achten Sie auf das schrumpfende Bildproblem, das min-width: 0 Overflow-Problem und die Tatsache, dass align-content umbrellende Elemente braucht, um irgendetwas zu tun.
Flexbox ist wirklich eine jener CSS-Funktionen, bei denen man sich, sobald man das mentale Modell hat, fühlt, als hätte man eine Superkraft freigeschaltet. Es ersetzt nicht CSS Grid — beides verwenden — aber für einachsige Layouts ist es kaum zu übertreffen.