CSS Flexbox Layout Guide

Avatar of Chris Coyier
Chris Coyier am

Unser umfassender Leitfaden zum CSS Flexbox Layout. Dieser vollständige Leitfaden erklärt alles über Flexbox, wobei der Fokus auf allen verschiedenen möglichen Eigenschaften für das Elternelement (der Flex-Container) und die Kinderelemente (die Flex-Items) liegt. Er enthält auch eine Historie, Demos, Muster und eine Browser-Support-Tabelle.

Präsentiert von DigitalOcean

DigitalOcean bietet die Cloud-Computing-Dienste, die Sie benötigen, um Ihr Wachstum in jeder Phase zu unterstützen. Starten Sie mit einem kostenlosen Guthaben von 200 $!

Hol das Poster!

Nutzt du diesen Leitfaden oft? Hier ist ein hochauflösendes Bild, das du drucken kannst!


Hintergrund

Das Flexbox Layout (Flexible Box)-Modul (eine W3C Candidate Recommendation vom Oktober 2017) zielt darauf ab, eine effizientere Methode zum Layouten, Ausrichten und Verteilen von Platz unter Elementen in einem Container bereitzustellen, selbst wenn deren Größe unbekannt und/oder dynamisch ist (daher das Wort „flex“).

Die Hauptidee hinter dem Flex-Layout ist, dem Container die Fähigkeit zu geben, die Breite/Höhe (und Reihenfolge) seiner Elemente zu ändern, um den verfügbaren Platz optimal zu füllen (meistens um sich an alle Arten von Anzeigegeräten und Bildschirmgrößen anzupassen). Ein Flex-Container dehnt Elemente aus, um verfügbaren freien Platz zu füllen, oder schrumpft sie, um Überlauf zu verhindern.

Am wichtigsten ist, dass das Flexbox-Layout richtungsunabhängig ist, im Gegensatz zu den regulären Layouts (Block, das vertikal basiert ist, und Inline, das horizontal basiert ist). Während diese gut für Seiten funktionieren, fehlt ihnen die Flexibilität (kein Wortspiel beabsichtigt), um große oder komplexe Anwendungen zu unterstützen (insbesondere wenn es um Orientierungsänderungen, Größenänderungen, Strecken, Schrumpfen usw. geht).

Hinweis: Das Flexbox-Layout eignet sich am besten für die Komponenten einer Anwendung und kleine Layouts, während das Grid-Layout für größere Layouts vorgesehen ist.

Grundlagen und Terminologie

Da Flexbox ein ganzes Modul und keine einzelne Eigenschaft ist, beinhaltet es viele Dinge, einschließlich seines gesamten Satzes von Eigenschaften. Einige davon sind dazu gedacht, am Container (Elternelement, bekannt als „Flex-Container“) festgelegt zu werden, während die anderen an den Kindern (genannt „Flex-Items“) festgelegt werden sollen.

Wenn das „reguläre“ Layout sowohl auf Block- als auch auf Inline-Flussrichtungen basiert, basiert das Flex-Layout auf „Flex-Flussrichtungen“. Bitte sieh dir diese Abbildung aus der Spezifikation an, die die Hauptidee hinter dem Flex-Layout erklärt.

A diagram explaining flexbox terminology. The size across the main axis of flexbox is called the main size, the other direction is the cross size. Those sizes have a main start, main end, cross start, and cross end.

