CSS Grid Layout Guide

Avatar of Chris House
Chris House am

Unser umfassender Leitfaden zu CSS Grid, der sich auf alle Einstellungen sowohl für den Grid-Elterncontainer als auch für die Grid-Kinderelemente konzentriert.

Präsentiert von DigitalOcean

DigitalOcean bietet die Cloud-Computing-Dienste, die Sie benötigen, um Ihr Wachstum in jeder Phase zu unterstützen. Starten Sie mit einem kostenlosen Guthaben von 200 $!

Hol dir das Poster!

Beziehst du dich oft auf diesen Leitfaden? Hier ist ein hochauflösendes Bild, das du drucken kannst!

Einführung in CSS Grid

CSS Grid Layout (auch „Grid“ oder „CSS Grid“ genannt) ist ein zweidimensionales, rasterbasiertes Layout-System, das im Vergleich zu jedem früheren Web-Layout-System die Art und Weise, wie wir Benutzeroberflächen gestalten, vollständig verändert. CSS wurde schon immer verwendet, um unsere Webseiten zu gestalten, aber es hat nie wirklich gute Arbeit geleistet. Zuerst verwendeten wir Tabellen, dann Floats, Positionierung und Inline-Block, aber all diese Methoden waren im Wesentlichen Hacks und ließen viele wichtige Funktionen (z.B. vertikale Zentrierung) außen vor. Flexbox ist ebenfalls ein sehr gutes Layout-Tool, aber sein unidirektionaler Fluss hat andere Anwendungsfälle — und sie arbeiten tatsächlich sehr gut zusammen! Grid ist das allererste CSS-Modul, das speziell entwickelt wurde, um die Layout-Probleme zu lösen, mit denen wir uns seit Beginn der Website-Erstellung herumgeschlagen haben.

Die Absicht dieses Leitfadens ist es, die Grid-Konzepte so darzustellen, wie sie in der neuesten Version der Spezifikation existieren. Ich werde daher die veraltete Internet Explorer-Syntax (obwohl Sie Grid in IE 11 absolut verwenden können) oder andere historische Hacks nicht behandeln.

CSS Grid Grundlagen

Ab März 2017 haben die meisten Browser native, präfixfreie Unterstützung für CSS Grid ausgeliefert: Chrome (einschließlich auf Android), Firefox, Safari (einschließlich auf iOS) und Opera. Internet Explorer 10 und 11 unterstützen es hingegen, aber es ist eine alte Implementierung mit einer veralteten Syntax. Die Zeit, mit Grid zu bauen, ist jetzt!

Um zu beginnen, müssen Sie ein Container-Element als Grid mit display: grid definieren, die Spalten- und Zeilengrößen mit grid-template-columns und grid-template-rows festlegen und dann dessen Kinderelemente mit grid-column und grid-row im Grid platzieren. Ähnlich wie bei Flexbox spielt die Quellreihenfolge der Grid-Elemente keine Rolle. Ihr CSS kann sie in beliebiger Reihenfolge platzieren, was es super einfach macht, Ihr Grid mit Media Queries neu anzuordnen. Stellen Sie sich vor, Sie definieren das Layout Ihrer gesamten Seite und ordnen es dann komplett neu an, um eine andere Bildschirmbreite mit nur wenigen Zeilen CSS zu berücksichtigen. Grid ist eines der mächtigsten CSS-Module, die jemals eingeführt wurden.

Wichtige CSS Grid Terminologie

Bevor wir uns mit den Konzepten von Grid befassen, ist es wichtig, die Terminologie zu verstehen. Da die hier verwendeten Begriffe alle konzeptionell ähnlich sind, ist es leicht, sie miteinander zu verwechseln, wenn man ihre in der Grid-Spezifikation definierten Bedeutungen nicht zuerst auswendig lernt. Aber keine Sorge, es gibt nicht viele davon.

Grid Container

Das Element, auf das display: grid angewendet wird. Es ist der direkte Elternteil aller Grid-Elemente. In diesem Beispiel ist container der Grid-Container.

<div class="container">
  <div class="item item-1"> </div>
  <div class="item item-2"> </div>
  <div class="item item-3"> </div>
</div>

Grid Linie

Die Trennlinien, die die Struktur des Rasters bilden. Sie können entweder vertikal („Spaltenrasterlinien“) oder horizontal („Zeilenrasterlinien“) sein und sich auf beiden Seiten einer Zeile oder Spalte befinden. Hier ist die gelbe Linie ein Beispiel für eine Spaltenrasterlinie.

Grid Spur

Der Raum zwischen zwei benachbarten Rasterlinien. Man kann sie sich als Spalten oder Zeilen des Rasters vorstellen. Hier ist die Rasterspur zwischen der zweiten und dritten Zeilenrasterlinie.

Grid Bereich

Der gesamte Bereich, der von vier Rasterlinien umgeben ist. Ein Rasterbereich kann aus beliebig vielen Rasterzellen bestehen. Hier ist der Rasterbereich zwischen den Zeilenrasterlinien 1 und 3 sowie den Spaltenrasterlinien 1 und 3.

Grid Element

Die Kinder (d.h. *direkte* Nachfahren) des Rastercontainers. Hier sind die `item`-Elemente Rasterelemente, aber `sub-item` nicht.

<div class="container">
  <div class="item"> </div>
  <div class="item">
    <p class="sub-item"> </p>
  </div>
  <div class="item"> </div>
</div>

Grid Zelle

