Zum Inhalt springen

Flexbox oder Grid?

  • Flexbox: Ihr habt eine Reihe von Elementen, die in einer Richtung angeordnet werden - Navigation, Button-Reihe, eine Zeile mit Icon + Text
  • Grid: Ihr wollt Zeilen und Spalten gleichzeitig kontrollieren - ein Seiten-Layout, eine Bildergalerie, ein Formular mit ausgerichteten Labels

Eine andere Unterscheidung: Will ich die größen der Spalten und Zeilen im Wrapper vorgeben, oder sollte das der Content selbst machen?

Abschnitt betitelt „Eine andere Unterscheidung: Will ich die größen der Spalten und Zeilen im Wrapper vorgeben, oder sollte das der Content selbst machen?“
  • Flexbox: Die jeweiligen Kinder innerhalb der Flexbox geben ihre eigenen Größen vor
  • Grid: Du gibst im Wrapper vor, wie groß der Platz ist, den die jeweiligen Kinder einnehmen dürfen
AufgabeBessere Wahl
Navigationsleiste (Logo links, Links rechts)Flexbox
Reihe von Buttons mit AbstandFlexbox
Card zentrieren (horizontal + vertikal)Flexbox
Ganzes Seiten-Layout (Header/Sidebar/Main/Footer)Grid
Bildergalerie mit gleich großen KachelnGrid
Formular mit ausgerichteten Labels und FeldernGrid

Wollt ihr in einer Flexbox z.B. drei gleich breite Kinder mit width: 33.33% erzeugen und zusätzlich gap für den Abstand dazwischen, kommt es zum Überlauf:

.row {
display: flex;
gap: 16px;
}
.row > * {
width: 33.33%; /* Achtung! */
}

Mit Grid gebt ihr die Breiten über grid-template-columns vor - gap wird dabei automatisch korrekt eingerechnet, nie addiert:

.row {
display: grid;
grid-template-columns: 1fr 1fr 1fr;
gap: 16px;
}

In der Praxis kombiniert ihr beide fast immer: Grid für das große Seiten-Layout, Flexbox für die kleineren Bausteine darin.

/* Grid für das große Ganze */
.page {
display: grid;
grid-template-columns: 250px 1fr;
grid-template-areas: "sidebar main";
}
/* Flexbox für eine Komponente innerhalb einer Grid-Zelle */
.card-actions {
display: flex;
gap: 8px;
justify-content: flex-end;
}