Elemente werden entweder entlang der Hauptachse (von main-start bis main-end) oder der Querachse (von cross-start bis cross-end) angeordnet.

  • Hauptachse – Die Hauptachse eines Flex-Containers ist die primäre Achse, entlang der die Flex-Elemente angeordnet werden. Achtung, sie ist nicht unbedingt horizontal; dies hängt von der Eigenschaft flex-direction ab (siehe unten).
  • main-start | main-end – Die Flex-Elemente werden innerhalb des Containers beginnend bei main-start und bis main-end platziert.
  • main size – Die Breite oder Höhe eines Flex-Elements, je nachdem, welche in der Hauptdimension liegt, ist die Hauptgröße des Elements. Die Hauptgrößen-Eigenschaft des Flex-Elements ist entweder die 'width'- oder 'height'-Eigenschaft, je nachdem, welche in der Hauptdimension liegt.
  • Querachse – Die zur Hauptachse senkrechte Achse wird Querachse genannt. Ihre Richtung hängt von der Richtung der Hauptachse ab.
  • cross-start | cross-end – Flex-Linien werden mit Elementen gefüllt und beginnend an der cross-start-Seite des Flex-Containers und in Richtung der cross-end-Seite in den Container platziert.
  • cross size – Die Breite oder Höhe eines Flex-Elements, je nachdem, welche in der Querdimension liegt, ist die Quergröße des Elements. Die Quergrößen-Eigenschaft ist entweder die 'width'- oder 'height'-Eigenschaft, die in der Querdimension liegt.

Flexbox-Eigenschaften

Eigenschaften für das Elternelement
(Flex-Container)

display

Dies definiert einen Flex-Container; inline oder block, je nach dem gegebenen Wert. Es ermöglicht einen Flex-Kontext für alle seine direkten Kinder.

.container {
  display: flex; /* or inline-flex */
}

Beachte, dass CSS-Spalten keine Auswirkung auf einen Flex-Container haben.

flex-direction

the four possible values of flex-direction being shown: top to bottom, bottom to top, right to left, and left to right


Dies legt die Hauptachse fest und definiert somit die Richtung, in der Flex-Items im Flex-Container platziert werden. Flexbox ist (abgesehen von optionalem Umbruch) ein unidirektionales Layout-Konzept. Stell dir Flex-Items vor, die primär entweder in horizontalen Reihen oder vertikalen Spalten angeordnet sind.

.container {
  flex-direction: row | row-reverse | column | column-reverse;
}
  • row (Standard): von links nach rechts in ltr; von rechts nach links in rtl
  • row-reverse: von rechts nach links in ltr; von links nach rechts in rtl
  • column: wie row, aber von oben nach unten
  • column-reverse: wie row-reverse, aber von unten nach oben

flex-wrap

two rows of boxes, the first wrapping down onto the second

Standardmäßig versuchen alle Flex-Elemente, in eine Zeile zu passen. Du kannst das ändern und den Elementen erlauben, bei Bedarf mit dieser Eigenschaft umzubrechen.

.container {
  flex-wrap: nowrap | wrap | wrap-reverse;
}
  • nowrap (Standard): alle Flex-Elemente werden in einer Zeile sein
  • wrap: Flex-Elemente werden auf mehrere Zeilen umbrechen, von oben nach unten.
  • wrap-reverse: Flex-Elemente werden auf mehrere Zeilen umbrechen, von unten nach oben.

Hier gibt es einige visuelle Demos von flex-wrap.

flex-flow

Dies ist eine Kurzform für die Eigenschaften flex-direction und flex-wrap, die zusammen die Haupt- und Querachsen des Flex-Containers definieren. Der Standardwert ist row nowrap.

.container {
  flex-flow: column wrap;
}

justify-content

flex items within a flex container demonstrating the different spacing options


Dies definiert die Ausrichtung entlang der Hauptachse. Es hilft, den verbleibenden freien Platz zu verteilen, wenn alle Flex-Items in einer Zeile unflexibel sind oder flexibel sind, aber ihre maximale Größe erreicht haben. Es übt auch eine gewisse Kontrolle über die Ausrichtung von Elementen aus, wenn sie die Zeile überlaufen.