Der Raum zwischen zwei benachbarten Zeilen- und zwei benachbarten Spaltenrasterlinien. Es ist eine einzelne "Einheit" des Rasters. Hier ist die Rasterzelle zwischen den Zeilenrasterlinien 1 und 2 sowie den Spaltenrasterlinien 2 und 3.

CSS Grid Eigenschaften

Eigenschaften für den Elternteil
(Grid-Container)

Sprunglinks

display

Definiert das Element als Grid-Container und etabliert einen neuen Grid-Formatierungskontext für dessen Inhalte.

Werte

  • grid – erzeugt ein block-level Grid
  • inline-grid – erzeugt ein inline-level Grid
.container {
  display: grid | inline-grid;
}

Die Möglichkeit, Grid-Parameter an verschachtelte Elemente (auch Subgrids genannt) weiterzugeben, wurde in Level 2 der CSS Grid-Spezifikation verschoben. Hier ist eine kurze Erklärung.

grid-template-columns
grid-template-rows

Definiert die Spalten und Zeilen des Rasters mit einer durch Leerzeichen getrennten Liste von Werten. Die Werte repräsentieren die Spurgröße, und der Raum dazwischen repräsentiert die Rasterlinie.

Werte

  • <track-size> – kann eine Länge, ein Prozentsatz oder ein Bruchteil des freien Raums im Raster sein, unter Verwendung der fr Einheit (mehr zu dieser Einheit bei DigitalOcean)
  • <line-name> – ein beliebiger Name Ihrer Wahl
.container {
  grid-template-columns: ...  ...;
  /* e.g. 
      1fr 1fr
      minmax(10px, 1fr) 3fr
      repeat(5, 1fr)
      50px auto 100px 1fr
  */
  grid-template-rows: ... ...;
  /* e.g. 
      min-content 1fr min-content
      100px 1fr max-content
  */
}

Rasterlinien erhalten automatisch positive Zahlen aus diesen Zuordnungen (wobei -1 eine Alternative für die allerletzte Zeile ist).

Sie können aber auch die Linien explizit benennen. Beachten Sie die Klammersyntax für die Liniendamen

.container {
  grid-template-columns: [first] 40px [line2] 50px [line3] auto [col4-start] 50px [five] 40px [end];
  grid-template-rows: [row1-start] 25% [row1-end] 100px [third-line] auto [last-line];
}
Grid with user named lines

Beachten Sie, dass eine Linie mehr als einen Namen haben kann. Zum Beispiel wird die zweite Linie hier zwei Namen haben: row1-end und row2-start

.container {
  grid-template-rows: [row1-start] 25% [row1-end row2-start] 25% [row2-end];
}

Wenn Ihre Definition sich wiederholende Teile enthält, können Sie die repeat() Notation verwenden, um die Dinge zu optimieren

.container {
  grid-template-columns: repeat(3, 20px [col-start]);
}

Was dem hier entspricht

.container {
  grid-template-columns: 20px [col-start] 20px [col-start] 20px [col-start];
}

Wenn mehrere Linien denselben Namen teilen, können sie über ihren Liniendamen und ihre Anzahl referenziert werden.

.item {
  grid-column-start: col-start 2;
}

Die fr Einheit ermöglicht es Ihnen, die Größe einer Spur als Bruchteil des freien Raums des Grid-Containers festzulegen. Zum Beispiel wird dies jedes Element auf ein Drittel der Breite des Grid-Containers setzen

.container {
  grid-template-columns: 1fr 1fr 1fr;
}

Der freie Raum wird *nach* allen nicht-flexiblen Elementen berechnet. In diesem Beispiel enthält die Gesamtmenge des für die *fr*-Einheiten verfügbaren freien Raums nicht die 50px

.container {
  grid-template-columns: 1fr 50px 1fr 1fr;
}

grid-template-areas

Definiert eine Rastervorlage, indem die Namen der Rasterbereiche referenziert werden, die mit der grid-area-Eigenschaft angegeben werden. Das Wiederholen des Namens eines Rasterbereichs führt dazu, dass der Inhalt diese Zellen überspannt. Ein Punkt kennzeichnet eine leere Zelle. Die Syntax selbst visualisiert die Struktur des Rasters.

Werte

  • <grid-area-name> – der Name eines mit grid-area angegebenen Rasterbereichs
  • . – ein Punkt kennzeichnet eine leere Gitterzelle
  • none – keine Rasterbereiche sind definiert
.container {
  grid-template-areas: 
    "<grid-area-name> | . | none | ..."
    "...";
}

Beispiel

.item-a {
  grid-area: header;
}
.item-b {
  grid-area: main;
}
.item-c {
  grid-area: sidebar;
}
.item-d {
  grid-area: footer;
}

.container {
  display: grid;
  grid-template-columns: 50px 50px 50px 50px;
  grid-template-rows: auto;
  grid-template-areas: 
    "header header header header"
    "main main . sidebar"
    "footer footer footer footer";
}

Das erstellt ein Raster mit vier Spalten und drei Zeilen. Die gesamte oberste Zeile wird aus dem Bereich header bestehen. Die mittlere Zeile wird aus zwei main-Bereichen, einer leeren Zelle und einem sidebar-Bereich bestehen. Die letzte Zeile ist komplett footer.

Example of grid-template-areas

Jede Zeile in Ihrer Deklaration muss dieselbe Anzahl von Zellen haben.

Sie können beliebig viele benachbarte Punkte verwenden, um eine einzelne leere Zelle zu deklarieren. Solange keine Leerzeichen zwischen den Punkten stehen, repräsentieren sie eine einzelne Zelle.

