PFAD: ./module/css/css2/

DATEI: string(25) "00Inhaltsverzeichnis2.php"
DATEI: string(21) "11Flex-Grundlagen.php"
DATEI: string(19) "12Flex-Property.php"
DATEI: string(14) "13CSS-Grid.php"
DATEI: string(20) "14Grid-Placement.php"
DATEI: string(21) "15Grid-Ausrichten.php"

css mit Adi Prinz

Flexbox-Grundlagen

Das Flexible Box Layout, kurz Flexbox, ist ein modernes CSS-Layoutmodell. Es dient dazu, Elemente innerhalb eines Containers flexibel anzuordnen, auszurichten und zu verteilen.

Flexbox arbeitet grundsätzlich eindimensional. Die Elemente werden hauptsächlich entweder in einer Zeile oder in einer Spalte angeordnet. Für zweidimensionale Layouts mit Zeilen und Spalten ist CSS Grid meistens besser geeignet.

Flex-Container und Flex-Items

Flexbox wird am Elternelement aktiviert. Dieses Element wird als Flex-Container bezeichnet. Seine direkten Kindelemente werden automatisch zu Flex-Items.

<div class="flex-container">
  <div class="item">1</div>
  <div class="item">2</div>
  <div class="item">3</div>
</div>
    
.flex-container {
  display: flex;
}
    

Im Beispiel ist das Element mit der Klasse .flex-container der Flex-Container. Die drei direkten Kindelemente mit der Klasse .item sind die Flex-Items.

Nur die direkten Kindelemente eines Flex-Containers werden zu Flex-Items. Weiter verschachtelte Elemente gehören nicht automatisch zu diesem Flex-Layout.

<div class="flex-container">
  <div class="item">
    <p>Dieser Absatz ist kein direktes Flex-Item.</p>
  </div>

  <div class="item">2</div>
</div>
    

Ein Flex-Item kann gleichzeitig selbst ein Flex-Container sein. Dazu erhält auch dieses Element display: flex.

.item {
  display: flex;
}
    

Flexbox mit display aktivieren

Flexbox wird mit der Eigenschaft display am Elternelement aktiviert. Dafür stehen die Werte flex und inline-flex zur Verfügung.

Wert Bedeutung
flex Das Element wird zu einem Flex-Container. Gegenüber den umgebenden Elementen verhält es sich wie ein Blockelement.
inline-flex Das Element wird zu einem Flex-Container. Gegenüber den umgebenden Elementen verhält es sich wie ein Inline-Element.

display: flex

.flex-container {
  display: flex;
}
    

Mit display: flex nimmt der Flex-Container standardmäßig die verfügbare Breite seines übergeordneten Elements ein. Seine direkten Kindelemente werden zu Flex-Items.

<div class="flex-container">
  <div class="item">1</div>
  <div class="item">2</div>
  <div class="item">3</div>
</div>
    

display: inline-flex

.inline-flex-container {
  display: inline-flex;
}
    

Mit display: inline-flex passt sich der Flex-Container grundsätzlich seinem Inhalt an und kann gemeinsam mit anderen Inline-Elementen in einer Zeile stehen.

<span class="inline-flex-container">
  <span class="item">1</span>
  <span class="item">2</span>
  <span class="item">3</span>
</span>
    

Der Unterschied zwischen flex und inline-flex betrifft das äußere Verhalten des Flex-Containers. Im Inneren werden die direkten Kindelemente bei beiden Werten nach den Regeln von Flexbox angeordnet.

Hauptachse und Querachse

Ein Flex-Layout arbeitet mit zwei Achsen: der Hauptachse (main axis) und der Querachse (cross axis).

  • Die Hauptachse bestimmt die grundlegende Richtung, in der die Flex-Items angeordnet werden.
  • Die Querachse verläuft immer rechtwinklig zur Hauptachse.

Die Richtung der Hauptachse wird mit der Eigenschaft flex-direction festgelegt. Der Standardwert ist row.

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

Bei flex-direction: row verläuft die Hauptachse in einem deutschsprachigen Dokument normalerweise von links nach rechts. Die Querachse verläuft von oben nach unten.

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

Bei flex-direction: column verläuft die Hauptachse normalerweise von oben nach unten. Die Querachse verläuft dazu rechtwinklig von links nach rechts.

Die Begriffe horizontal und vertikal dürfen nicht grundsätzlich mit Hauptachse und Querachse gleichgesetzt werden. Die Richtung hängt von flex-direction, der Schreibrichtung und dem Schreibmodus des Dokuments ab.

Grundverhalten der Flex-Items

Sobald ein Element zum Flex-Container wird, werden seine direkten Kindelemente nach den Regeln des Flexbox-Layouts angeordnet.

  • Die Flex-Items werden standardmäßig in einer Zeile angeordnet.
  • Ihre Reihenfolge entspricht zunächst der Reihenfolge im HTML.
  • Die Flex-Items werden standardmäßig nicht in eine neue Zeile umgebrochen.
  • Die Flex-Items dürfen standardmäßig schrumpfen, aber nicht wachsen.
  • Die Flex-Items werden auf der Querachse standardmäßig gestreckt, sofern ihre entsprechende Größe auf auto steht.
  • Außenabstände benachbarter Flex-Items fallen nicht zusammen.

Wichtige Standardwerte des Flex-Containers sind:

.flex-container {
  display: flex;

  flex-direction: row;
  flex-wrap: nowrap;
  justify-content: normal;
  align-items: normal;
  align-content: normal;
}
    