.container {
  justify-content: flex-start | flex-end | center | space-between | space-around | space-evenly | start | end | left | right ... + safe | unsafe;
}
  • flex-start (Standard): Elemente werden zum Beginn der Flex-Richtung hin gepackt.
  • flex-end: Elemente werden zum Ende der Flex-Richtung hin gepackt.
  • start: Elemente werden zum Beginn der writing-mode-Richtung hin gepackt.
  • end: Elemente werden zum Ende der writing-mode-Richtung hin gepackt.
  • left: Elemente werden zur linken Kante des Containers hin gepackt, es sei denn, dies ist mit der flex-direction nicht sinnvoll, dann verhält es sich wie start.
  • right: Elemente werden zur rechten Kante des Containers hin gepackt, es sei denn, dies ist mit der flex-direction nicht sinnvoll, dann verhält es sich wie end.
  • center: Elemente werden entlang der Linie zentriert
  • space-between: Elemente werden gleichmäßig in der Linie verteilt; das erste Element befindet sich am Anfang der Linie, das letzte Element am Ende der Linie
  • space-around: Elemente werden gleichmäßig in der Linie mit gleichem Abstand um sie herum verteilt. Beachte, dass die Abstände visuell nicht gleich sind, da alle Elemente auf beiden Seiten den gleichen Abstand haben. Das erste Element hat einen Abstand von einer Einheit zur Containerkante, aber zwei Einheiten Abstand zum nächsten Element, da dieses nächste Element seinen eigenen Abstand hat, der angewendet wird.
  • space-evenly: Elemente werden so verteilt, dass der Abstand zwischen zwei beliebigen Elementen (und der Abstand zu den Rändern) gleich ist.

Beachte, dass die Browser-Unterstützung für diese Werte nuanciert ist. Zum Beispiel wurde space-between von einigen Edge-Versionen nie unterstützt, und start/end/left/right sind noch nicht in Chrome. MDN hat detaillierte Diagramme. Die sichersten Werte sind flex-start, flex-end und center.

Es gibt auch zwei zusätzliche Schlüsselwörter, die Sie mit diesen Werten kombinieren können: safe und unsafe. Die Verwendung von safe stellt sicher, dass Sie, egal wie Sie diese Art der Positionierung vornehmen, ein Element nicht so verschieben können, dass es außerhalb des Bildschirms (z.B. oben) gerendert wird, und zwar so, dass der Inhalt nicht mehr gescrollt werden kann (genannt „Datenverlust“).

align-items

demonstration of differnet alignment options, like all boxes stuck to the top of a flex parent, the bottom, stretched out, or along a baseline


Dies definiert das Standardverhalten, wie Flex-Elemente entlang der Querachse auf der aktuellen Linie angeordnet werden. Stell es dir als die justify-content-Version für die Querachse vor (senkrecht zur Hauptachse).

.container {
  align-items: stretch | flex-start | flex-end | center | baseline | first baseline | last baseline | start | end | self-start | self-end + ... safe | unsafe;
}
  • stretch (Standard): dehnt sich aus, um den Container zu füllen (respektiert immer noch min-width/max-width)
  • flex-start / start / self-start: Elemente werden am Anfang der Querachse platziert. Der Unterschied zwischen diesen ist subtil und betrifft die Einhaltung der flex-direction-Regeln oder der writing-mode-Regeln.
  • flex-end / end / self-end: Elemente werden am Ende der Querachse platziert. Der Unterschied ist wiederum subtil und betrifft die Einhaltung der flex-direction-Regeln im Vergleich zu den writing-mode-Regeln.
  • center: Elemente werden in der Querachse zentriert
  • baseline: Elemente werden so ausgerichtet, dass ihre Grundlinien übereinstimmen

Die Modifikatorschlüsselwörter safe und unsafe können in Verbindung mit allen anderen Schlüsselwörtern verwendet werden (obwohl die Browserunterstützung zu beachten ist) und helfen, zu verhindern, dass Elemente so ausgerichtet werden, dass der Inhalt unzugänglich wird.

align-content

examples of the align-content property where a group of items cluster at the top or bottom, or stretch out to fill the space, or have spacing.


Dies richtet die Zeilen eines Flex-Containers aus, wenn zusätzlicher Platz in der Querachse vorhanden ist, ähnlich wie justify-content einzelne Elemente in der Hauptachse ausrichtet.

Hinweis: Diese Eigenschaft wirkt sich nur auf mehrzeilige flexible Container aus, bei denen flex-wrap auf wrap oder wrap-reverse gesetzt ist. Ein einzeiliger flexibler Container (d.h. bei dem flex-wrap auf seinen Standardwert no-wrap gesetzt ist) wird align-content nicht widerspiegeln.