Beachten Sie, dass Sie mit dieser Syntax keine Linien benennen, sondern nur Bereiche. Wenn Sie diese Syntax verwenden, erhalten die Linien an beiden Enden der Bereiche tatsächlich automatisch Namen. Wenn der Name Ihres Rasterbereichs **_foo_** ist, lautet der Name der Startzeilenlinie und der Startspaltenlinie des Bereichs **_foo_**-start, und der Name seiner letzten Zeilenlinie und letzten Spaltenlinie lautet **_foo_**-end. Dies bedeutet, dass einige Linien mehrere Namen haben können, wie die ganz linke Linie im obigen Beispiel, die drei Namen haben wird: header-start, main-start und footer-start.

grid-template

Eine Kurzschrift zum Festlegen von grid-template-rowsgrid-template-columns und grid-template-areas in einer einzigen Deklaration.

Werte

.container {
  grid-template: none | <grid-template-rows> / <grid-template-columns>;
}

Es akzeptiert auch eine komplexere, aber recht praktische Syntax zur Angabe aller drei. Hier ist ein Beispiel

.container {
  grid-template:
    [row1-start] "header header header" 25px [row1-end]
    [row2-start] "footer footer footer" 25px [row2-end]
    / auto 50px auto;
}

Das ist gleichwertig mit

.container {
  grid-template-rows: [row1-start] 25px [row1-end row2-start] 25px [row2-end];
  grid-template-columns: auto 50px auto;
  grid-template-areas: 
    "header header header" 
    "footer footer footer";
}

Da grid-template die impliziten Grid-Eigenschaften (grid-auto-columnsgrid-auto-rows und grid-auto-flow) nicht zurücksetzt, was wahrscheinlich in den meisten Fällen das ist, was Sie tun möchten, wird empfohlen, stattdessen die grid-Eigenschaft anstelle von grid-template zu verwenden.

column-gap
row-gap
grid-column-gap
grid-row-gap

Gibt die Größe der Rasterlinien an. Man kann es sich wie die Einstellung der Breite der Rinnen zwischen den Spalten/Zeilen vorstellen.

Werte

  • <line-size> – ein Längenwert
.container {
  /* standard */
  column-gap: <line-size>;
  row-gap: <line-size>;

  /* old */
  grid-column-gap: <line-size>;
  grid-row-gap: <line-size>;
}

Beispiel

.container {
  grid-template-columns: 100px 50px 100px;
  grid-template-rows: 80px auto 80px; 
  column-gap: 10px;
  row-gap: 15px;
}
Example of grid-column-gap and grid-row-gap

Die Rinnen werden nur *zwischen* den Spalten/Zeilen erzeugt, nicht an den äußeren Rändern.

Hinweis: Der grid- Präfix wird entfernt und grid-column-gap und grid-row-gap werden in column-gap und row-gap umbenannt. Die präfixfreien Eigenschaften werden bereits in Chrome 68+, Safari 11.2 Release 50+ und Opera 54+ unterstützt.

gap
grid-gap

Eine Kurzform für row-gap und column-gap

Werte

  • <grid-row-gap> <grid-column-gap> – Längenwerte
.container {
  /* standard */
  gap: <grid-row-gap> <grid-column-gap>;

  /* old */
  grid-gap: <grid-row-gap> <grid-column-gap>;
}

Beispiel

.container {
  grid-template-columns: 100px 50px 100px;
  grid-template-rows: 80px auto 80px; 
  gap: 15px 10px;
}

Wenn kein row-gap angegeben ist, wird es auf denselben Wert wie column-gap gesetzt

Hinweis: Das grid- Präfix ist veraltet (aber wer weiß, wird möglicherweise nie tatsächlich aus Browsern entfernt). Im Wesentlichen wurde grid-gap in gap umbenannt. Die präfixfreie Eigenschaft wird bereits in Chrome 68+, Safari 11.2 Release 50+ und Opera 54+ unterstützt.

justify-items

Richtet Rasterelemente entlang der *inline (Reihen)-Achse* aus (im Gegensatz zu align-items, das entlang der *block (Spalten)-Achse* ausrichtet). Dieser Wert gilt für alle Rasterelemente innerhalb des Containers.

Werte

  • start – richtet Elemente bündig mit dem Startrand ihrer Zelle aus
  • end – richtet Elemente bündig mit dem Endrand ihrer Zelle aus
  • center – richtet Elemente in der Mitte ihrer Zelle aus
  • stretch – füllt die gesamte Breite der Zelle aus (dies ist der Standard)
.container {
  justify-items: start | end | center | stretch;
}

Beispiele

.container {
  justify-items: start;
}
Example of justify-items set to start
.container {
  justify-items: end;
}
Example of justify-items set to end
.container {
  justify-items: center;
}
Example of justify-items set to center
.container {
  justify-items: stretch;
}
Example of justify-items set to stretch

Dieses Verhalten kann auch für einzelne Rasterelemente über die Eigenschaft justify-self festgelegt werden.

align-items

Richtet Grid-Elemente entlang der *Block (Spalten)-Achse* aus (im Gegensatz zu justify-items, das entlang der *Inline (Reihen)-Achse* ausrichtet). Dieser Wert gilt für alle Grid-Elemente innerhalb des Containers.

Werte

  • stretch – füllt die gesamte Höhe der Zelle aus (dies ist der Standard)
  • start – richtet Elemente bündig mit dem Startrand ihrer Zelle aus
  • end – richtet Elemente bündig mit dem Endrand ihrer Zelle aus
  • center – richtet Elemente in der Mitte ihrer Zelle aus
  • baseline – richtet Elemente entlang der Textgrundlinie aus. Es gibt Modifikatoren für baselinefirst baseline und last baseline, die bei mehrzeiligem Text die Grundlinie der ersten oder letzten Zeile verwenden.