Einige Werte verhalten sich abhängig vom verwendeten Layoutmodell. Beispielsweise entspricht normal bei align-items innerhalb eines Flex-Containers normalerweise dem Verhalten von stretch.

Für ein einzelnes Flex-Item gelten standardmäßig diese Werte:

.item {
  flex-grow: 0;
  flex-shrink: 1;
  flex-basis: auto;
  align-self: auto;
  order: 0;
}
    

Eigenschaften des Flex-Containers

Die Eigenschaften des Flex-Containers bestimmen die Richtung, den Umbruch, die Abstände und die Ausrichtung der enthaltenen Flex-Items.

Eigenschaft Aufgabe
flex-direction Legt die Richtung der Hauptachse fest.
flex-wrap Bestimmt, ob die Flex-Items in mehrere Flexzeilen beziehungsweise Flexspalten umgebrochen werden.
flex-flow Kurzschreibweise für flex-direction und flex-wrap.
justify-content Verteilt und richtet die Flex-Items entlang der Hauptachse aus.
align-items Richtet die Flex-Items innerhalb einer Flexzeile auf der Querachse aus.
align-content Verteilt mehrere Flexzeilen entlang der Querachse.
gap Kurzschreibweise für row-gap und column-gap.
row-gap Legt den Abstand zwischen den Flexzeilen fest.
column-gap Legt den Abstand zwischen den Flexspalten fest.

Diese Eigenschaften werden am Flex-Container festgelegt und wirken sich auf seine direkten Kindelemente aus.

Eigenschaften der Flex-Items

Die Eigenschaften der Flex-Items steuern die Größe, Ausrichtung und sichtbare Reihenfolge einzelner Elemente innerhalb des Flex-Containers.

Eigenschaft Aufgabe
flex-grow Bestimmt, in welchem Verhältnis ein Flex-Item verfügbaren freien Platz nutzen darf.
flex-shrink Bestimmt, wie ein Flex-Item bei Platzmangel im Verhältnis zu anderen Flex-Items schrumpft.
flex-basis Legt die anfängliche Hauptgröße eines Flex-Items vor der Verteilung des freien oder fehlenden Platzes fest.
flex Kurzschreibweise für flex-grow, flex-shrink und flex-basis.
align-self Überschreibt für ein einzelnes Flex-Item die mit align-items festgelegte Ausrichtung auf der Querachse.
order Beeinflusst die sichtbare Reihenfolge eines Flex-Items.

Die Eigenschaft order verändert nur die visuelle Darstellung. Die Reihenfolge im HTML und die inhaltliche Lesereihenfolge bleiben unverändert.

Deshalb sollte eine inhaltlich sinnvolle Reihenfolge bereits im HTML festgelegt und nicht erst mit CSS hergestellt werden.

Ein einfaches Flexbox-Beispiel

Das folgende Beispiel zeigt drei Flex-Items, die flexibel auf die verfügbare Breite reagieren.

<div class="flex-example">
  <div class="item">1</div>
  <div class="item">2</div>
  <div class="item">3</div>
</div>
    
.flex-example {
  display: flex;
  flex-wrap: wrap;
  gap: 1rem;
  max-width: 800px;
  margin-block: 1.25rem;
  padding: 1.25rem;
  background-color: #594255;
}

.flex-example .item {
  display: grid;
  place-items: center;
  flex: 1 1 150px;
  min-height: 100px;
  padding: 0.75rem;
  background-color: #fff;
  color: #594255;
  font-family: sans-serif;
  font-size: 2rem;
  font-weight: 700;
}
    

Der Container ordnet seine direkten Kindelemente mit Flexbox an. Mit flex-wrap: wrap dürfen die Items bei Platzmangel in eine neue Zeile wechseln. Die Eigenschaft gap erzeugt den Abstand zwischen den Items.

Die Kurzschreibweise flex: 1 1 150px setzt diese drei Eigenschaften:

.item {
  flex-grow: 1;
  flex-shrink: 1;
  flex-basis: 150px;
}
    
  • flex-grow: 1: Die Items dürfen verfügbaren freien Platz nutzen.
  • flex-shrink: 1: Die Items dürfen bei Platzmangel schrumpfen.
  • flex-basis: 150px: Die Berechnung beginnt mit einer Hauptgröße von 150px.

Flexbox oder Grid?

Flexbox und Grid sind moderne CSS-Layoutmodelle. Welches Modell besser geeignet ist, hängt vom gewünschten Aufbau ab.

Flexbox Grid
Hauptsächlich eindimensionale Anordnung in einer Zeile oder Spalte Zweidimensionale Anordnung in Zeilen und Spalten
Der vorhandene Inhalt beeinflusst häufig die Größe und Anordnung der Elemente. Das definierte Raster bestimmt häufig die Größe und Anordnung der Elemente.
Gut geeignet für Navigationen, Button-Gruppen, Formularbereiche und einzelne Komponentenreihen Gut geeignet für Seitenlayouts, Galerien und strukturierte Raster
Die Anordnung folgt hauptsächlich einer Hauptachse. Elemente können gezielt in Zeilen und Spalten positioniert werden.

Flexbox und Grid schließen einander nicht aus. Beide Layoutmodelle können problemlos gemeinsam verwendet werden.

Ein Seitenbereich kann beispielsweise mit Grid aufgebaut werden, während eine darin enthaltene Navigation oder Button-Gruppe Flexbox verwendet.