.container {
  align-content: flex-start | flex-end | center | space-between | space-around | space-evenly | stretch | start | end | baseline | first baseline | last baseline + ... safe | unsafe;
}
  • normal (Standard): Die Elemente werden in ihrer Standardposition gepackt, als ob kein Wert gesetzt wäre.
  • flex-start / start: Elemente werden am Anfang des Containers gepackt. Das (besser unterstützte) flex-start berücksichtigt die flex-direction, während start die writing-mode-Richtung berücksichtigt.
  • flex-end / end: Elemente werden am Ende des Containers gepackt. Das (besser unterstützte) flex-end berücksichtigt die flex-direction, während end die writing-mode-Richtung berücksichtigt.
  • center: Elemente zentriert im Container
  • space-between: Elemente gleichmäßig verteilt; die erste Zeile ist am Anfang des Containers, während die letzte am Ende ist
  • space-around: Elemente gleichmäßig verteilt mit gleichem Abstand um jede Zeile
  • space-evenly: Elemente werden gleichmäßig mit gleichem Abstand um sie herum verteilt.
  • stretch: Linien dehnen sich, um den verbleibenden Platz einzunehmen

Die Modifikatorschlüsselwörter safe und unsafe können in Verbindung mit allen anderen Schlüsselwörtern verwendet werden (obwohl die Browserunterstützung zu beachten ist) und helfen, zu verhindern, dass Elemente so ausgerichtet werden, dass der Inhalt unzugänglich wird.

gap, row-gap, column-gap

Die gap-Eigenschaft steuert explizit den Abstand zwischen Flex-Items. Sie wendet diesen Abstand nur zwischen den Items an, nicht an den äußeren Rändern.

.container {
  display: flex;
  ...
  gap: 10px;
  gap: 10px 20px; /* row-gap column gap */
  row-gap: 10px;
  column-gap: 20px;
}

Das Verhalten könnte als ein minimaler Spalt verstanden werden, denn wenn der Spalt irgendwie größer ist (aufgrund von etwas wie justify-content: space-between;), dann wirkt sich der Gap nur aus, wenn dieser Raum kleiner werden würde.

Es ist nicht ausschließlich für Flexbox, gap funktioniert auch in Grid- und Mehrspalten-Layouts.

Eigenschaften für die Kinder
(Flex-Items)

order

Diagram showing flexbox order. A container with the items being 1 1 1 2 3, -1 1 2 5, and 2 2 99.


Standardmäßig werden Flex-Items in der Quellreihenfolge angeordnet. Die Eigenschaft order steuert jedoch die Reihenfolge, in der sie im Flex-Container erscheinen.

.item {
  order: 5; /* default is 0 */
}

Elemente mit der gleichen order kehren zur Quellreihenfolge zurück.

flex-grow

two rows of items, the first has all equally-sized items with equal flex-grow numbers, the second with the center item at twice the width because its value is 2 instead of 1.


Dies definiert die Fähigkeit eines Flex-Items, bei Bedarf zu wachsen. Es akzeptiert einen einheitenlosen Wert, der als Proportion dient. Es bestimmt, wie viel des verfügbaren Platzes im Flex-Container das Element einnehmen soll.

Wenn alle Elemente flex-grow auf 1 gesetzt haben, wird der verbleibende Platz im Container gleichmäßig auf alle Kinder verteilt. Wenn eines der Kinder einen Wert von 2 hat, würde dieses Kind doppelt so viel Platz einnehmen wie jedes der anderen (oder es wird es zumindest versuchen).

.item {
  flex-grow: 4; /* default 0 */
}

Negative Zahlen sind ungültig.

flex-shrink

Dies definiert die Fähigkeit eines Flex-Items, bei Bedarf zu schrumpfen.

.item {
  flex-shrink: 3; /* default 1 */
}

Negative Zahlen sind ungültig.

flex-basis