.container {
  align-items: start | end | center | stretch;
}

Beispiele

.container {
  align-items: start;
}
Example of align-items set to start
.container {
  align-items: end;
}
Example of align-items set to end
.container {
  align-items: center;
}
Example of align-items set to center
.container {
  align-items: stretch;
}
Example of align-items set to stretch

Dieses Verhalten kann auch für einzelne Rasterelemente über die Eigenschaft align-self festgelegt werden.

Es gibt auch die Modifikatoren safe und unsafe (Anwendung ist wie align-items: safe end). Das Schlüsselwort safe bedeutet „versuche, so auszurichten, aber nicht, wenn es bedeutet, ein Element so auszurichten, dass es in einen unzugänglichen Überlaufbereich verschoben wird“, während unsafe erlaubt, Inhalte in unzugängliche Bereiche zu verschieben („Datenverlust“).

place-items

place-items setzt sowohl die align-items als auch die justify-items Eigenschaften in einer einzigen Deklaration.

Werte

  • <align-items> / <justify-items> – Der erste Wert setzt align-items, der zweite Wert justify-items. Wenn der zweite Wert weggelassen wird, wird der erste Wert beiden Eigenschaften zugewiesen.

Weitere Details finden Sie unter align-items und justify-items.

Dies kann sehr nützlich für eine superschnelle multidirektionale Zentrierung sein

.center {
  display: grid;
  place-items: center;
}

justify-content

Manchmal kann die Gesamtgröße Ihres Rasters kleiner sein als die Größe seines Rastercontainers. Dies kann passieren, wenn alle Ihre Rasterelemente mit unflexiblen Einheiten wie px bemessen sind. In diesem Fall können Sie die Ausrichtung des Rasters innerhalb des Rastercontainers festlegen. Diese Eigenschaft richtet das Raster entlang der Inline (Reihen)-Achse aus (im Gegensatz zu align-content, das das Raster entlang der Block (Spalten)-Achse ausrichtet).

Werte

  • start – richtet das Raster bündig mit dem Startrand des Rastercontainers aus
  • end – richtet das Raster bündig mit dem Endrand des Rastercontainers aus
  • center – richtet das Raster in der Mitte des Rastercontainers aus
  • stretch – ändert die Größe der Rasterelemente, damit das Raster die volle Breite des Rastercontainers ausfüllen kann
  • space-around – platziert einen gleichmäßigen Abstand zwischen jedem Rasterelement, mit halb großen Abständen an den äußeren Enden
  • space-between – platziert einen gleichmäßigen Abstand zwischen jedem Rasterelement, ohne Abstand an den äußeren Enden
  • space-evenly – platziert einen gleichmäßigen Abstand zwischen jedem Rasterelement, einschließlich der äußeren Enden
.container {
  justify-content: start | end | center | stretch | space-around | space-between | space-evenly;    
}

Beispiele

.container {
  justify-content: start;
}
Example of justify-content set to start
.container {
  justify-content: end;    
}
Example of justify-content set to end
.container {
  justify-content: center;    
}
Example of justify-content set to center
.container {
  justify-content: stretch;    
}
Example of justify-content set to stretch
.container {
  justify-content: space-around;    
}
Example of justify-content set to space-around
.container {
  justify-content: space-between;    
}
Example of justify-content set to space-between
.container {
  justify-content: space-evenly;    
}
Example of justify-content set to space-evenly

align-content

Manchmal kann die Gesamtgröße Ihres Rasters kleiner sein als die Größe seines Rastercontainers. Dies kann passieren, wenn alle Ihre Rasterelemente mit unflexiblen Einheiten wie px bemessen sind. In diesem Fall können Sie die Ausrichtung des Rasters innerhalb des Rastercontainers festlegen. Diese Eigenschaft richtet das Raster entlang der Block (Spalten)-Achse aus (im Gegensatz zu justify-content, das das Raster entlang der Inline (Reihen)-Achse ausrichtet).

Werte

  • start – richtet das Raster bündig mit dem Startrand des Rastercontainers aus
  • end – richtet das Raster bündig mit dem Endrand des Rastercontainers aus
  • center – richtet das Raster in der Mitte des Rastercontainers aus
  • stretch – ändert die Größe der Rasterelemente, damit das Raster die volle Höhe des Rastercontainers ausfüllen kann
  • space-around – platziert einen gleichmäßigen Abstand zwischen jedem Rasterelement, mit halb großen Abständen an den äußeren Enden
  • space-between – platziert einen gleichmäßigen Abstand zwischen jedem Rasterelement, ohne Abstand an den äußeren Enden
  • space-evenly – platziert einen gleichmäßigen Abstand zwischen jedem Rasterelement, einschließlich der äußeren Enden
.container {
  align-content: start | end | center | stretch | space-around | space-between | space-evenly;    
}

Beispiele

.container {
  align-content: start;    
}
Example of align-content set to start
.container {
  align-content: end;    
}
Example of align-content set to end
.container {
  align-content: center;    
}
Example of align-content set to center
.container {
  align-content: stretch;    
}
Example of align-content set to stretch
.container {
  align-content: space-around;    
}
Example of align-content set to space-around
.container {
  align-content: space-between;    
}
Example of align-content set to space-between
.container {
  align-content: space-evenly;    
}
Example of align-content set to space-evenly

place-content

place-content setzt sowohl die align-content als auch die justify-content Eigenschaften in einer einzigen Deklaration.

