> ## Documentation Index
> Fetch the complete documentation index at: https://docs.baenninger.me/llms.txt
> Use this file to discover all available pages before exploring further.

# Grid

Das CSS-Grid-Layout ist ein zweidimensionales Layoutsystem für das Web. Es ermöglicht dir, Inhalte in Reihen und Spalten zu organisieren und bietet viele Features, um die Erstellung komplexer Layouts zu vereinfachen.

***

Zunächst müssen wir einen Grid-Container erstellen. Dafür nutzen wir die `display`-Eigenschaft.

```css theme={null}
.container {
  display: grid;
}
```

## Reihen und Spalten definieren

Mit `grid-template-columns` bzw. `grid-template-rows` können wir Spalten und Reihen definieren.

```css theme={null}
.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
  */
}
```

Den Grid-Linien werden automatisch Zahlen zugewiesen.

<Frame caption="Zahlenwerte im Grid-Layout">
  <img src="https://mintcdn.com/levexis-38849a2b/fK05ZPeHGTgSfJjo/images/content/web/file-excalidraw-20.svg?fit=max&auto=format&n=fK05ZPeHGTgSfJjo&q=85&s=3f7d732a6250f183fa5512ff77aee1a4" alt="Zahlenwerte im Grid-Layout" width="814" height="502" data-path="images/content/web/file-excalidraw-20.svg" />
</Frame>

***

Nun können wir mit `grid-column` bzw. `grid-row` den Start und Ende eines Grid-Items bestimmen.

```css theme={null}
.item {
  grid-column: 3 / span 2;
  grid-row: third-line / 4;
}
```

<Frame caption="grid-column und grid-row">
  <img src="https://mintcdn.com/levexis-38849a2b/fK05ZPeHGTgSfJjo/images/content/web/file-excalidraw-22.svg?fit=max&auto=format&n=fK05ZPeHGTgSfJjo&q=85&s=6091592392859954632403d7271b41a3" alt="grid-column und grid-row" width="726" height="410" data-path="images/content/web/file-excalidraw-22.svg" />
</Frame>

## Template-Areas

Mit Template-Areas können wir bestimmten Bereichen unseres Grids einen Namen geben.

```css theme={null}
.container {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  grid-template-rows: auto;
  grid-template-areas: 
    "header header header header"
    "main main . sidebar"
    "footer footer footer footer";
}
```

<Frame caption="template-areas">
  <img src="https://mintcdn.com/levexis-38849a2b/fK05ZPeHGTgSfJjo/images/content/web/file-excalidraw-21.svg?fit=max&auto=format&n=fK05ZPeHGTgSfJjo&q=85&s=15c36057e22efddaeaa48c98fda0bb25" alt="template-areas" width="712" height="491" data-path="images/content/web/file-excalidraw-21.svg" />
</Frame>

***

Mit `grid-area` können wir nun festlegen, welche Items zu welcher Area gehören.

```css theme={null}
.item {
  grid-area: header;
}
```

<Frame caption="grid-area">
  <img src="https://mintcdn.com/levexis-38849a2b/fK05ZPeHGTgSfJjo/images/content/web/file-excalidraw-23.svg?fit=max&auto=format&n=fK05ZPeHGTgSfJjo&q=85&s=ff02842425b9c6f2a4fc3568dcd64c0c" alt="grid-area" width="711" height="490" data-path="images/content/web/file-excalidraw-23.svg" />
</Frame>

<Info>
  `grid-area` kann auch als Shorthand für `grid-row` und `grid-column` genutzt werden.

  ```css theme={null}
  .item-d {
    grid-area: 1 / span 2 / -1 / 6;
  }
  ```
</Info>

## Abstände

Mit `gap` können wir die Abstände zwischen den Reihen und den Spalten bestimmen.

```css theme={null}
.container {
  gap: 1rem 2rem;
}
```

<Info>
  Wenn wir `column-gap` nicht spezifizieren, nutzt es den selben Wert wie `row-gap`.
</Info>

## Ausrichtung

Mit `justify-items` kannst du Grid-Items anhand der Inline-Achse ausrichten.

```css theme={null}
.container {
  justify-items: start | end | center | stretch;
}
```

<Frame caption="justify-items">
  <img src="https://mintcdn.com/levexis-38849a2b/fK05ZPeHGTgSfJjo/images/content/web/file-excalidraw-24.svg?fit=max&auto=format&n=fK05ZPeHGTgSfJjo&q=85&s=67c1c4799db24e1b2f5e7f1382a39c53" alt="justify-items" width="1823" height="1197" data-path="images/content/web/file-excalidraw-24.svg" />
</Frame>

***

Mit `align-items` kannst du Grid-Items anhand der Block-Achse ausrichten.

```css theme={null}
.container {
  align-items: start | end | center | stretch;
}
```

<Frame caption="align-items">
  <img src="https://mintcdn.com/levexis-38849a2b/fK05ZPeHGTgSfJjo/images/content/web/file-excalidraw-25.svg?fit=max&auto=format&n=fK05ZPeHGTgSfJjo&q=85&s=d4c9b2c85c44979c5cd6d703e7093b4d" alt="align-items" width="1833" height="1194" data-path="images/content/web/file-excalidraw-25.svg" />
