Zum Inhalt springen

CSS Grid - Areas

Statt Kinder nur der Reihe nach einzusortieren, könnt ihr den Feldern des Grids Namen geben - und Elemente gezielt einem benannten Bereich zuweisen:

.page {
display: grid;
grid-template-columns: 200px 1fr;
grid-template-rows: 80px auto 60px;
grid-template-areas:
"sidebar header"
"sidebar main"
"sidebar footer";
}
  • Jede Zeile in Anführungszeichen steht für eine Zeile des Grids
  • Innerhalb einer Zeile ist jedes Wort ein Feld, getrennt durch Leerzeichen
  • Ein Punkt (.) steht für ein Feld, das frei bleibt

Die Namen aus grid-template-areas weist ihr den einzelnen Elementen über grid-area zu - rein in CSS, ganz ohne Änderungen im HTML:

header { grid-area: header; }
nav { grid-area: sidebar; }
main { grid-area: main; }
footer { grid-area: footer; }

Vollständiges Beispiel: ein klassisches Seiten-Layout mit Sidebar

<div class="page">
<header>Kopfzeile</header>
<nav>Navigation</nav>
<main>Hauptinhalt</main>
<footer>Fußzeile</footer>
</div>
.page {
display: grid;
grid-template-columns: 200px 1fr;
grid-template-rows: 80px auto 60px;
grid-template-areas:
"header header"
"sidebar main"
"footer footer";
min-height: 100vh;
gap: 16px;
}
header { grid-area: header; }
nav { grid-area: sidebar; }
main { grid-area: main; }
footer { grid-area: footer; }

Eine Area kann mehrere Felder des Grids überspannen - solange am Ende ein Rechteck entsteht:

.page {
grid-template-areas:
"headline headline subhead"
"portrait content content"
"facts content source";
}

⚠️ Eine Area muss ein sauberes Rechteck bilden. content in diesem Beispiel spannt zwei Zeilen und zwei Spalten - aber ein L-förmiger oder Tetris-artiger Bereich ist nicht erlaubt.

Statt benannter Areas könnt ihr Elemente auch direkt über Zeilen-/Spaltennummern positionieren - praktisch, wenn ihr keine Namen vergeben wollt:

.hero {
grid-column: 1 / 3; /* von Linie 1 bis Linie 3 = über 2 Spalten */
grid-row: 1 / 2;
}

Mit normalem Grid könnt ihr nur die direkten Kinder eines Grid-Containers positionieren. Mit subgrid gibt ein verschachteltes Grid sein Raster an seine eigenen Kinder weiter:

.card {
display: grid;
grid-template-columns: subgrid; /* übernimmt die Spalten des Eltern-Grids */
grid-column: span 3;
}