Werte

  • <align-content> / <justify-content> – Der erste Wert setzt align-content, der zweite Wert justify-content. Wenn der zweite Wert weggelassen wird, wird der erste Wert beiden Eigenschaften zugewiesen.

Alle großen Browser außer Edge unterstützen die Kurzform place-content.

Weitere Details finden Sie unter align-content und justify-content.

grid-auto-columns
grid-auto-rows

Gibt die Größe aller automatisch generierten Rasterspuren (auch implizite Rasterspuren genannt) an. Implizite Spuren werden erstellt, wenn es mehr Rasterelemente als Zellen im Raster gibt oder wenn ein Rasterelement außerhalb des expliziten Rasters platziert wird. (siehe Der Unterschied zwischen expliziten und impliziten Rastern)

Werte

  • <track-size> – kann eine Länge, ein Prozentsatz oder ein Bruchteil des freien Raums im Raster sein (unter Verwendung der fr Einheit)
.container {
  grid-auto-columns: <track-size> ...;
  grid-auto-rows: <track-size> ...;
}

Um zu veranschaulichen, wie implizite Rasterspuren erstellt werden, denken Sie an Folgendes

.container {
  grid-template-columns: 60px 60px;
  grid-template-rows: 90px 90px;
}
Example of 2x2 grid

Dies erstellt ein 2x2-Raster.

Stellen Sie sich nun aber vor, Sie verwenden grid-column und grid-row, um Ihre Rasterelemente wie folgt zu positionieren

.item-a {
  grid-column: 1 / 2;
  grid-row: 2 / 3;
}
.item-b {
  grid-column: 5 / 6;
  grid-row: 2 / 3;
}
Example of implicit tracks

Wir haben .item-b angewiesen, bei Spaltenlinie 5 zu beginnen und bei Spaltenlinie 6 zu enden, *aber wir haben nie eine Spaltenlinie 5 oder 6 definiert*. Da wir auf nicht existierende Linien verwiesen haben, werden implizite Spuren mit einer Breite von 0 erstellt, um die Lücken zu füllen. Wir können grid-auto-columns und grid-auto-rows verwenden, um die Breiten dieser impliziten Spuren anzugeben

.container {
  grid-auto-columns: 60px;
}
grid-auto-columns-rows

grid-auto-flow

Wenn Sie Rasterelemente haben, die Sie nicht explizit im Raster platzieren, tritt der Auto-Platzierungsalgorithmus in Kraft, um die Elemente automatisch zu platzieren. Diese Eigenschaft steuert, wie der Auto-Platzierungsalgorithmus funktioniert.

Werte

  • row – weist den Auto-Platzierungsalgorithmus an, jede Zeile der Reihe nach zu füllen und bei Bedarf neue Zeilen hinzuzufügen (Standard)
  • column – weist den Auto-Platzierungsalgorithmus an, jede Spalte der Reihe nach zu füllen und bei Bedarf neue Spalten hinzuzufügen
  • dense – weist den Auto-Platzierungsalgorithmus an, zu versuchen, Lücken früher im Raster zu füllen, wenn später kleinere Elemente auftauchen
.container {
  grid-auto-flow: row | column | row dense | column dense;
}

Beachten Sie, dass dense nur die visuelle Reihenfolge Ihrer Elemente ändert und dazu führen kann, dass sie außer der Reihe erscheinen, was schlecht für die Barrierefreiheit ist.

Beispiele

Betrachten Sie dieses HTML

<section class="container">
  <div class="item-a">item-a</div>
  <div class="item-b">item-b</div>
  <div class="item-c">item-c</div>
  <div class="item-d">item-d</div>
  <div class="item-e">item-e</div>
</section>

Sie definieren ein Raster mit fünf Spalten und zwei Zeilen und setzen grid-auto-flow auf row (was auch der Standard ist)

.container {
  display: grid;
  grid-template-columns: 60px 60px 60px 60px 60px;
  grid-template-rows: 30px 30px;
  grid-auto-flow: row;
}

Beim Platzieren der Elemente im Raster geben Sie nur Spots für zwei davon an

.item-a {
  grid-column: 1;
  grid-row: 1 / 3;
}
.item-e {
  grid-column: 5;
  grid-row: 1 / 3;
}

Da wir grid-auto-flow auf row gesetzt haben, wird unser Raster so aussehen. Beachten Sie, wie die drei Elemente, die wir nicht platziert haben (item-bitem-c und item-d), über die verfügbaren Zeilen fließen

Example of grid-auto-flow set to row

Wenn wir stattdessen grid-auto-flow auf column setzen, fließen item-bitem-c und item-d die Spalten hinunter

.container {
  display: grid;
  grid-template-columns: 60px 60px 60px 60px 60px;
  grid-template-rows: 30px 30px;
  grid-auto-flow: column;
}
Example of grid-auto-flow set to column

grid

Eine Kurzform zum Festlegen aller folgenden Eigenschaften in einer einzigen Deklaration: grid-template-rowsgrid-template-columnsgrid-template-areasgrid-auto-rowsgrid-auto-columns und grid-auto-flow (Hinweis: Sie können nur die expliziten oder die impliziten Grid-Eigenschaften in einer einzigen Grid-Deklaration angeben).

