Erstellt man eine Website, fließt ein großer Teil der Arbeit in die Plat­zie­rung der einzelnen Elemente. Das Layout soll in­ter­es­sant aussehen, gleich­zei­tig aber auch intuitiv ver­ständ­lich und über­sicht­lich sein. Cascading Style Sheets (CSS) liefern das Werkzeug, um Websites an­spre­chend zu gestalten. Während man mit HTML die Inhalte ru­di­men­tär aus­zeich­net, verwenden Web­de­si­gner CSS für komplexe Ge­stal­tun­gen. Die Web­tech­nik wird beständig wei­ter­ent­wi­ckelt. Mit CSS3 sind neue Techniken hin­zu­ge­kom­men, die die Aus­zeich­nungs­spra­che auch für mobiles Internet und re­spon­si­ves Design nutzbar machen.

Wofür braucht man das CSS-Grid-Layout?

Das mobile Internet stellt Web­de­si­gner vor eine große Her­aus­for­de­rung: Denn diese können aufgrund der Vielzahl un­ter­schied­lich ge­stal­te­ter Mo­bil­ge­rä­te nicht wissen, welches Format das Display hat, auf dem die Website angezeigt werden soll. Aus diesem Grund ist es wichtig, dass die einzelnen Objekte (Textboxen, Grafiken, in­ter­ak­ti­ve Elemente) selbst­stän­dig und gleich­zei­tig über­sicht­lich verteilt werden – und zwar unter be­son­de­rer Be­rück­sich­ti­gung der je­wei­li­gen Platz­ver­hält­nis­se, die durch das Display vor­ge­ge­ben sind.

Früher musste man sich mit den so­ge­nann­ten Floats behelfen. Doch die Arbeit mit dieser Technik war komplex und anfällig für Fehler. In­zwi­schen gibt es gleich zwei Methoden, ein dy­na­mi­sches Layout zu rea­li­sie­ren: Neben CSS Grid kann man bei­spiels­wei­se auch sehr gut Flexbox zur Umsetzung eines smarten Designs nutzen. Doch die beiden Techniken un­ter­schei­den sich in einigen Aspekten.

Flexbox ist ein­di­men­sio­nal. Die Elemente werden im Prinzip nur auf einer Achse ver­scho­ben. Ein CSS Grid Layout bietet dem Web­de­si­gner zwei Di­men­sio­nen zur Plat­zie­rung der Objekte. Statt nur auf einer Achse kann man mit CSS Grid ein Raster mit Zeilen und Spalten verwenden.

CSS Grid: Tutorial mit Bei­spie­len

Wer bereits Er­fah­run­gen mit CSS gemacht hat, wird mit Grid keine Probleme haben. Im folgenden Tutorial sind die wich­tigs­ten Funk­tio­nen für den Einstieg be­schrie­ben.

Hinweis

Das Tutorial arbeitet mit einer einzigen Datei: Der CSS-Code wird direkt in den Kopf der HTML-Datei ge­schrie­ben. Es ist aber selbst­ver­ständ­lich auch möglich, ein separates Style­sheet zu erstellen und dieses nur in der HTML-Datei auf­zu­ru­fen.

Erstellen von Con­tai­nern und Items

CSS Grid kennt zwei ver­schie­de­ne Einheiten: Container und Items. Der Container ist die oberste Ebene. Dort legt man Ei­gen­schaf­ten fest, die dann an alle Items wei­ter­ge­ge­ben werden. Ein Item liegt also (hier­ar­chisch gesehen) innerhalb eines Con­tai­ners. Daneben braucht man aber nach wie vor auch HTML für das Grid Layout. Im HTML-Teil des Quell­tex­tes werden die einzelnen Objekte (Text, Grafik, …) erzeugt, die dann innerhalb von CSS Grid auf­ge­grif­fen und in die richtige Position gebracht werden.

<!DOCTYPE html>
<html>
<head>
<style>
.grid-container {
    display: grid;
}
</style>
</head>
<body>
<div class="grid-container">
    <div class="grid-item1">1</div>
    <div class="grid-item2">2</div>
    <div class="grid-item3">3</div>
    <div class="grid-item4">4</div>
    <div class="grid-item5">5</div>
    <div class="grid-item6">6</div>
</div>
</body>
</html>

