Inhalt
Grid-Boxen ähneln in vieler Hinsicht den Flex-Boxen, sind aber speziell darauf ausgerichtet, Elemente in zwei Dimensionen, also einem Raster anzuordnen.
Die folgende Abbildung aus der Mozilla-Dokumentation verdeutlicht einige Grid-Begriffe:
Elemente sind in horizontalen Zeilen (rows) und vertikalen Spalten (columns) angeordnet. Dazwischen befinden als Abstand sogenannte Rinnen (gutter).
Grid definieren
Ausgangspunkt ist wieder ein sehr einfaches Beispiel mit fünf div
Boxen in einem div
Container. Zur besseren Sichtbarkeit sind per css die Hintergründe der Zellen hellgrau eingefärbt und mit Abständen und Rändern versehen:
<style>
.container > div {
padding: 0.5rem 1rem;
background-color: lightgray;
border: 1px solid gray;
}
</style>
<h1>Grid Beispiel 1</h1>
<div class="container">
<div>Zelle 1</div>
<div>Zelle 2</div>
<div>Zelle 3</div>
<div>Zelle 4</div>
<div>Zelle 5</div>
<div>Zelle 6</div>
<div>Zelle 7</div>
</div>
Das sieht dann ohne Grid so aus:
Wie bei den Flex-Boxen ist ein Grid schnell definiert: einfach beim umgebenden Container die „display” Eigenschaft auf „grid” setzen:
.container {
display: grid;
}
Das allein bewirkt in der Ansicht allerdings noch nichts, denn das Standard-Verhalten des Grids ist es, alle Boxen untereinander darzustellen. wenn man nicht noch zusätzliche Vorgaben zu den Dimensionen der Zeilen und/oder Spalten macht. Eine zusätzliche Zeile ändert das:
.container {
display: grid;
grid-template-columns: 200px 200px 200px;
}
Damit werden pro Zeile 3 Spalten mit fester Breite von 200px definiert. Das verändert das Bild so:
Dir Einheit „fr”
Zur Angabe der Spaltenbreite kann man außer absoluten Größenangeben und Prozentwerten auch die Einheit „fr
” (fraction) benutzen. Ein fr
steht für einen Anteil des Platzes auf der Grid-Zeile. Den Spalten können damit (wie mit den Dimensionslosen Zahlen bei flex
) mehr oder weniger Anteile des zur Verfügung stehenden Platzes zugewiesen werden. Beispiel:
grid-template-columns: 1fr 2fr 1fr;
Die mittlere Spalte erhält 2 Breiten.Anteile und wird damit doppelt so breit wie die anderen Spalten.
Abstände
Abstände können zwischen Spalten (column-gap), Zeilen (row-gap) oder beiden zugleich (gap) in absoluten oder Prozentwerten angegeben werden (aber nicht in fr
). Beispiel:
column-gap 1rem;
row-gap 10px;
Das ist äquivalent zu:
gap: 1rem 10px;
und erzeugt folgende Abstände:
Wiederholungen
Sich wiederholende Angaben kann man mit der repeat-Funktion vereinfachen. Die ausführliche Version:
grid-template-columns: 200px 200px 200px;
ist also identisch mit:
grid-template-columns: repeat(3, 200px);
Explizite und implizite Rasterteile
Die Angabe von grid-template-columns
(und grid-template-rows
) definiert ein Raster explizit für die angegebene Anzahl von Zellen.
Zusätzliche, über die definierte Anzahl hinausgehende Elemente führen zur Erzeugung neuer Zeilen bzw. Spalten, dem impliziten Raster. Ihre Größe wird automatisch festgelegt.
Mit grid-auto-rows
und grid-auto-columns
kann man die Eigenschaften dieser zusätzlichen impliziten Elemente steuern. Beispiel:
grid-auto-rows: 75px;
Automatisch erzeugte Zeilen erhalten dadurch eine Höhe von 75px.
Die minmax() Funktion
Mit der minmax()
Funktion kann man die minimale und maximale Größe festlegen, zwischen denen dann die faktische Größe je nach Inhalt schwanken kann. Der auto
Wert stellt dabei die Größe automatisch so ein, dass der gesamte Inhalt sichtbar ist.
Die folgende Definition stellt die Zeilenhöhe so ein, dass sie minimal 50px und maximal so groß ist, wie der Inhalt es erfordert:
grid-auto-rows: minmax(50px, auto);
Automatik
Will man nicht die Spaltenbreite, sondern die Spaltenanzahl variieren, kommt die auto-fit
Funktion in’s Spiel. Sie platziert im Zusammenspiel mit repeat
so viele Elemente auf einer Achse, wie die Breite des Containers es erlaubt. Beispiel:
.container {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
grid-auto-rows: minmax(50px, auto);
}
Platzierung von Elementen
Grid erlaubt es, im Raster Bereiche zu definieren die für Elemente reserviert werden. Damit kann man z.B. Kopf- und Fußzeilen, Seitenleisten und Hauptbereich einer Seite definieren. Der Inhalt wird später darin platziert, indem man die entsprechenden css-Selektoren verwendet.
Zur Adressierung der Bereiche können folgende Spalten- und Zeilen-Eigneschaften verwendet werden:
grid-column-start
Startspaltegrid-column-end
Endspaltegrid-row-start
Startzeilegrid-row-end
Endzeile
Als Argumente erhalten diese Eigenschaften Zeilen- bzw. Spaltennummern. Um Tipparbeit zu sparen, kann man folgende Kurzformen verwenden:
grid-column
Kurzform fürgrid-column-start
undgrid-column-end
grid-row
Kurzform fürgrid-row-start
undgrid-row-end
Sie erhalten als Argument die jeweilige Start- und Endnummer der Zeile bzw. Spalte getrennt durch einen Schrägstrich. Beispiel:
<style>
.container {
display: grid;
grid-template-columns: 1fr 2fr;
gap: 10px;
}
.container > div {
padding: 0.5rem 1rem;
background-color: lightgray;
border: 1px solid gray;
}
.oben {
grid-column: 1 / 3;
grid-row: 1;
}
.mitte-links {
grid-column: 1;
grid-row: 2;
}
.mitte-rechts {
grid-column: 2;
grid-row: 2;
}
.unten {
grid-column: 1 / 3;
grid-row: 3;
}
</style>
<h1>Grid Beispiel 2</h1>
<div class="container">
<div class="oben">Oben - Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam</div>
<div class="mitte-links">Mitte links - Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.</div>
<div class="mitte-rechts">Mitte rechts - Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.</div>
<div class="unten">Unten - Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam</div>
</div>
Grid-Template-Areas
Anstelle der Zeilen- und Spaltennummern können auch benannte Rasterbereiche benutzt werden. Dafür werden in der Eigenschaft „grid-template-areas” die Bereiche des Layouts mit ihren frei wählbaren Namen aufgeführt. Der style-Bereich des Beispiels oben würde dann so aussehen:
<style>
.container > div {
padding: 0.5rem 1rem;
background-color: lightgray;
border: 1px solid gray;
}
.container {
display: grid;
grid-template-areas:
"oben oben"
"mitte-links mitte-rechts"
"unten unten";
grid-template-columns: 1fr 2fr;
gap: 10px;
}
.oben {
grid-area: oben;
}
.mitte-links {
grid-area: mitte-links;
}
.mitte-rechts {
grid-area: mitte-rechts;
}
.unten {
grid-area: unten;
}
</style>
Die Darstellung ist damit identisch zur obigen. Folgende Regeln gelten:
- Alle Zellen des Rasters müssen gefüllt werden
- Spannen sich Bereiche über mehrere Zeilen oder Spalten, wird der Name in jeder betroffenen Zeile bzw. Spalte wiederholt
- Wenn eine Zelle leer bleiben soll, wird ein Punkt (.) als Name verwendet
- Alle Bereiche müssen rechteckig sein (z.B. keine L-Form möglich)
- Bereiche können nicht an nicht zusammenhängenden Orten wiederholt werden
Verschachtelte Grids
Wie bei Flex-Boxen können auch Grids beliebig verschachtelt werden. Dazu wird einem Grid-Element einfach wieder die display
-Eigenschaft „grid
” gegeben. Innerhalb dieses Grids gelten nur die Definitionen dieses Elements; es ist unabhängig von über- oder untergeordneten Grids.
Quellen: