Dieser Inhalt wurde automatisch aus dem Englischen übersetzt, und kann Fehler enthalten. Erfahre mehr über dieses Experiment.

View in English Always switch to English

Grundkonzepte des Grid-Layouts

Das CSS-Grid-Layout führt ein zweidimensionales Rastersystem in CSS ein. Grids können verwendet werden, um größere Seitenbereiche oder kleine Benutzerschnittstellenelemente zu gestalten. Dieser Leitfaden führt in das CSS-Grid-Layout ein und erklärt die Terminologie, die Teil der CSS-Grid-Layout-Spezifikation ist. Die in dieser Übersicht gezeigten Funktionen werden dann in den anderen Leitfäden dieser Serie detaillierter erklärt.

Was ist ein Grid?

Ein Grid ist eine Menge sich kreuzender horizontaler und vertikaler Linien, die Zeilen und Spalten definieren. Elemente können innerhalb dieser Spalten- und Zeilenlinien auf dem Grid platziert werden. Das CSS-Grid-Layout bietet folgende Funktionen:

Feste und flexible Spurgrößen

Sie können ein Grid mit festen Spurgrößen erstellen - zum Beispiel mit Pixeln. Dies setzt das Grid auf die spezifizierte Pixelgröße, die zu dem gewünschten Layout passt. Sie können auch ein Grid mit flexiblen Größen erstellen, indem Sie Prozentsätze oder die für diesen Zweck entworfene Einheit fr verwenden.

Platzierung der Elemente

Sie können Elemente mithilfe von Liniennummern, Namen oder durch Anvisieren eines Bereichs des Grids an einem genauen Ort auf dem Grid platzieren. Das Grid enthält auch einen Algorithmus zur Steuerung der Platzierung von Elementen, die keine explizite Position auf dem Grid haben.

Erstellung zusätzlicher Spuren zur Aufnahme von Inhalten

Sie können ein explizites Grid mit dem Grid-Layout definieren. Die vom Grid-Layout-Modul definierten Funktionen bieten die Flexibilität, nach Bedarf zusätzliche Zeilen und Spalten hinzuzufügen. Funktionen wie das Hinzufügen von "so vielen Spalten, die in einen Container passen" sind enthalten.

Steuerung der Ausrichtung

Das CSS-Grid-Layout und die CSS-Box-Ausrichtungsfunktionen ermöglichen es uns, die Ausrichtung der Elemente zu steuern, sobald diese in einen Grid-Bereich platziert sind, und wie das gesamte Grid ausgerichtet ist.

Steuerung von sich überlappenden Inhalten

Mehr als ein Element kann in eine Rasterzelle oder einen Bereich eingefügt werden und sie können sich teilweise überlappen. Diese Schichtung kann dann mit der z-index-Eigenschaft gesteuert werden.

Grid ist eine leistungsstarke Layoutmethode, die in Kombination mit anderen Teilen von CSS wie Flexbox Ihnen helfen kann, Layouts zu erstellen, die reaktionsfähig, flexibel und zugänglich sind. Es beginnt alles damit, ein Grid in Ihrem grid container zu erstellen.

Grid-Container

Wir erstellen einen Grid-Container, indem wir display: grid oder display: inline-grid auf einem Element deklarieren. Sobald wir dies tun, werden alle direkten Kinder dieses Elements zu Grid-Elementen.

In diesem Beispiel haben wir ein umschließendes div mit einer Klasse von wrapper. Darin verschachtelt sind fünf Kindelemente.

html
<div class="wrapper">
  <div>One</div>
  <div>Two</div>
  <div>Three</div>
  <div>Four</div>
  <div>Five</div>
</div>

Wir machen den .wrapper zu einem Grid-Container, indem wir display: grid; verwenden.

css
.wrapper {
  display: grid;
}

Alle direkten Kinder sind jetzt Grid-Elemente. In einem Webbrowser sehen Sie keinen Unterschied in der Darstellung dieser Elemente, bevor sie in ein Grid umgewandelt werden, da das Grid für die Elemente eine Einzelspaltengitter erstellt hat. Wenn Sie das Grid in den Entwicklerwerkzeugen Ihres Browsers inspizieren, sehen Sie möglicherweise ein kleines Symbol neben dem Wert grid. Klicken Sie darauf, und in den meisten Browsern wird das Grid auf diesem Element im Browserfenster überlagert.

Verwenden des Grid-Hervorhebers in Firefox DevTools zum Ansehen eines Grids

Wenn Sie das CSS-Grid-Layout erlernen und dann damit arbeiten, geben Ihnen Ihre Browserwerkzeuge eine bessere Vorstellung davon, was mit Ihren Grids visuell passiert.

Wenn wir dies mehr nach Grid aussehen lassen wollen, müssen wir Spaltenspuren hinzufügen.

Grid-Spuren

Wir definieren Zeilen und Spalten in unserem Grid mit den Eigenschaften grid-template-rows und grid-template-columns. Diese definieren Grid-Spuren. Eine Grid-Spur ist der Raum zwischen zwei angrenzenden Linien auf dem Grid. Das Bild unten zeigt eine hervorgehobene Spur – das ist die erste Zeilenspur in unserem Grid.

Eine Box mit 3 Gitterelementen. Über den drei Elementen befindet sich ein festes hellgrünes Gebiet, das die Spur ist.

Grid-Spuren werden im expliziten Grid durch die Eigenschaften grid-template-columns und grid-template-rows oder die Kurzform grid oder grid-template definiert. Spuren werden auch im impliziten Grid erstellt, indem ein Grid-Element außerhalb der im expliziten Grid erstellten Spuren positioniert wird.

Einfaches Beispiel

Wir können Spaltenspuren zu unserem früheren Beispiel hinzufügen, indem wir die Eigenschaft grid-template-columns hinzufügen und dann die Größe der Spaltenspuren definieren.

Wir haben jetzt ein Grid mit drei 200 Pixel breiten Spaltenspuren erstellt. Die Kindelemente werden in diesem Grid angeordnet, jeweils eines in jeder Gitterzelle.

html
<div class="wrapper">
  <div>One</div>
  <div>Two</div>
  <div>Three</div>
  <div>Four</div>
  <div>Five</div>
</div>
css
.wrapper {
  display: grid;
  grid-template-columns: 200px 200px 200px;
}

Die fr-Einheit

Spuren können mit jeder Längeneinheit definiert werden. Das Grid führt auch eine zusätzliche Längeneinheit ein, um uns zu helfen, flexible Grid-Spuren zu erstellen. Die fr Einheit stellt einen Bruchteil des verfügbaren Raumes im Grid-Container dar. Die nächste Grid-Definition würde drei gleichbreite Spuren erstellen, die gemäß dem verfügbaren Raum wachsen und sich verkleinern.

html
<div class="wrapper">
  <div>One</div>
  <div>Two</div>
  <div>Three</div>
  <div>Four</div>
  <div>Five</div>
</div>
css
.wrapper {
  display: grid;
  grid-template-columns: 1fr 1fr 1fr;
}

Ungleiche Größen

In diesem Beispiel erstellen wir eine Definition mit einer 2fr Spur und dann zwei 1fr Spuren. Der verfügbare Raum wird in vier Teile geteilt. Zwei Teile werden der ersten Spur und je ein Teil den nächsten zwei Spuren zugewiesen.

html
<div class="wrapper">
  <div>One</div>
  <div>Two</div>
  <div>Three</div>
  <div>Four</div>
  <div>Five</div>
</div>
css
.wrapper {
  display: grid;
  grid-template-columns: 2fr 1fr 1fr;
}

Mischen von flexiblen und absoluten Größen

In diesem letzten Beispiel mischen wir absolut große Spuren mit fr-Einheiten. Die erste Spur ist 500px, sodass die feste Breite vom verfügbaren Raum abgezogen wird. Der verbleibende Raum wird in drei Teile geteilt und proportional den beiden flexiblen Spuren zugewiesen.

html
<div class="wrapper">
  <div>One</div>
  <div>Two</div>
  <div>Three</div>
  <div>Four</div>
  <div>Five</div>
</div>
css
.wrapper {
  display: grid;
  grid-template-columns: 500px 1fr 2fr;
}

Spuraufzählungen mit der repeat() Notation

Große Grids mit vielen Spuren können die repeat() Notation verwenden, um alle oder einen Abschnitt der Liste der Grid-Spuren zu wiederholen. Zum Beispiel kann die Grid-Definition:

css
.wrapper {
  display: grid;
  grid-template-columns: 1fr 1fr 1fr;
}

Auch geschrieben werden als:

css
.wrapper {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
}

Die Repeat-Notation kann für einen Teil der Auflistung der Spuren verwendet werden. In diesem Beispiel erstellen wir ein 8-Spalten-Grid; die initiale Spur ist 20px, dann ein wiederholter Abschnitt von 6 1fr Spuren, und eine letzte 20px Spur.

css
.wrapper {
  display: grid;
  grid-template-columns: 20px repeat(6, 1fr) 20px;
}

Mit Repeat-Notation (repeat()) wird die Auflistung der Spuren verwendet, um ein wiederkehrendes Muster von Spuren zu erstellen. In diesem Beispiel wird das Grid 10 Spuren haben; eine 1fr Spur folgt auf eine 2fr Spur, wobei sich dieses Muster fünfmal wiederholt.

css
.wrapper {
  display: grid;
  grid-template-columns: repeat(5, 1fr 2fr);
}

Implizite und explizite Grids

Bei der Erstellung unseres Beispiel-Grids haben wir unsere Spaltenspuren explizit mit der Eigenschaft grid-template-columns definiert, wobei das Grid Zeilen erstellt, um den Inhalt unterzubringen. Die Spalten definieren das explizite Grid, während die Zeilen Teil des impliziten Grids sind.

Das explizite Grid besteht aus Zeilen und Spalten, die mit grid-template-columns oder grid-template-rows definiert sind. Das implizite Grid erweitert das definierte explizite Grid, wenn Inhalte außerhalb dieses Grids platziert werden, wie zum Beispiel in den Zeilen durch das Zeichnen zusätzlicher Gitterlinien.

Wenn Sie etwas außerhalb des definierten Grids platzieren oder aufgrund der Menge an Inhalten mehr Grid-Spuren benötigt werden, erstellt das Grid Zeilen und Spalten im impliziten Grid. Diese impliziten Spuren sind standardmäßig automatisch groß, was bedeutet, dass die Größe der erstellten Zeilen oder Spalten sowohl von ihrem Inhalt als auch von dem verfügbaren freien Raum innerhalb des Grid-Containers beeinflusst wird. Das auto-Schlüsselwort ermöglicht es den erzeugten Spuren, den Inhalt unterzubringen und gleichzeitig verbleibenden Raum zu teilen.

Sie können auch eine feste Größe für in impliziten Grids erstellte Spuren mit den Eigenschaften grid-auto-rows und grid-auto-columns definieren.

In diesem Beispiel setzen wir grid-auto-rows: 200px, um sicherzustellen, dass die in diesem impliziten Grid erstellten Spuren 200px hoch sind.

html
<div class="wrapper">
  <div>One</div>
  <div>Two</div>
  <div>Three</div>
  <div>Four</div>
  <div>Five</div>
</div>
css
.wrapper {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  grid-auto-rows: 200px;
}

Spurgrößen und minmax

Beim Einrichten eines expliziten Grids oder beim Definieren der Größe für automatisch erstellte Zeilen oder Spalten möchten wir möglicherweise Spuren eine Mindestgröße geben, aber auch sicherstellen, dass sie sich ausdehnen, um Inhalte aufzunehmen, die hinzugefügt werden. Zum Beispiel möchten wir möglicherweise, dass unsere Zeilen nicht kleiner als 100 Pixel schrumpfen, aber wenn unser Inhalt auf 300 Pixel in der Höhe gestreckt wird, möchten wir, dass sich die Zeile auf diese Höhe erstreckt. Dies wird durch die minmax()-Funktion gelöst.

In diesem Beispiel verwenden wir minmax() innerhalb des Eigenschaftswerts grid-auto-rows. Durch das Setzen von grid-auto-rows: minmax(100px, auto);, werden automatisch erstellte Zeilen mindestens 100px hoch sein und ein Maximum von auto haben. Das Setzen von auto als Maximalwert ermöglicht es der Spur, sich ausdehnen, um ihren Inhalt aufzunehmen (bis zu ihrer max-content-Größe) und gleichzeitig verbleibenden freien Raum im Grid-Container zu teilen.

css
.wrapper {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  grid-auto-rows: minmax(100px, auto);
}

Grid-Linien

Es sollte beachtet werden, dass wir bei der Definition eines Grids die Grid-Spuren, nicht die Linien, definieren. Das Grid gibt uns dann nummerierte Linien, um Elemente zu positionieren. In unserem dreispaltigen, zweizeiligen Grid haben wir vier Spaltenlinien.

Diagramm zeigt nummerierte Grid-Linien.

Linien werden entsprechend dem Schreibmodus des Dokuments nummeriert. In einer Sprache von links nach rechts ist die Linie 1 auf der linken Seite des Grids. In einer Sprache von rechts nach links befindet sie sich auf der rechten Seite des Grids. Linien können auch benannt werden, was im Grid-Layout mit benannten Grid-Linien Leitfaden erläutert wird.

Positionierung von Elementen gegen Linien

Das folgende Beispiel zeigt eine grundlegende linienbasierte Platzierung; Beim Platzieren eines Elements zielen wir auf die Linie und nicht auf die Spur ab. Dies wird im Leitfaden grid layout using line-based placement detaillierter behandelt.

In diesem Beispiel werden die ersten beiden Elemente auf unserem dreispaltigen Spur-Grid mit den Eigenschaften grid-column-start, grid-column-end, grid-row-start und grid-row-end positioniert. Von links nach rechts wird das erste Element an Spaltenlinie 1 positioniert und erstreckt sich bis zur Spaltenlinie 4, die in unserem Fall die äußerste rechte Linie auf dem Grid ist. Es beginnt an der Zeilenlinie 1 und endet an der Zeilenlinie 3, spannt also zwei Zeilenspuren.

Das zweite Element beginnt an der Grid-Spaltenlinie 1 und umfasst eine Spur. Dies ist der Standard, daher müssen wir die Endlinie nicht angeben. Es umfasst auch zwei Zeilenspuren von Zeilenlinie 3 bis Zeilenlinie 5. Die anderen Elemente werden sich selbst in die leeren Bereiche des Grids platzieren.

html
<div class="wrapper">
  <div class="box1">One</div>
  <div class="box2">Two</div>
  <div class="box3">Three</div>
  <div class="box4">Four</div>
  <div class="box5">Five</div>
</div>
css
.wrapper {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  grid-auto-rows: 100px;
}

.box1 {
  grid-column-start: 1;
  grid-column-end: 4;
  grid-row-start: 1;
  grid-row-end: 3;
}

.box2 {
  grid-column-start: 1;
  grid-row-start: 3;
  grid-row-end: 5;
}

Verwenden Sie den Grid-Inspektor in Ihren Entwicklerwerkzeugen, um zu sehen, wie die Elemente gegen die Linien des Grids positioniert sind.

Linien-Positionierungs-Kurzformen

Die oben verwendeten Langformwerte können bei den Spalten mit der Kurzform grid-column und bei den Zeilen mit der Kurzform grid-row auf eine Linie reduziert werden. Das folgende Beispiel würde dieselbe Positionierung wie im vorherigen Code ergeben, jedoch mit weit weniger CSS. Der Wert vor dem Schrägstrich (/) ist die Startlinie, der Wert danach die Endlinie.

Sie können den Endwert weglassen, wenn das Gebiet nur eine Spur umfassen soll.

css
.wrapper {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  grid-auto-rows: 100px;
}

.box1 {
  grid-column: 1 / 4;
  grid-row: 1 / 3;
}

.box2 {
  grid-column: 1;
  grid-row: 3 / 5;
}

Grid-Zellen

Eine Grid-Zelle ist die kleinste Einheit auf einem Grid. Konzeptionell ist sie wie eine Tabellenzelle. Wie wir in unseren früheren Beispielen gesehen haben, wird, sobald ein Grid als Elternteil definiert ist, die Kind-Elemente sich jeweils in einer Zelle des definierten Grids anordnen. Im unten stehenden Bild ist die erste Zelle des Grids hervorgehoben.

Die erste Zelle des Grids hervorgehoben

Grid-Bereiche

Elemente können sich über eine oder mehrere Zellen erstrecken, sowohl in Zeilen- als auch in Spaltenrichtung, und dies erzeugt einen Grid-Bereich. Grid-Bereiche müssen rechteckig sein - es ist beispielsweise nicht möglich, einen L-förmigen Bereich zu erstellen. Der hervorgehobene Grid-Bereich erstreckt sich über zwei Zeilen- und zwei Spaltenspuren.

Ein Grid-Bereich

Rinnen

Rinnen oder Gänge zwischen Grid-Zellen können mit den Eigenschaften column-gap und row-gap oder der Kurzform gap erstellt werden. Im unten stehenden Beispiel fügen wir einen 10-Pixel-Abstand zwischen den Spalten und einen 1em Abstand zwischen den Zeilen hinzu.

css
.wrapper {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  column-gap: 10px;
  row-gap: 1em;
}
html
<div class="wrapper">
  <div>One</div>
  <div>Two</div>
  <div>Three</div>
  <div>Four</div>
  <div>Five</div>
</div>

Jeder Platz, der von Lücken verwendet wird, wird berücksichtigt, bevor Platz den flexiblen Längen fr-Spuren zugewiesen wird, und Lücken verhalten sich für Größenbestimmungszwecke wie eine reguläre Grid-Spur, jedoch können Sie nichts in eine Lücke platzieren. In Bezug auf die linienbasierte Positionierung verhält sich die Lücke wie eine dicke, transparente Linie.

Verschachtelung von Grids

Ein Grid-Element kann zu einem Grid-Container werden. Im folgenden Beispiel erweitern wij das dreispaltige Grid mit zwei zuvor positionierten Elementen und fügen Unterelemente zum ersten Grid-Element hinzu. Da diese verschachtelten Elemente keine direkten Kinder des Grids sind, nehmen sie nicht an der Grid-Layout-Darstellung teil und werden daher im normalen Dokumentenfluss angezeigt.

Verschachteltes Grid im Fluss

Verschachtelung ohne Subgrid

Wenn wir box1 display: grid zuweisen, können wir eine Spurdefinition geben und es wird auch zu einem Grid. Die Elemente werden dann auf diesem neuen Grid angeordnet.

css
.box1 {
  grid-column-start: 1;
  grid-column-end: 4;
  grid-row-start: 1;
  grid-row-end: 3;
  display: grid;
  grid-template-columns: repeat(3, 1fr);
}
html
<div class="wrapper">
  <div class="box box1">
    <div class="nested">a</div>
    <div class="nested">b</div>
    <div class="nested">c</div>
  </div>
  <div class="box box2">Two</div>
  <div class="box box3">Three</div>
  <div class="box box4">Four</div>
  <div class="box box5">Five</div>
</div>
css
* {
  box-sizing: border-box;
}

.wrapper {
  border: 2px solid #f76707;
  border-radius: 5px;
  gap: 3px;
  background-color: #fff4e6;
  display: grid;
  grid-template-columns: repeat(3, 1fr);
}

.box {
  border: 2px solid #ffa94d;
  border-radius: 5px;
  background-color: #ffd8a8;
  padding: 1em;
  color: #d9480f;
}

.box1 {
  grid-column: 1 / 4;
}

.nested {
  border: 2px solid #ffec99;
  border-radius: 5px;
  background-color: #fff9db;
  padding: 1em;
}

In diesem Fall hat das verschachtelte Grid keine Beziehung zum übergeordneten Element. Wie Sie im Beispiel sehen können, wurde das gap der Eltern nicht geerbt und die Linien im verschachtelten Grid sind nicht mit den Linien im übergeordneten Grid ausgerichtet.

Subgrid

Zusätzlich zu regulären Grids können wir ein Subgrid erstellen. Der subgrid-Wert ermöglicht es uns, verschachtelte Grids zu erstellen, die die Spurdefinition des übergeordneten Grids verwenden.

Um sie zu verwenden, bearbeiten wir das obige verschachtelte Grid-Beispiel und ändern die Spurdefinition von grid-template-columns: repeat(3, 1fr), zu grid-template-columns: subgrid. Das verschachtelte Grid verwendet dann die übergeordneten Grid-Spuren, um Elemente anzuordnen.

css
.box1 {
  grid-column-start: 1;
  grid-column-end: 4;
  grid-row-start: 1;
  grid-row-end: 3;
  display: grid;
  grid-template-columns: subgrid;
}

Schichtung von Elementen mit z-index

Grid-Elemente können dieselbe Zelle belegen, und in diesem Fall können wir die Eigenschaft z-index verwenden, um die Reihenfolge zu steuern, in der sich überlappende Elemente stapeln.

Überlappen ohne z-index

Wenn wir zu unserem Beispiel mit Elementen zurückkehren, die nach Liniennummer positioniert sind, können wir dies ändern, um zwei Elemente überlappen zu lassen.

html
<div class="wrapper">
  <div class="box box1">One</div>
  <div class="box box2">Two</div>
  <div class="box box3">Three</div>
  <div class="box box4">Four</div>
  <div class="box box5">Five</div>
</div>
css
.wrapper {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  grid-auto-rows: 100px;
}

.box1 {
  grid-column-start: 1;
  grid-column-end: 4;
  grid-row-start: 1;
  grid-row-end: 3;
}

.box2 {
  grid-column-start: 1;
  grid-row-start: 2;
  grid-row-end: 4;
}

Das Element box2 überlappt jetzt box1, es wird oben angezeigt, da es später in der Quellreihenfolge kommt.

Steuerung der Reihenfolge

Wir können die Reihenfolge, in der sich Elemente stapeln, mit der z-index-Eigenschaft steuern – genau wie bei positionierten Elementen. Wenn wir box2 einen niedrigeren z-index als box1 geben, wird es unter box1 im Stapel angezeigt.

css
.wrapper {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  grid-auto-rows: 100px;
}

.box1 {
  grid-column-start: 1;
  grid-column-end: 4;
  grid-row-start: 1;
  grid-row-end: 3;
  z-index: 2;
}

.box2 {
  grid-column-start: 1;
  grid-row-start: 2;
  grid-row-end: 4;
  z-index: 1;
}

Nächste Schritte

In dieser Übersicht haben wir einen sehr schnellen Blick auf die Möglichkeiten von Grid-Layouts geworfen. Erkunden und spielen Sie mit den Codebeispielen, und fahren Sie dann mit dem Leitfaden Beziehung des Grid-Layouts zu anderen Layout-Methoden fort, wo wir wirklich anfangen, die Details des CSS-Grid-Layouts zu erkunden.