Damit haben wir nun sechs Elemente erzeugt, diese jeweils als „grid-item“ definiert und alle in den „grid-container“ gepackt. Damit CSS Grid überhaupt aktiv wird, muss man im Container mit „display: grid“ die Funktion starten. Bisher erzeugt der Code al­ler­dings nur 6 Zahlen, die un­ter­ein­an­der er­schei­nen. Wurden sie erstmal erzeugt, kann man diese Items dann aber relativ frei auf dem Bild­schirm plat­zie­ren.

Grid, Columns und Rows

Bei CSS Grid arbeitet man mit Zeilen und Spalten und erzeugt auf diese Weise ein Raster. Innerhalb des Rasters lassen sich die einzelnen Objekte anordnen. Dieses Grid kann bzw. muss frei gewählt werden: Der Nutzer selbst ent­schei­det, welchen Umfang die Zeilen und Spalten haben. Dafür fügt man dem Container zwei An­wei­sun­gen zu.

.grid-container {
	display: grid;
	grid-template-rows: 100px 100px;
	grid-template-columns: 100px 100px 100px;
}

Mit diesen beiden Befehlen haben wir ein 2-x-3-Raster auf­ge­macht. Wie man erkennen kann, lässt sich die Größe jeder Zeile und jeder Spalte einzeln ein­stel­len. Die Angaben werden einfach nach­ein­an­der (mit einem Leer­zei­chen von­ein­an­der getrennt) ein­ge­tra­gen. Neben der genauen Pi­xel­an­ga­be kann man auch einen pro­zen­tua­len Anteil oder andere in CSS übliche Grö­ßen­ord­nun­gen verwenden. Mit den Angaben „max-content“ und „min-content“ kann man das Raster auch in Relation zum Inhalt erstellen lassen.

Mit der Anweisung „grid-gap“ erzeugt man zudem einen Zwi­schen­raum.

.grid-container {
	display: grid;
	grid-template-rows: 100px 100px;
	grid-template-columns: 100px 100px 100px;
	grid-gap: 5px;
}

Damit sind die Zellen gleich­mä­ßig von­ein­an­der getrennt. Wer keine ein­heit­li­chen Abstände möchte, der kann mit „grid-column-gap“ und „grid-row-gap“ die Zwi­schen­räu­me auch in­di­vi­du­el­ler gestalten.

Eine Be­son­der­heit stellen Fractions dar. Mit dieser Maß­ein­heit lässt sich der Bild­schirm – ähnlich wie mit Pro­zent­an­ga­ben – in­di­vi­du­ell einteilen. Sagen wir, wir möchten den Bereich in 7 ho­ri­zon­ta­le Einheiten aufteilen. Eine einzelne Spalte soll aber doppelt so groß wie die anderen sein. Das lässt sich über folgenden Code umsetzen:

.grid-container {
	display: grid;
	grid-template-rows: 100px 100px;
	grid-template-columns: 1fr 2fr 1fr 1fr 1fr;
	grid-gap: 5px;
}

Der Vorteil, wenn man statt mit sta­ti­schen Angaben mit relativen Größen arbeitet, ist folgender: Das Raster kann sich au­to­ma­tisch an die Bild­schirm­grö­ße anpassen. Auch wenn die einzelnen Spalten kleiner werden müssen, bleibt (in unserem Beispiel) die zweite Spalte immer doppelt so groß wie die anderen. Möchte man eine Zeile fixieren, also nicht an die Bild­schirm­grö­ße anpassen, gibt man dieser Reihe einfach einen sta­ti­schen Wert.

Plat­zie­rung von Elementen

Nachdem man das Raster definiert hat, kann man die ver­schie­de­nen Objekte plat­zie­ren. Dafür muss man Items anlegen und darüber hinaus Start- und Endwerte angeben. Doch muss nicht jedes Element zwingend nur eine Zelle innerhalb des Git­ter­net­zes einnehmen.

<!DOCTYPE html>
<html>
<head>
<style>
.grid-container {
    display: grid;
    grid-template-rows: 100px 100px 100px 100px;
    grid-template-columns: 100px 100px 100px 100px;
    grid-gap: 5px;
}
.grid-item1 {
    background: blue;
    text-align: center;
    border: black 5px solid;
    grid-column-start: 1; 
    grid-column-end: 5; 
    grid-row-start: 1; 
    grid-row-end: 3;
}
.grid-item2 {
    background: grey;
    text-align: center;
    border: black 5px solid;
}
</style>
</head>
<body>
<div class="grid-container">
    <div class="grid-item1">1</div>
    <div class="grid-item2">2</div>
    <div class="grid-item2">3</div>
    <div class="grid-item2">4</div>
    <div class="grid-item2">5</div>
    <div class="grid-item2">6</div>
</div>
</body>
</html>

Wir haben nun zwei Item-Typen ein­ge­führt. Während die letzten fünf Elemente au­to­ma­tisch nur die Spann­wei­te einer Zelle haben, reicht das erste Objekt über vier Spalten und zwei Zeilen. (Zur besseren An­schau­lich­keit enthalten unsere Beispiele auch weitere visuelle Ge­stal­tung. Farb­ge­bung, Rahmen und Text­zen­trie­rung legt man al­ler­dings ei­gent­lich nicht über CSS Grid fest.)

Die Werte für Anfang und Ende der Objekte beziehen sich nur indirekt auf Reihen und Spalten. Tat­säch­lich referiert man auf die jeweilige Git­ter­li­nie. Im Beispiel endet die vierte Spalte mit der fünften Linie. Man hat aber ver­schie­de­ne Mög­lich­kei­ten, die Spann­wei­ten anzugeben.

  • Num­me­rie­rung: Man zählt die Linien von links nach rechts und von oben nach unten.
  • Namen: Innerhalb von „grid-template-rows“ und „grid-template-columns“ kann man den Linien Namen geben (in eckigen Klammern) und dann auf diese Be­zeich­nun­gen re­fe­rie­ren.
  • Spanne: Mit „span“ gibt man an, wie viele Zellen das Objekt in der ent­spre­chen­den Richtung umfassen soll.

Statt Start- und Endpunkt jeweils in einer einzelnen Anweisung zu de­fi­nie­ren, können Web­de­si­gner beides auch unter einem Kommando zu­sam­men­fas­sen. Der folgende Code führt zum gleichen Ergebnis wie das vor­an­ge­gan­ge­ne Beispiel.

<style>
.grid-container {
    display: grid;
    grid-template-rows: 100px [Line1] 100px [Line2] 100px [Line3] 100px [Line4];
    grid-template-columns: 100px 100px 100px 100px;
    grid-gap: 5px;
}
.grid-item1 {
    background: blue;
    text-align: center;
    border: black 5px solid;
    grid-column: 1 / span 4;
    grid-row: 1 / Line2; 
}
.grid-item2 {
    background: grey;
    text-align: center;
    border: black 5px solid;
}
</style>

Zuweisung von Gebieten

In CSS Grid ist es möglich, Zellen zu Areas zu­sam­men­zu­fas­sen und diese auch zu benennen. Dies macht dann die Auf­tei­lung der einzelnen Elemente innerhalb des Rasters um einiges einfacher. Die Ein­stel­lung dafür nimmt man im Container vor. Dafür verwendet man die Anweisung „grid-template-areas“ und schreibt dann Zeile für Zeile die ge­wünsch­ten Be­reichs­na­men in die Zellen. Möchte man eine Zelle nicht zuordnen und damit auch lang­fris­tig leer lassen, fügt man an diese Stelle einen Punkt ein. Jede Zeile wird mit An­füh­rungs­zei­chen ein­ge­klam­mert.

.grid-container {
	display: grid;
	grid-template-rows: 100px 100px 100px;
	grid-template-columns: 1fr 1fr 1fr 1fr 1fr;
	grid-gap: 5px;
	grid-template-areas:
	"area1 area1 area1 area1 area1"
	"area2 area2 . area3 area3"
	"area2 area2 area4 area4 area4";
}

In diesem CSS-Grid-Beispiel haben wir 4 ver­schie­de­ne Bereiche fest­ge­legt. Eine Zelle ist frei geblieben. Wenn man nun die Items definiert, braucht man keine Von-bis-Werte mehr angeben. Es genügt, auf das zu­ge­hö­ri­ge Areal zu verweisen.

.grid-item1 {
	background: blue;
	text-align: center;
	border: black 5px solid;
	grid-area: area1;
}
.grid-item2 {
	background: red;
	text-align: center;
	border: black 5px solid;
	grid-area: area2;
}
.grid-item3 {
	background: green;
	text-align: center;
	border: black 5px solid;
	grid-area: area3;
}
.grid-item4 {
	background: yellow;
	text-align: center;
	border: black 5px solid;
	grid-area: area4;
}

Aus­rich­tung anpassen

Wie richten sich die einzelnen Elemente innerhalb von CSS Grid aus? Der Standard ist, dass die einzelnen Elemente so aus­ge­dehnt werden, dass sie genau in das Raster passen. Die Item-Größe spielt daher keine Rolle und wurde deshalb in den Bei­spie­len bisher auch nicht angegeben: Statt­des­sen haben wir angegeben, über welche Zellen sich das Objekt verteilen soll. Nun kann es aber sein, dass man dem Item eine feste Größe zuweist, und es trotzdem in das Raster in­te­grie­ren möchte.

Web­de­si­gner haben die Wahl, die Aus­rich­tung aller Items global über den Container fest­zu­le­gen oder aber aus­ge­wähl­ten Objekten eine in­di­vi­du­el­le Aus­rich­tung zu geben. Für die globale Variante verwendet man „justify-items“ und „align-items“. Ersteres regelt die ho­ri­zon­ta­le Aus­rich­tung, letzteres die vertikale. Möchte man nur ein einzelnes Item aus­rich­ten, verwendet man die An­wei­sun­gen „justify-self“ und „align-self“. Alle Befehle be­inhal­ten al­ler­dings dieselben Optionen.

  • stretch: Die Größe des Objekts wird an die Größe der aus­ge­wähl­ten Zellen angepasst.
  • start: Das Objekt richtet sich nach links bzw. oben aus.
  • end: Das Objekt richtet sich nach rechts bzw. unten aus.
  • center: Das Objekt richtet sich mittig aus.
.grid-container {
	display: grid;
	grid-template-rows: 100px 100px 100px 100px;
	grid-template-columns: 100px 100px 100px 100px;
	grid-gap: 5px;
	justify-items: center;
	align-items: center;
}
.grid-item1 {
	background: grey;
	text-align: center;
	border: black 5px solid;
	width: 50px;
	height: 50px;
}
.grid-item2 {
	background: blue;
	text-align: center;
	border: black 5px solid;
	width: 50px;
	height: 50px;
	justify-self: start;
	align-self: start;
}

Man kann die An­wei­sun­gen auch abkürzen, indem man „place-items“ oder „place-self“ verwendet. Es lassen sich beide In­for­ma­tio­nen (vertikal und ho­ri­zon­tal) in nur einer Zeile un­ter­brin­gen: place-items: <align-items> / justify-items>.

place-items: center / end;

Es ist also möglich, Objekte im Raster aus­zu­rich­ten. Man kann al­ler­dings auch das komplette Raster innerhalb des Con­tai­ners ver­schie­ben. Arbeitet man mit sta­ti­schen Grö­ßen­an­ga­ben für das CSS Grid, hat das Raster mitunter nicht die gleiche Größe, wie der komplette Container. Dann kann man mit „justify-content“ und „align-content“ auch das Raster innerhalb des Con­tai­ners – und damit auch innerhalb des Displays – aus­rich­ten. Auch hierbei gibt es ver­schie­de­ne Mög­lich­kei­ten zur Aus­rich­tung:

  • start: links­bün­dig oder nach oben aus­ge­rich­tet
  • end: rechts­bün­dig oder nach unten aus­ge­rich­tet
  • center: mittig aus­ge­rich­tet
  • stretch: aus­ge­dehn­tes Raster
  • space-around: gleich­mä­ßi­ge Ver­tei­lung von Platz um die Zellen herum
  • space-between: gleich­mä­ßi­ge Ver­tei­lung von Platz zwischen den Zellen
  • space-evenly: gleich­mä­ßi­ge Ver­tei­lung von Platz um die Zellen herum inklusive dem Rand
.grid-container {
	display: grid;
	width: 800px;
	height: 800px;
	background: yellow;
	grid-template-rows: 100px 100px 100px 100px;
	grid-template-columns: 100px 100px 100px 100px;
	grid-gap: 5px;
	justify-content: space-evenly;
	align-content: center;
}

Auch für diesen Fall gibt es eine Kurz­ver­si­on: place-content: <align-content> / <justify-content>.

place-content: center / space-evenly;

Au­to­ma­ti­sche An­pas­sun­gen für re­spon­si­ve Designs

Ein we­sent­li­cher Vorteil von CSS Grid ist die Fle­xi­bi­li­tät des Rasters. Man kann CSS Grid so ein­stel­len, dass es sich au­to­ma­tisch anpasst. Das macht nicht nur die Dar­stel­lung auf ver­schie­de­nen Geräten besser: Au­to­ma­tis­men helfen auch dabei, die Arbeit mit CSS zu er­leich­tern.

Eine hilf­rei­che Funktion nennt sich „repeat()“. Statt jede Zeile oder Spalte einzeln zu de­fi­nie­ren, kann man al­ter­na­tiv auch nur eine Grö­ßen­an­ga­be machen und festlegen, wie häufig dieses Schema wie­der­holt werden soll. Noch einfacher geht das in Kom­bi­na­tio­nen mit den Optionen „auto-fill“ und „auto-fit“. Dabei überlässt man CSS Grid die Er­stel­lung von Zeilen und Spalten. Mit der ersten Option fügt CSS Grid so viele Zellen wie möglich ein, ohne die Grenze des Con­tai­ners zu sprengen. Dabei kann es aber passieren, dass Platz ungenutzt üb­rig­bleibt. Die Option „auto-fit“ hingegen passt die einzelnen Zellen so in ihrem Umfang an, dass der Platz bis an den Rand aus­ge­nutzt wird.

.grid-container {
	display: grid;
	width: 800px;
	height: 800px;
	grid-template-rows: repeat(auto-fit, 100px);
	grid-template-columns: repeat(auto-fit, 100px);
	grid-gap: 5px;
}

Sehr hilfreich sind auch die beiden Funk­tio­nen „grid-auto-columns“ und „grid-auto-rows“. Mit diesen beiden An­wei­sun­gen hat man mehr Frei­hei­ten beim Erstellen der Items. Hätte bei­spiels­wei­se ein Raster die Ausmaße von 4 x 4 Zellen und man würde nun ein Item erzeugen, das erst in der fünften Spalte beginnen soll, würde das zu Problemen führen. Durch die au­to­ma­ti­sche Er­stel­lung von genügend Zeilen und Spalten kann man solche Probleme ver­hin­dern.

.grid-container {
	display: grid;
	grid-auto-rows: 100px;
	grid-auto-columns: 100px;
	grid-gap: 5px;
}

Auch wenn die Größe von Raster und Objekten sich an die Größe des Displays anpassen sollen, möchten Web­de­si­gner gern Minimal- und Ma­xi­mal­wer­te eingeben. Mit der Anweisung „minmax()“ kann man si­cher­ge­hen, dass ein Item nicht zu klein oder zu groß wird. In die Klammern trägt man dafür zunächst den kleinsten Wert und dann den größten ein.

.grid-container {
	display: grid;
	grid-template-rows: 100px 100px 100px;
	grid-auto-columns: minmax(50px, 150px);
	grid-gap: 5px;
}

Wenn man nun mehrere der vor­ge­stell­ten Funk­tio­nen mit­ein­an­der kom­bi­niert, kann man sehr leicht ein re­spon­si­ves Design erzeugen.

<!DOCTYPE html>
<html>
<head>
<style>
.grid-container {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(100px, 1fr));
    grid-gap: 5px;
    justify-items: center;
    align-items: center;
}
.grid-item1 {
    background: grey;
    text-align: center;
    border: black 5px solid;
    width: 100px;
    height: 100px;
}
</style>
</head>
<body>
<div class="grid-container">
    <div class="grid-item1">1</div>
    <div class="grid-item1">2</div>
    <div class="grid-item1">3</div>
    <div class="grid-item1">4</div>
    <div class="grid-item1">5</div>
    <div class="grid-item1">6</div>
    <div class="grid-item1">7</div>
    <div class="grid-item1">8</div>
    <div class="grid-item1">9</div>
    <div class="grid-item1">10</div>
</div>
</body>
</html>
Fazit

CSS Grid gibt Web­de­si­gnern die Mög­lich­keit, mit wenig Aufwand an­spre­chen­de Layouts zu erstellen. Dank des Rasters hat man dabei immer die Kontrolle über die Plat­zie­rung von Objekten – selbst bei einem Re­spon­si­ve Design.

Zum Hauptmenü