Werte

  • none – setzt alle Untereigenschaften auf ihre Anfangswerte.
  • <grid-template> – funktioniert genauso wie die Kurzform grid-template.
  • <grid-template-rows> / [ auto-flow && dense? ] <grid-auto-columns>? – setzt grid-template-rows auf den angegebenen Wert. Wenn das Schlüsselwort auto-flow rechts vom Schrägstrich steht, setzt es grid-auto-flow auf column. Wenn das Schlüsselwort dense zusätzlich angegeben wird, verwendet der Auto-Platzierungsalgorithmus einen „dichten“ Packalgorithmus. Wenn grid-auto-columns weggelassen wird, wird es auf auto gesetzt.
  • [ auto-flow && dense? ] <grid-auto-rows>? / <grid-template-columns> – setzt grid-template-columns auf den angegebenen Wert. Wenn das Schlüsselwort auto-flow links vom Schrägstrich steht, setzt es grid-auto-flow auf row. Wenn das Schlüsselwort dense zusätzlich angegeben wird, verwendet der Auto-Platzierungsalgorithmus einen „dichten“ Packalgorithmus. Wenn grid-auto-rows weggelassen wird, wird es auf auto gesetzt.

Beispiele

Die folgenden zwei Codeblöcke sind äquivalent

.container {
  grid: 100px 300px / 3fr 1fr;
}

.container {
  grid-template-rows: 100px 300px;
  grid-template-columns: 3fr 1fr;
}

Die folgenden zwei Codeblöcke sind äquivalent

.container {
  grid: auto-flow / 200px 1fr;
}

.container {
  grid-auto-flow: row;
  grid-template-columns: 200px 1fr;
}

Die folgenden zwei Codeblöcke sind äquivalent

.container {
  grid: auto-flow dense 100px / 1fr 2fr;
}

.container {
  grid-auto-flow: row dense;
  grid-auto-rows: 100px;
  grid-template-columns: 1fr 2fr;
}

Und die folgenden beiden Codeblöcke sind äquivalent

.container {
  grid: 100px 300px / auto-flow 200px;
}

.container {
  grid-template-rows: 100px 300px;
  grid-auto-flow: column;
  grid-auto-columns: 200px;
}

Es akzeptiert auch eine komplexere, aber recht praktische Syntax, um alles auf einmal festzulegen. Sie geben grid-template-areasgrid-template-rows und grid-template-columns an, und alle anderen Untereigenschaften werden auf ihre ursprünglichen Werte gesetzt. Was Sie tun, ist, die Liniendamen und Spurgrößen inline mit ihren jeweiligen Gitterbereichen anzugeben. Dies lässt sich am einfachsten mit einem Beispiel beschreiben

.container {
  grid: [row1-start] "header header header" 1fr [row1-end]
        [row2-start] "footer footer footer" 25px [row2-end]
        / auto 50px auto;
}

Das ist gleichwertig mit

.container {
  grid-template-areas: 
    "header header header"
    "footer footer footer";
  grid-template-rows: [row1-start] 1fr [row1-end row2-start] 25px [row2-end];
  grid-template-columns: auto 50px auto;    
}

Eigenschaften für die Kinder
(Rasterelemente)

Sprunglinks

floatdisplay: inline-blockdisplay: table-cellvertical-align und column-* Eigenschaften haben keine Auswirkung auf ein Rasterelement.

grid-column-start
grid-column-end
grid-row-start
grid-row-end

Bestimmt die Position eines Rasterelements innerhalb des Rasters durch Bezugnahme auf spezifische Rasterlinien. grid-column-start/grid-row-start ist die Linie, an der das Element beginnt, und grid-column-end/grid-row-end ist die Linie, an der das Element endet.

Werte

  • <line> – kann eine Zahl sein, um sich auf eine nummerierte Rasterlinie zu beziehen, oder ein Name, um sich auf eine benannte Rasterlinie zu beziehen
  • span <number> – das Element wird über die angegebene Anzahl von Rasterspuren gespannt
  • span <name> – das Element wird gespannt, bis es die nächste Linie mit dem angegebenen Namen erreicht
  • auto – zeigt automatische Platzierung, eine automatische Spanne oder eine Standardspanne von eins an
.item {
  grid-column-start: <number> | <name> | span <number> | span <name> | auto;
  grid-column-end: <number> | <name> | span <number> | span <name> | auto;
  grid-row-start: <number> | <name> | span <number> | span <name> | auto;
  grid-row-end: <number> | <name> | span <number> | span <name> | auto;
}

Beispiele

.item-a {
  grid-column-start: 2;
  grid-column-end: five;
  grid-row-start: row1-start;
  grid-row-end: 3;
}
Example of grid-row/column-start/end
.item-b {
  grid-column-start: 1;
  grid-column-end: span col4-start;
  grid-row-start: 2;
  grid-row-end: span 2;
}
Example of grid-row/column-start/end

Wenn keine grid-column-end/grid-row-end deklariert ist, erstreckt sich das Element standardmäßig über 1 Spur.

Elemente können sich überlappen. Sie können z-index verwenden, um ihre Stapelreihenfolge zu steuern.

Erfahren Sie mehr über die span-Notation in diesem Artikel von DigitalOcean.

grid-column
grid-row

Kurzform für grid-column-start + grid-column-end bzw. grid-row-start + grid-row-end.

Werte

  • <start-line> / <end-line> – jeder akzeptiert die gleichen Werte wie die Langform, einschließlich span
.item {
  grid-column: <start-line> / <end-line> | <start-line> / span <value>;
  grid-row: <start-line> / <end-line> | <start-line> / span <value>;
}

Beispiel

.item-c {
  grid-column: 3 / span 2;
  grid-row: third-line / 4;
}
Example of grid-column/grid-row

Wenn kein Endlinienwert deklariert ist, überspannt das Element standardmäßig 1 Spur.

grid-area