Dies definiert die Standardgröße eines Elements, bevor der verbleibende Platz verteilt wird. Es kann eine Länge (z. B. 20%, 5rem usw.) oder ein Schlüsselwort sein. Das Schlüsselwort auto bedeutet „schau dir meine Breite- oder Höhen-Eigenschaft an“ (was vorübergehend durch das Schlüsselwort main-size erledigt wurde, bis es veraltet wurde). Das Schlüsselwort content bedeutet „Größe basierend auf dem Inhalt des Elements“ – dieses Schlüsselwort wird noch nicht gut unterstützt, daher ist es schwierig zu testen und noch schwieriger zu wissen, was seine Geschwister max-content, min-content und fit-content tun.

.item {
  flex-basis:  | auto; /* default auto */
}

Wenn auf 0 gesetzt, wird der zusätzliche Platz um den Inhalt nicht berücksichtigt. Wenn auf auto gesetzt, wird der zusätzliche Platz basierend auf dem flex-grow-Wert verteilt. Siehe diese Grafik.

flex

Dies ist die Kurzform für flex-grow, flex-shrink und flex-basis zusammen. Die zweiten und dritten Parameter (flex-shrink und flex-basis) sind optional. Der Standardwert ist 0 1 auto, aber wenn Sie ihn mit einem einzelnen Zahlenwert setzen, wie flex: 5;, ändert sich der flex-basis auf 0%, so dass es so ist, als ob Sie flex-grow: 5; flex-shrink: 1; flex-basis: 0%; setzen würden.

.item {
  flex: none | [ <'flex-grow'> <'flex-shrink'>? || <'flex-basis'> ]
}

Es wird empfohlen, diese Kurzform-Eigenschaft zu verwenden, anstatt die einzelnen Eigenschaften zu setzen. Die Kurzform setzt die anderen Werte intelligent.

align-self

One item with a align-self value is positioned along the bottom of a flex parent instead of the top where all the rest of the items are.


Dies erlaubt, die Standardausrichtung (oder die durch align-items angegebene) für einzelne Flex-Items zu überschreiben.

Bitte sieh dir die Erklärung zu align-items an, um die verfügbaren Werte zu verstehen.

.item {
  align-self: auto | flex-start | flex-end | center | baseline | stretch;
}

Beachte, dass float, clear und vertical-align keine Auswirkung auf ein Flex-Item haben.

Flexbox Präfixe

Flexbox erfordert einige Herstellerpräfixe, um möglichst viele Browser zu unterstützen. Es beinhaltet nicht nur das Voranstellen von Eigenschaften mit dem Herstellerpräfix, sondern es gibt tatsächlich völlig unterschiedliche Eigenschaften- und Wertnamen. Dies liegt daran, dass sich die Flexbox-Spezifikation im Laufe der Zeit geändert hat, wodurch „alte“, „tweener“ und „neue“ Versionen entstanden sind.

Der beste Weg, dies zu handhaben, ist vielleicht, in der neuen (und endgültigen) Syntax zu schreiben und Ihr CSS durch Autoprefixer laufen zu lassen, der die Fallbacks sehr gut handhabt.

Alternativ gibt es hier ein Sass-@mixin, das bei der Präfixierung hilft und Ihnen auch eine Vorstellung davon gibt, welche Art von Dingen getan werden müssen.

@mixin flexbox() {
  display: -webkit-box;
  display: -moz-box;
  display: -ms-flexbox;
  display: -webkit-flex;
  display: flex;
}

@mixin flex($values) {
  -webkit-box-flex: $values;
  -moz-box-flex:  $values;
  -webkit-flex:  $values;
  -ms-flex:  $values;
  flex:  $values;
}

@mixin order($val) {
  -webkit-box-ordinal-group: $val;  
  -moz-box-ordinal-group: $val;     
  -ms-flex-order: $val;     
  -webkit-order: $val;  
  order: $val;
}

.wrapper {
  @include flexbox();
}

.item {
  @include flex(1 200px);
  @include order(2);
}

Beispiele

Beginnen wir mit einem sehr einfachen Beispiel, das ein fast alltägliches Problem löst: perfekte Zentrierung. Einfacher geht es mit Flexbox nicht.

.parent {
  display: flex;
  height: 300px; /* Or whatever */
}

