CSS Grid
CSS Grid ist ein Layout-Modell, das auf einem zweidimensionalen Raster basiert. Im Gegensatz zu Flexbox (eindimensional) kann Grid gleichzeitig Zeilen und Spalten kontrollieren. Es eignet sich besonders für Seitenstruktur, Raster und komplexere Layouts.
CSS Grid Anwendungen
- Gesamtes Seitenlayout (Header, Sidebar, Content, Footer)
- Magazine-Layouts mit überlappenden Bereichen
- Bildergalerien mit unterschiedlichen Größen
- Dashboard-Layouts
- Responsive Grids ohne Media Queries
- Komplexe Layouts mit präziser Zeilen- und Spaltenkontrolle
Grid Grundprinzip
Grid ContainerDas Eltern-Element mitdisplay: gridGrid ItemsDie direkten Kinder des ContainersGrid LinesDie Linien, die das Grid teilenGrid TracksDie Zeilen und SpaltenGrid CellsDie einzelnen ZellenGrid AreasBenannte Bereiche aus mehreren Zellen
Grid-Anatomie
Grid Lines (1, 2, 3, 4...)
↓ ↓ ↓ ↓
┌───┬───┬───┐ ← Grid Line 1
│ 1 │ 2 │ 3 │ ← Grid Track (Row 1)
├───┼───┼───┤ ← Grid Line 2
│ 4 │ 5 │ 6 │ ← Grid Track (Row 2)
└───┴───┴───┘ ← Grid Line 3
↑ ↑ ↑
Grid Tracks (Columns)
Ein Track ist eine Zeile oder Spalte im Grid.
Ein Item ist das Element, das darin platziert wird.
Grid aktivieren
Sobald ein Eltern-Element display: grid bekommt, wird es zum Grid-Container. Alle direkten Kindelemente werden Grid-Items.
.container {
display: grid;
grid-template-columns: 1fr 1fr 1fr;
gap: 10px;
}
Standardverhalten von display: grid
- Alle Kinder werden zu Grid Items
- Items ordnen sich nach definierten Spalten an
- Neue Zeilen entstehen automatisch bei Bedarf
- Items können präzise platziert werden
Container-Eigenschaften
Diese Eigenschaften werden auf den Grid Container (Eltern-Element) angewendet.
grid-template-columnsDefiniert Anzahl und Breite der Spaltengrid-template-rowsDefiniert Anzahl und Höhe der Zeilenrepeat()Wiederholt Track-Definitionenminmax()Definiert minimale und maximale Trackgrössenauto-fit/auto-fillErzeugt responsive SpaltengapDefiniert Abstände zwischen Zeilen und Spaltengrid-template-areasErstellt benannte Layoutbereichegrid-auto-rows/grid-auto-columnsDefiniert automatisch erzeugte Tracksgrid-auto-flowSteuert die automatische Platzierung der Grid-Items
1. grid-template-columns
grid-template-columns definiert die Anzahl und Breite der Spalten.
Feste Pixelwerte
grid-template-columns: 200px 200px 200px;
Flexible Einheiten (fr)
fr (fraction) verteilt verfügbaren Raum proportional:
grid-template-columns: 1fr 2fr 1fr;
/* Mittlere Spalte ist doppelt so breit */
Gemischte Werte
grid-template-columns: 200px 1fr 2fr;
/* Erste Spalte fest, Rest flexibel */
Weitere Einheiten
/* Prozent */
grid-template-columns: 25% 50% 25%;
/* Auto (passt sich an Inhalt an) */
grid-template-columns: auto 1fr auto;
/* min-content / max-content */
grid-template-columns: min-content 1fr max-content;
/* Viewport-Einheiten */
grid-template-columns: 20vw 1fr 300px;
2. grid-template-rows
Definiert die Anzahl und Höhe der Zeilen – funktioniert wie grid-template-columns.
Zeilen müssen im Grid nicht zwingend manuell angelegt werden. Reichen die definierten Spalten nicht aus, erstellt das Grid-System automatisch neue Zeilen (implizites Grid).
grid-template-rows: 100px 150px 100px;
3. repeat()
Wiederholungen verkürzen den Code. Mit repeat() können mehrere gleich definierte Tracks (Zeilen oder Spalten) automatisch erstellt werden, ohne jede Spur einzeln aufzuschreiben.
/* Statt: */
grid-template-columns: 1fr 1fr 1fr 1fr;
/* Besser: */
grid-template-columns: repeat(4, 1fr);
/* Mit verschiedenen Werten: */
grid-template-columns: repeat(3, 100px 200px);
/* Ergibt: 100px 200px 100px 200px 100px 200px */
4. minmax()
Legt eine minimale und eine maximale Größe für eine Grid-Spur (Track) fest.
grid-template-columns: minmax(200px, 1fr) 2fr;
/* Spalte 1: min 200px, max 1fr */
grid-template-rows: minmax(100px, auto);
/* Zeile: min 100px, wächst mit Inhalt */
5. auto-fit & auto-fill
Beide Werte erzeugen automatisch so viele Spalten, wie in den verfügbaren Platz passen.
auto-fitentfernt leere Spalten und verteilt den Platz.auto-fillbehält leere Spalten bei.
grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
/* Erstellt so viele Spalten wie reinpassen,
jede min. 150px, max. 1fr */
auto-fit vs auto-fill
/* Meist will man auto-fit: */
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
6. gap (grid-gap)
gap erzeugt Abstand zwischen Spalten und Zeilen.
Das funktioniert in Grid und Flexbox.
gap: 20px; /* Alle Abstände */
/* Oder getrennt: */
row-gap: 20px;
column-gap: 30px;
/* Kurzform mit zwei Werten: */
gap: 20px 30px; /* row column */
7. grid-template-areas
grid-template-areas macht komplexe Layouts visuell nachvollziehbar, ersetzt jedoch keine semantische HTML-Struktur.
.card {
display: grid;
grid-template-columns: 2fr 1fr;
grid-template-areas:
"header header"
"visual title"
"visual text"
"footer footer";
gap: 10px;
}
.header { grid-area: header; }
.visual { grid-area: visual; }
.title { grid-area: title; }
.text { grid-area: text; }
.footer { grid-area: footer; }
Responsive Grid Template Areas
/* Mobile */
.layout {
grid-template-areas:
"header"
"main"
"sidebar"
"footer";
}
/* Desktop */
@media (min-width: 768px) {
.layout {
grid-template-areas:
"header header"
"sidebar main"
"footer footer";
}
}
Leere Zellen mit Punkt (.)
grid-template-areas:
"header header header"
"sidebar content ."
"footer footer footer";
/* Rechts oben bleibt leer */
Grid-Teste deine Grid Template Areas live.
8. grid-auto-rows & grid-auto-columns
grid-auto-rows und grid-auto-columns definieren die Grösse von Zeilen und Spalten, die Grid automatisch erstellt.
Während grid-template-rows und grid-template-columns Zeilen und Spalten des expliziten Grids definieren, legen grid-auto-rows und grid-auto-columns die Grösse der automatisch erzeugten Zeilen und Spalten fest.
.container {
grid-template-columns: repeat(3, 1fr);
grid-auto-rows: 80px; /* Neue Zeilen werden 80px hoch */
}
9. grid-auto-flow
Kontrolliert, wie Items automatisch platziert werden:
rowZeilenweise füllen (Standard)columnSpaltenweise füllendenseLücken auffüllen (dichter packen)
.container {
display: grid;
grid-template-columns: repeat(4, 1fr);
grid-auto-flow: dense;
gap: 10px;
}
.wide {
grid-column: span 3;
}
.small {
grid-column: span 1;
}
dense erlaubt dem Browser, kleinere Items in frühere Lücken zu setzen.
Item-Eigenschaften
Diese Eigenschaften werden auf Grid Items angewendet.
grid-columnpositioniert oder überspannt Spalten.grid-rowpositioniert oder überspannt Zeilen.grid-areaweist Grid-Items benannten Bereichen zu.justify-self&align-selfrichten einzelne Grid-Items innerhalb ihrer Grid-Zelle aus.
1. grid-column & grid-row
grid-column und grid-row positionieren Grid-Items über bestimmte Grid Lines.
.demo-lines {
display: grid;
grid-template-columns: repeat(4, 1fr);
grid-template-rows: repeat(3, 100px);
gap: 10px;
}
.item-a {
grid-column: 1 / 3; /* Von Line 1 bis Line 3 */
grid-row: 1 / 3; /* Von Line 1 bis Line 3 */
}
.item-b {
grid-column: 3 / 5;
grid-row: 1 / 2;
}
Negative Werte (von rechts/unten)
Negative Grid Lines werden vom Ende des Grids gezählt. -1 bezeichnet die letzte Grid Line.
grid-column: 1 / -1; /* Volle Breite */
grid-row: 2 / -1; /* Bis zum Ende */
2. span (Überspannen)
Mit span können Grid-Items mehrere Spalten oder Zeilen überspannen.
.item {
grid-column: span 2; /* Überspannt 2 Spalten */
}
.full-width {
grid-column: span 3; /* Überspannt 3 Spalten */
}
/* Oder kombiniert: */
grid-column: 2 / span 3; /* Start bei 2, überspannt 3 */
3. grid-area
grid-area ist die Kurzform für die Platzierung eines Grid-Items oder verweist auf einen benannten Bereich.
grid-area kann auf zwei Arten verwendet werden.
/* Variante 1: Kurzform */
grid-area: 1 / 2 / 3 / 4;
/* row-start / column-start / row-end / column-end */
/* Variante 2: Benannter Bereich */
grid-area: header;
/* Nutzt grid-template-areas vom Container */
4. justify-self & align-self
Mit justify-self und align-self wird ein einzelnes Grid-Item innerhalb seiner Grid-Zelle ausgerichtet.
Eigenschaften
align-selfVertikale Ausrichtung eines einzelnen Grid-Itemsjustify-selfHorizontale Ausrichtung eines einzelnen Grid-Itemsplace-selfKurzform füralign-selfundjustify-self
Werte
startAm Anfang der Grid-Zelle ausrichtenendAm Ende der Grid-Zelle ausrichtencenterMittig in der Grid-Zelle ausrichtenstretchFüllt die gesamte Grid-Zelle aus (Standard)
.item {
align-self: end; /* vertikal */
justify-self: center; /* horizontal */
}
/* Kurzform */
place-self: center;
place-self: end center; /* align-self justify-self */
Container-Alignment
Richtet alle Grid-Items oder das gesamte Grid aus.
justify-itemsRichtet alle Grid-Items innerhalb ihrer Grid-Zellen horizontal aus.align-itemsRichtet alle Grid-Items innerhalb ihrer Grid-Zellen vertikal aus.justify-contentRichtet das gesamte Grid horizontal im Container aus.align-contentRichtet das gesamte Grid vertikal im Container aus.
1. justify-items & align-items
Richtet alle Grid-Items innerhalb ihrer Grid-Zellen aus.
Eigenschaften
align-itemsVertikale Ausrichtung aller Grid-Itemsjustify-itemsHorizontale Ausrichtung aller Grid-Itemsplace-itemsKurzform füralign-itemsundjustify-items
Werte
startAm Anfang der Grid-Zelle ausrichtenendAm Ende der Grid-Zelle ausrichtencenterMittig in der Grid-Zelle ausrichtenstretchFüllt die gesamte Grid-Zelle aus (Standard)
.container {
align-items: center; /* vertikal */
justify-items: end; /* horizontal */
}
/* Kurzform */
place-items: center end; /* align-items justify-items */
Probier alle Werte live im Alignment Playground aus.
2. justify-content & align-content
Richtet das gesamte Grid innerhalb des Containers aus.
Eigenschaften
align-contentVertikale Ausrichtung des gesamten Gridsjustify-contentHorizontale Ausrichtung des gesamten Gridsplace-contentKurzform füralign-contentundjustify-content
Werte
startAm Anfang des Containers ausrichtenendAm Ende des Containers ausrichtencenterMittig im Container ausrichtenstretchVerteilt das Grid über den verfügbaren Platz (Standard)space-betweenVerteilt den freien Platz zwischen den Tracksspace-aroundVerteilt den freien Platz um die Tracksspace-evenlyVerteilt den freien Platz gleichmässig
.container {
align-content: center; /* vertikal */
justify-content: end; /* horizontal */
}
/* Kurzform */
place-content: center end; /* align-content justify-content */
Probier alle Werte live im Alignment Playground aus.
Praktische Beispiele
1. Responsive Bildergalerie
Eine responsive Bildergalerie passt die Anzahl der Spalten automatisch an den verfügbaren Platz an. Bilder bleiben übersichtlich angeordnet, ohne dass Media Queries notwendig sind.
Auto-responsive Grid
Ein responsives Grid passt die Anzahl der Spalten automatisch an den verfügbaren Platz an. Die Kacheln ordnen sich ohne Media Queries neu an.
See the Pen Kachel-Version by Intensivstation (@intensivstation) on CodePen.
Responsive Bildergalerie
Das gleiche Prinzip lässt sich für Bildergalerien nutzen. Die Bilder verteilen sich automatisch auf die verfügbare Breite und bleiben gleichmässig angeordnet.
See the Pen Bildergalerie by Intensivstation (@intensivstation) on CodePen.
2. Magazine Layout
Ein Magazin-Layout nutzt unterschiedlich grosse Grid-Bereiche für eine abwechslungsreiche Gestaltung.
See the Pen Magazine Layout by Intensivstation (@intensivstation) on CodePen.
3. Dashboard Layout
Ein Dashboard kombiniert mehrere Bereiche unterschiedlicher Grösse und eignet sich für Admin-Oberflächen, Analyse-Tools oder Kontrollzentren.
See the Pen Dashboard Layout mit Grid by Intensivstation (@intensivstation) on CodePen.
4. Seitenlayout mit Grid
Grid eignet sich ideal für klassische Seitenlayouts mit Header, Navigation, Hauptinhalt, Sidebar und Footer.See the Pen Seitenlayout mit Grid by Intensivstation (@intensivstation) on CodePen.
5. Grid und Flexbox kombinieren
Ein Nested Layout kombiniert mehrere Layout-Modelle. Grid eignet sich für das Seitenlayout, Flexbox für die Anordnung innerhalb einzelner Bereiche. Beide Layout-Modelle werden häufig gemeinsam eingesetzt.
See the Pen Grid und Flexbox kombinieren by Intensivstation (@intensivstation) on CodePen.
Responsive Grid Strategien
Grid kann responsiv werden, ohne dass jedes Layout mit Media Queries umgebaut werden muss.
1. Auto-responsive ohne Media Queries
grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
/* Passt sich automatisch an Bildschirmbreite an */
2. Mit Media Queries
/* Mobile: 1 Spalte */
.grid {
display: grid;
grid-template-columns: 1fr;
gap: 15px;
}
/* Tablet: 2 Spalten */
@media (min-width: 768px) {
.grid {
grid-template-columns: repeat(2, 1fr);
}
}
/* Desktop: 4 Spalten */
@media (min-width: 1200px) {
.grid {
grid-template-columns: repeat(4, 1fr);
}
}
Fortgeschrittene Techniken
1. Benannte Grid Lines
Benannte Grid Lines machen komplexe Grid-Layouts besser lesbar. Statt Grid Lines über Zahlen anzusprechen, können aussagekräftige Namen verwendet werden.
.container {
display: grid;
grid-template-columns:
[sidebar-start] 250px
[sidebar-end content-start] 1fr
[content-end];
gap: 20px;
}
.sidebar {
grid-column: sidebar-start / sidebar-end;
}
.content {
grid-column: content-start / content-end;
}
2. Subgrid
subgrid übernimmt die Zeilen oder Spalten eines übergeordneten Grids. Dadurch bleiben verschachtelte Layouts exakt ausgerichtet.
.parent {
display: grid;
grid-template-columns: repeat(3, 1fr);
}
.child {
display: grid;
grid-template-columns: subgrid;
grid-column: span 3;
}
3. Grid mit clamp()
clamp() ermöglicht flexible Grössen innerhalb eines Grid-Layouts. Dadurch können sich Spalten und Abstände responsiv an verschiedene Bildschirmgrössen anpassen.
.container {
display: grid;
grid-template-columns: repeat(auto-fit,
minmax(clamp(200px, 30vw, 400px), 1fr)
);
gap: clamp(1rem, 2vw, 2rem);
}
4. Aspect Ratio
aspect-ratio legt ein festes Seitenverhältnis für Elemente fest. In Grid-Layouts eignet sich die Eigenschaft besonders für Bildergalerien, Karten und Kacheln mit einheitlichen Proportionen.
.grid-item {
aspect-ratio: 16 / 9;
}
.gallery img {
width: 100%;
aspect-ratio: 16 / 9;
object-fit: cover;
}
Grid vs Flexbox
Beide ergänzen sich perfekt!
- GridZweidimensional – Zeilen UND Spalten gleichzeitig
- FlexboxEindimensional – Zeile ODER Spalte
Verschachtelung: Grid + Flex zusammen
Ja, das geht! Und ist sogar sehr üblich:
/* Grid für Gesamtlayout */
.page {
display: grid;
grid-template-areas:
"header header"
"sidebar content";
}
/* Flex innerhalb einer Grid-Zelle */
.header {
display: flex;
justify-content: space-between;
}
/* Oder umgekehrt: Flex Container mit Grid Items */
.flex-container {
display: flex;
}
.flex-item {
display: grid;
grid-template-columns: 1fr 1fr;
}
Regel: Grid für das große Ganze, Flex für Komponenten im Detail.
Grid Cheat Sheet
Container
display: gridAktiviert CSS Grid.grid-template-columnsDefiniert Anzahl und Breite der Spalten.grid-template-rowsDefiniert Anzahl und Höhe der Zeilen.grid-template-areasErstellt benannte Layoutbereiche.repeat()Wiederholt Track-Definitionen.minmax()Definiert minimale und maximale Trackgrössen.auto-fit/auto-fillErzeugt responsive Spalten.gapDefiniert Abstände zwischen Zeilen und Spalten.grid-auto-rows/grid-auto-columnsDefiniert automatisch erzeugte Tracks.grid-auto-flowSteuert die automatische Platzierung der Grid-Items.
Item-Eigenschaften
grid-columnPositioniert oder überspannt Spalten.grid-rowPositioniert oder überspannt Zeilen.spanÜberspannt mehrere Zeilen oder Spalten.grid-areaPositioniert ein Item oder weist es einem benannten Bereich zu.
Alignment
justify-itemsHorizontale Ausrichtung aller Grid-Items.align-itemsVertikale Ausrichtung aller Grid-Items.place-itemsKurzform füralign-itemsundjustify-items.justify-contentHorizontale Ausrichtung des gesamten Grids.align-contentVertikale Ausrichtung des gesamten Grids.place-contentKurzform füralign-contentundjustify-content.justify-selfHorizontale Ausrichtung eines einzelnen Grid-Items.align-selfVertikale Ausrichtung eines einzelnen Grid-Items.place-selfKurzform füralign-selfundjustify-self.
Nützliche Funktionen
clamp()Ermöglicht flexible Grössen innerhalb eines Grid-Layouts.aspect-ratioDefiniert ein festes Seitenverhältnis für Elemente.subgridÜbernimmt Zeilen oder Spalten eines übergeordneten Grids.Benannte Grid LinesErleichtern die Platzierung komplexer Layouts.
Kurz gesagt
display: gridaktiviert CSS Grid.grid-template-columnsundgrid-template-rowsdefinieren das Raster.frverteilt den verfügbaren Platz proportional.repeat()verkürzt wiederkehrende Track-Definitionen.minmax()definiert minimale und maximale Trackgrössen.auto-fitundminmax()ermöglichen responsive Layouts ohne Media Queries.gapdefiniert Abstände zwischen Zeilen und Spalten.grid-template-areaserstellt benannte Layoutbereiche.grid-column,grid-rowundspanpositionieren Grid-Items.justify-*,align-*undplace-*richten Grid-Container und Grid-Items aus.- Grid eignet sich für zweidimensionale Layouts, Flexbox für eindimensionale Komponenten.
Schau dir auch die Flexbox Lektion an.
Test dein Wissen im CSS GRID GARDEN