Gibt einem Element einen Namen, sodass es von einer Vorlage, die mit der grid-template-areas-Eigenschaft erstellt wurde, referenziert werden kann. Alternativ kann diese Eigenschaft als noch kürzere Kurzform für grid-row-start + grid-column-start + grid-row-end + grid-column-end verwendet werden.

Werte

  • <name> – ein Name Ihrer Wahl
  • <row-start> / <column-start> / <row-end> / <column-end> – können Zahlen oder benannte Linien sein
.item {
  grid-area: <name> | <row-start> / <column-start> / <row-end> / <column-end>;
}

Beispiele

Als eine Möglichkeit, dem Element einen Namen zuzuweisen

.item-d {
  grid-area: header;
}

Als die Kurzform für grid-row-start + grid-column-start + grid-row-end + grid-column-end

.item-d {
  grid-area: 1 / col4-start / last-line / 6;
}
Example of grid-area

justify-self

Richtet ein Rasterelement innerhalb einer Zelle entlang der inline (Reihen)-Achse aus (im Gegensatz zu align-self, das entlang der block (Spalten)-Achse ausrichtet). Dieser Wert gilt für ein Rasterelement innerhalb einer einzelnen Zelle.

Werte

  • start – richtet das Rasterelement bündig mit dem Startrand der Zelle aus
  • end – richtet das Rasterelement bündig mit dem Endrand der Zelle aus
  • center – richtet das Rasterelement in der Mitte der Zelle aus
  • stretch – füllt die gesamte Breite der Zelle aus (dies ist der Standard)
.item {
  justify-self: start | end | center | stretch;
}

Beispiele

.item-a {
  justify-self: start;
}
Example of justify-self set to start
.item-a {
  justify-self: end;
}
alt="Example
.item-a {
  justify-self: center;
}
Example of justify-self set to center
.item-a {
  justify-self: stretch;
}
Example of justify-self set to stretch

Um die Ausrichtung für *alle* Elemente in einem Raster festzulegen, kann dieses Verhalten auch für den Rastercontainer über die Eigenschaft justify-items festgelegt werden.

align-self

Richtet ein Rasterelement innerhalb einer Zelle entlang der Block (Spalten)-Achse aus (im Gegensatz zu justify-self, das entlang der Inline (Reihen)-Achse ausrichtet). Dieser Wert gilt für den Inhalt innerhalb eines einzelnen Rasterelements.

Werte

  • start – richtet das Rasterelement bündig mit dem Startrand der Zelle aus
  • end – richtet das Rasterelement bündig mit dem Endrand der Zelle aus
  • center – richtet das Rasterelement in der Mitte der Zelle aus
  • stretch – füllt die gesamte Höhe der Zelle aus (dies ist der Standard)
.item {
  align-self: start | end | center | stretch;
}

Beispiele

.item-a {
  align-self: start;
}
Example of align-self set to start
.item-a {
  align-self: end;
}
Example of align-self set to end
.item-a {
  align-self: center;
}
Example of align-self set to center
.item-a {
  align-self: stretch;
}
Example of align-self set to stretch

Um *alle* Elemente in einem Raster auszurichten, kann dieses Verhalten auch für den Rastercontainer über die Eigenschaft align-items festgelegt werden.

place-self

place-self setzt sowohl die align-self als auch die justify-self Eigenschaften in einer einzigen Deklaration.

Werte

  • auto – Die „Standard“-Ausrichtung für den Layout-Modus.
  • <align-self> / <justify-self> – Der erste Wert setzt align-self, der zweite Wert justify-self. Wenn der zweite Wert weggelassen wird, wird der erste Wert beiden Eigenschaften zugewiesen.

Beispiele

.item-a {
  place-self: center;
}
place self set to center
.item-a {
  place-self: center stretch;
}
place set set to center stretch

Alle wichtigen Browser außer Edge unterstützen die Kurzform place-self.

Spezielle Einheiten & Funktionen

fr-Einheiten

Sie werden wahrscheinlich viele Bruchstücke in CSS Grid verwenden, wie 1fr. Sie bedeuten im Wesentlichen "Anteil des verbleibenden Raums". Eine Deklaration wie

grid-template-columns: 1fr 3fr;

Bedeutet, grob gesagt, 25% 75%. Außer dass diese Prozentwerte viel fester sind als Bruchteile. Wenn Sie zum Beispiel Polsterung zu diesen prozentbasierten Spalten hinzufügen würden, hätten Sie jetzt eine 100%ige Breite unterbrochen (unter Annahme eines content-box Box-Modells). Bruchteile sind auch in Kombination mit anderen Einheiten viel freundlicher, wie Sie sich vorstellen können

grid-template-columns: 50px min-content 1fr;

Größen-Schlüsselwörter

Beim Festlegen der Größe von Zeilen und Spalten können Sie alle Ihnen bekannten Längenangaben verwenden, wie px, rem, %, usw., aber Sie haben auch Schlüsselwörter

  • min-content: die minimale Größe des Inhalts. Stellen Sie sich eine Textzeile wie „E pluribus unum“ vor, der min-content ist wahrscheinlich die Breite des Wortes „pluribus“.
  • max-content: die maximale Größe des Inhalts. Stellen Sie sich den obigen Satz vor, der max-content ist die Länge des gesamten Satzes.
  • auto: Dieses Schlüsselwort ähnelt stark den fr-Einheiten, außer dass sie im Größenkampf gegen fr-Einheiten „verlieren“, wenn der verbleibende Platz zugewiesen wird.
  • Bruchstücke: siehe oben