.child {
  width: 100px;  /* Or whatever */
  height: 100px; /* Or whatever */
  margin: auto;  /* Magic! */
}

Dies beruht darauf, dass ein auf auto gesetzter Margin in einem Flex-Container zusätzlichen Platz absorbiert. Ein Margin von auto bewirkt also, dass das Element in beiden Achsen perfekt zentriert wird.

Lass uns nun weitere Eigenschaften verwenden. Stell dir eine Liste von 6 Elementen vor, alle mit festen Dimensionen, aber automatisch skalierbar. Wir möchten, dass sie auf der horizontalen Achse gleichmäßig verteilt sind, so dass beim Ändern der Browsergröße alles schön skaliert wird, und das ohne Media Queries.

.flex-container {
  /* We first create a flex layout context */
  display: flex;

  /* Then we define the flow direction 
     and if we allow the items to wrap 
   * Remember this is the same as:
   * flex-direction: row;
   * flex-wrap: wrap;
   */
  flex-flow: row wrap;

  /* Then we define how is distributed the remaining space */
  justify-content: space-around;
}

Fertig. Alles andere ist nur Styling. Unten ist ein Pen mit diesem Beispiel. Geh unbedingt zu CodePen und versuche, deine Fenster zu vergrößern und zu verkleinern, um zu sehen, was passiert.

Versuchen wir etwas anderes. Stell dir vor, wir haben ein rechtsbündiges Navigationselement ganz oben auf unserer Website, aber wir möchten, dass es auf mittelgroßen Bildschirmen zentriert und auf kleinen Geräten einspaltig ist. Einfach genug.

/* Large */
.navigation {
  display: flex;
  flex-flow: row wrap;
  /* This aligns items to the end line on main-axis */
  justify-content: flex-end;
}

/* Medium screens */
@media all and (max-width: 800px) {
  .navigation {
    /* When on medium sized screens, we center it by evenly distributing empty space around items */
    justify-content: space-around;
  }
}

/* Small screens */
@media all and (max-width: 500px) {
  .navigation {
    /* On small screens, we are no longer using row direction but column */
    flex-direction: column;
  }
}

Lassen Sie uns etwas noch Besseres ausprobieren, indem wir mit der Flexibilität von Flex-Elementen spielen! Wie wäre es mit einem Mobile-First-3-Spalten-Layout mit vollbreiter Kopf- und Fußzeile. Und unabhängig von der Quellreihenfolge.

.wrapper {
  display: flex;
  flex-flow: row wrap;
}

/* We tell all items to be 100% width, via flex-basis */
.wrapper > * {
  flex: 1 100%;
}

/* We rely on source order for mobile-first approach
 * in this case:
 * 1. header
 * 2. article
 * 3. aside 1
 * 4. aside 2
 * 5. footer
 */

/* Medium screens */
@media all and (min-width: 600px) {
  /* We tell both sidebars to share a row */
  .aside { flex: 1 auto; }
}

/* Large screens */
@media all and (min-width: 800px) {
  /* We invert order of first sidebar and main
   * And tell the main element to take twice as much width as the other two sidebars 
   */
  .main { flex: 3 0px; }
  .aside-1 { order: 1; }
  .main    { order: 2; }
  .aside-2 { order: 3; }
  .footer  { order: 4; }
}

Flexbox-Tricks!

Browser-Unterstützung

Diese Browser-Support-Daten stammen von Caniuse, das mehr Details bietet. Eine Zahl zeigt an, dass der Browser die Funktion ab dieser Version und höher unterstützt.

Desktop

ChromeFirefoxIEEdgeSafari
21*2811126.1*

Mobil / Tablet

Android ChromeAndroid FirefoxAndroidiOS Safari
1271274.47.0-7.1*

Bugs

Flexbox ist sicherlich nicht ohne seine Bugs. Die beste Sammlung davon, die ich gesehen habe, ist Flexbugs von Philip Walton und Greg Whitworth. Es ist ein Open-Source-Ort, um alle zu verfolgen, daher denke ich, dass es am besten ist, einfach dorthin zu verlinken.

Verwandte Eigenschaften

Weitere Informationen

Weitere Quellen