Zum Inhalt springen

CSS Grid Layout: Ein praktischer Leitfaden zur Meisterschaft

CSS Grid ermöglicht zweidimensionale Layouts, die früher Hacks brauchten: das Grid-Modell, Platzierungsregeln und Muster statt Float-Layouts.

3 Min. Lesezeit
Visualisierung eines CSS-Grid-Layouts mit Zeilen, Spalten und Grid-Bereichen

Vor CSS Grid erforderten zweidimensionale Layouts Floats, Positionierungs-Hacks oder Flexbox-Workarounds. Grid wurde genau dafür entwickelt: Zeilen und Spalten definieren, Elemente in Zellen platzieren und dem Browser die Berechnungen überlassen. Es ist das erste CSS-Layoutsystem, das in beiden Dimensionen gleichzeitig arbeitet.

Ein Grid definieren

Ein Grid-Container erzeugt einen zweidimensionalen Layout-Kontext. Du definierst Spalten und Zeilen am Container; die Kindelemente werden zu Grid Items.

csscss
/* ❌ Float-based layout — fragile, requires clearfix hacks */
.container::after {
  content: "";
  display: table;
  clear: both;
}
.sidebar {
  float: left;
  width: 25%;
}
.main {
  float: left;
  width: 75%;
}
 
/* ✅ CSS Grid — explicit, maintainable */
.container {
  display: grid;
  grid-template-columns: 250px 1fr;
  grid-template-rows: auto 1fr auto;
  gap: 1rem;
  min-height: 100vh;
}

Die Einheit 1fr verteilt den verfügbaren Platz proportional. 250px 1fr bedeutet eine feste 250px-Sidebar und einen flexiblen Hauptbereich, der den Rest einnimmt.

Grid Template Areas

Benannte Grid-Bereiche machen komplexe Layouts lesbar, indem sie eine visuelle ASCII-Darstellung auf das tatsächliche Layout abbilden.

csscss
.dashboard {
  display: grid;
  grid-template-columns: 240px 1fr 1fr;
  grid-template-rows: 60px 1fr auto;
  grid-template-areas:
    "header  header  header"
    "sidebar main    aside"
    "sidebar footer  footer";
  gap: 1rem;
  min-height: 100vh;
}
 
.header  { grid-area: header; }
.sidebar { grid-area: sidebar; }
.main    { grid-area: main; }
.aside   { grid-area: aside; }
.footer  { grid-area: footer; }
htmlhtml
<div class="dashboard">
  <header class="header">Navigation</header>
  <nav class="sidebar">Menu</nav>
  <main class="main">Content</main>
  <aside class="aside">Details</aside>
  <footer class="footer">Status</footer>
</div>

Responsives Grid mit minmax und auto-fit

auto-fit mit minmax() erzeugt responsive Grids ohne Media Queries. Die Elemente brechen automatisch um, je nach verfügbarem Platz.

csscss
/* ❌ Fixed column count — breaks on narrow screens */
.card-grid {
  display: grid;
  grid-template-columns: 1fr 1fr 1fr;
  gap: 1rem;
}
 
/* ✅ Auto-responsive — cards wrap based on available width */
.card-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
  gap: 1.5rem;
}
/* 
  auto-fit: create as many columns as fit
  minmax(280px, 1fr): each column is at least 280px, at most equal share
  Result: 4 columns on wide screen, 2 on tablet, 1 on mobile — no media queries
*/

Explizite Platzierung

Grid Items können über Liniennummern oder Span-Direktiven in bestimmte Zellen platziert werden.

csscss
/* Place items by grid line numbers */
.featured-article {
  grid-column: 1 / 3;   /* Span from column line 1 to line 3 (2 columns) */
  grid-row: 1 / 2;      /* First row */
}
 
/* Span syntax — more readable for common cases */
.wide-card {
  grid-column: span 2;  /* Span 2 columns from wherever it's placed */
}
 
.tall-card {
  grid-row: span 2;     /* Span 2 rows */
}
csscss
/* Full magazine-style layout */
.magazine-grid {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  grid-template-rows: repeat(3, 200px);
  gap: 1rem;
}
 
.hero-story {
  grid-column: 1 / 3;
  grid-row: 1 / 3;
}
 
.secondary-story {
  grid-column: 3 / 5;
  grid-row: 1 / 2;
}
 
.sidebar-story {
  grid-column: 3 / 4;
  grid-row: 2 / 4;
}

Ausrichtung und Zentrierung

Grid bietet Ausrichtungseigenschaften sowohl für die Grid Items innerhalb ihrer Zellen als auch für die Grid-Tracks innerhalb des Containers.

csscss
/* Center a single item both horizontally and vertically */
.centered-container {
  display: grid;
  place-items: center;
  min-height: 100vh;
}
 
/* Align items within their grid cells */
.grid {
  display: grid;
  grid-template-columns: repeat(3, 200px);
  justify-items: center;   /* Horizontal alignment of items within cells */
  align-items: start;       /* Vertical alignment of items within cells */
}
 
/* Distribute grid tracks within the container */
.grid-centered {
  display: grid;
  grid-template-columns: repeat(3, 200px);
  justify-content: center;  /* Center the entire grid horizontally */
  align-content: start;     /* Align the grid to the top */
  gap: 2rem;
}

Grid mit Media Queries für komplexe Layouts

auto-fit deckt zwar viele responsive Fälle ab, aber komplexe Layouts brauchen manchmal explizite Grid-Änderungen an den Breakpoints.

csscss
.app-layout {
  display: grid;
  gap: 1rem;
 
  /* Mobile: single column stack */
  grid-template-columns: 1fr;
  grid-template-areas:
    "header"
    "main"
    "sidebar"
    "footer";
}
 
@media (min-width: 768px) {
  .app-layout {
    /* Tablet: sidebar becomes a column */
    grid-template-columns: 200px 1fr;
    grid-template-areas:
      "header  header"
      "sidebar main"
      "footer  footer";
  }
}
 
@media (min-width: 1200px) {
  .app-layout {
    /* Desktop: three-column layout */
    grid-template-columns: 240px 1fr 300px;
    grid-template-areas:
      "header  header  header"
      "sidebar main    aside"
      "footer  footer  footer";
  }
}

Die wichtigsten Erkenntnisse

  1. Grid arbeitet in zwei Dimensionen — definiere Zeilen und Spalten gleichzeitig und platziere Elemente beliebig im Grid
  2. Benannte Bereiche erzeugen lesbare Layouts — die ASCII-Art in grid-template-areas bildet das visuelle Ergebnis direkt ab
  3. auto-fit mit minmax() erzeugt responsive Grids ohne Media Queries — Elemente brechen automatisch je nach Containerbreite um
  4. Verwende fr-Einheiten für proportionale Größen — 1fr 2fr ergibt einen Teil und zwei Teile des verfügbaren Platzes
  5. place-items: center ist die einfachste Zentrierung — eine Zeile ersetzt das Flexbox-Zentrierungsmuster
  6. Kombiniere auto-fit für Karten-Grids und explizite Bereiche für App-Layouts — nutze für jeden Layout-Typ das richtige Werkzeug
Wilfredo Rujel

Wilfredo Rujel

Full-Stack-Softwareentwickler

Diesen Beitrag teilenX