Größenfunktionen

  • Die Funktion fit-content() verwendet den verfügbaren Platz, jedoch nie weniger als min-content und nie mehr als max-content.
  • Die Funktion minmax() tut genau das, wonach es klingt: Sie legt einen Minimal- und Maximalwert für die mögliche Länge fest. Dies ist nützlich in Kombination mit relativen Einheiten. Zum Beispiel möchten Sie, dass eine Spalte nur bis zu einem bestimmten Punkt schrumpfen kann. Dies ist extrem nützlich und wahrscheinlich das, was Sie wollen
grid-template-columns: minmax(100px, 1fr) 3fr;
  • Die Funktion min().
  • Die Funktion max().

Die Funktion repeat() und Schlüsselwörter

Die Funktion repeat() kann etwas Tipparbeit sparen

grid-template-columns:
  1fr 1fr 1fr 1fr 1fr 1fr 1fr 1fr;

/* easier: */
grid-template-columns:
  repeat(8, 1fr);

/* especially when: */
grid-template-columns:
  repeat(8, minmax(10px, 1fr));

Aber repeat() kann noch ausgefallener werden, wenn es mit Schlüsselwörtern kombiniert wird

  • auto-fill: Passt so viele Spalten wie möglich in eine Zeile, auch wenn sie leer sind.
  • auto-fit: Passt alle vorhandenen Spalten in den verfügbaren Platz. Bevorzugt das Erweitern von Spalten, um den Platz zu füllen, anstatt leere Spalten zu verwenden.

Dies ist das berühmteste Snippet in CSS Grid und einer der besten CSS-Tricks aller Zeiten

grid-template-columns: 
  repeat(auto-fit, minmax(250px, 1fr));

Der Unterschied zwischen den Schlüsselwörtern ist hier ausführlich erklärt.

Masonry

Ein experimentelles Feature von CSS Grid ist das Masonry-Layout. Beachten Sie, dass es viele Ansätze für ein CSS Masonry-Layout gibt, aber die meisten davon sind Tricks und haben entweder größere Nachteile oder sind nicht das, was Sie erwarten.

Die Spezifikation hat jetzt eine offizielle Methode, und diese ist in Firefox hinter einem Flag verborgen

.container {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  grid-template-rows: masonry;
}

Siehe Rachels Artikel für einen detaillierten Einblick.

Subgrid

Subgrid ist eine äußerst nützliche Funktion von Grids, die es Grid-Elementen ermöglicht, ein eigenes Grid zu haben, das die Grid-Linien des übergeordneten Grids erbt.

.parent-grid {
  display: grid;
  grid-template-columns: repeat(9, 1fr);
}
.grid-item {
  grid-column: 2 / 7;

  display: grid;
  grid-template-columns: subgrid;
}
.child-of-grid-item {
  /* gets to participate on parent grid! */
  grid-column: 3 / 6;
}

Dies wird derzeit nur in Firefox unterstützt, muss aber wirklich überall verfügbar sein.

Es ist auch nützlich, über display: contents; Bescheid zu wissen. Dies ist *nicht* dasselbe wie ein Unterraster, kann aber manchmal auf ähnliche Weise ein nützliches Werkzeug sein.

<div class="grid-parent">

  <div class="grid-item"></div>
  <div class="grid-item"></div>

  <ul style="display: contents;">
    <!-- These grid-items get to participate on 
         the same grid!-->
    <li class="grid-item"></li>
    <li class="grid-item"></li>
  </ul>

</div>

CSS Grid Browser-Unterstützung

Diese Browser-Unterstützungsdaten stammen von Caniuse, die weitere Details enthält. Eine Zahl gibt an, dass der Browser die Funktion ab dieser Version und höher unterstützt.

Desktop

ChromeFirefoxIEEdgeSafari
575211*1610.1

Mobil / Tablet

Android ChromeAndroid FirefoxAndroidiOS Safari
12712712710.3

Fluid Columns Snippet

Fluid Columns, die sich je nach verfügbarem Platz in mehr oder weniger Spalten aufteilen, ohne Media Queries!

.grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
  /* This is better for small screens, once min() is better supported */
  /* grid-template-columns: repeat(auto-fill, minmax(min(200px, 100%), 1fr)); */
  gap: 1rem;
}

CSS Grid Animation

Gemäß der CSS Grid Layout Module Level 1 Spezifikation gibt es 5 animierbare Grid-Eigenschaften

  • grid-gapgrid-row-gapgrid-column-gap als Länge, Prozentsatz oder Calc.
  • grid-template-columnsgrid-template-rows als einfache Liste von Länge, Prozentsatz oder Calc, vorausgesetzt, die einzigen Unterschiede sind die Werte der Längen-, Prozent- oder Calc-Komponenten in der Liste.

Zum Zeitpunkt der Erstellung dieses Dokuments ist nur die Animation von (grid-)gap(grid-)row-gap und (grid-)column-gap in den getesteten Browsern implementiert.

Browser(grid-)gap(grid-)row-gap(grid-)column-gapgrid-template-columnsgrid-template-rows
Firefoxunterstützt ✅ 53+unterstützt ✅ 66+unterstützt ✅ 66+
Safari 12.0nicht unterstützt ❌nicht unterstützt ❌nicht unterstützt ❌
Chromeunterstützt ✅ 66+nicht unterstützt ❌nicht unterstützt ❌
Chrome für Android 66+, Opera Mini 33+unterstützt ✅nicht unterstützt ❌nicht unterstützt ❌
Edgeunterstützt ✅ 16+nicht unterstützt ❌nicht unterstützt ❌

CSS-Grid Tricks!

CSS Grid lernen

CSS Grid Videos

Weitere CSS Grid-Quellen