</Frame>

***

`place-items` ist ein Shorthand für `align-items` und `justify-items`.

```css theme={null}
.center {
  display: grid;
  place-items: center / start;
}
```

***

Wenn die Grösse des Grids kleiner ist als der eigentliche Grid-Container können wir das Grid innerhalb des Containers ausrichten. Mit `justify-content` richten wir das Grid anhand der Inline-Achse aus.

```css theme={null}
.container {
  justify-content: start | end | center | stretch | space-around | space-between | space-evenly;    
}
```

<Frame caption="justify-content">
  <img src="https://mintcdn.com/levexis-38849a2b/fK05ZPeHGTgSfJjo/images/content/web/file-excalidraw-26.svg?fit=max&auto=format&n=fK05ZPeHGTgSfJjo&q=85&s=7ba96a43cc942f081a3c7503ac56b35f" alt="justify-content" width="1543" height="2506" data-path="images/content/web/file-excalidraw-26.svg" />
</Frame>

***

Mit `justify-content` richten wir das Grid anhand der Block-Achse aus.

```css theme={null}
.container {
  align-content: start | end | center | stretch | space-around | space-between | space-evenly;    
}
```

<Frame caption="align-content">
  <img src="https://mintcdn.com/levexis-38849a2b/fK05ZPeHGTgSfJjo/images/content/web/file-excalidraw-27.svg?fit=max&auto=format&n=fK05ZPeHGTgSfJjo&q=85&s=e6c1d68aabc50829a91211e6928e4c71" alt="align-content" width="1676" height="2374" data-path="images/content/web/file-excalidraw-27.svg" />
</Frame>

***

`place-content` ist ein Shorthand für `align-content` und `justify-content`.

```css theme={null}
.container {
  display: grid;
  place-content: center;
}
```

## Die `fr`-Einheit

Die `fr`-Einheit repräsentiert eine Fraktion des ürbigen Platzes.

```css theme={null}
.container {
  grid-template-columns: 1fr 3fr;
}
```

Hier sagen wir, dass die erste Spalte ca. $\frac{1}{4}$ des Platzes und die zweite Spalte ca. $\frac{3}{4}$ des Platzes einnimmt.

Die `fr`-Einheit kann aber natürlich auch in Kombination mit anderen Einheiten genutzt werden.

```css theme={null}
.container {
  grid-template-columns: 50px min-content 1fr;
}
```

## Sizing-Keywords

<AccordionGroup>
  <Accordion title="`min-content`">
    Die Mindestgrösse des Inhalts. Stelle dir eine Textzeile wie „E pluribus unum“ vor. Der Mindestinhalt entspricht wahrscheinlich der Breite des Wortes „pluribus“.
  </Accordion>

  <Accordion title="`max-content`">
    Die maximale Grösse des Inhalts. Stelle dir den [obigen Satz](/web/layout/grid#min-content) vor. Der maximale Inhalt ist die Länge des gesamten Satzes.
  </Accordion>

  <Accordion title="`auto`">
    Dieses Schlüsselwort ist ähnlich wie die `fr`-Einheiten, mit dem Unterschied, dass sie bei der Zuteilung des verbleibenden Platzes den Kampf gegen die `fr`-Einheiten „verlieren“.
  </Accordion>
</AccordionGroup>

## Sizing Funktionen

<AccordionGroup>
  <Accordion title="`fit-content()`">
    Nutzt den verfügbaren Platz, jedoch nie weniger als `min-content` und nie mehr als `max-content`.
  </Accordion>

  <Accordion title="`minmax()`">
    Legt einen Mindest- und einen Höchstwert für die Länge fest. Dies ist nützlich in Kombination mit relativen Einheiten. Zum Beispiel kannst du eine Spalte nur bis zu einer gewissen Breite schrumpfen lassen.

    ```css theme={null}
    grid-template-columns: minmax(100px, 1fr) 3fr;
    ```
  </Accordion>
</AccordionGroup>

## Die `repeat()`-Funktion und Keywords

Die Funktion `repeat()` kann einige Tipparbeit ersparen:

```css theme={null}
grid-template-columns:
  1fr 1fr 1fr 1fr 1fr 1fr 1fr 1fr;

grid-template-columns:
  repeat(8, 1fr);
```

Aber `repeat()` kann besonders ausgefallen werden, wenn es mit Schlüsselwörtern kombiniert wird:

* `auto-fill`: Passt so viele Spalten wie möglich in eine Zeile ein, auch wenn sie leer sind.
* `auto-fit`: Passt alle vorhandenen Spalten in den Platz ein. Bevorzuge expandierende Spalten, um den Platz zu füllen, anstatt leere Spalten.

```css theme={null}
grid-template-columns: 
  repeat(auto-fit, minmax(250px, 1fr));
```

Mehr Informationen findest du in [diesem Post](https://css-tricks.com/auto-sizing-columns-css-grid-auto-fill-vs-auto-fit/).
