CSS Grid – rozvržení stránky

Doba čtení: cca 3 min

Flexbox skvěle řeší rozvržení prvků v jednom směru – buď v řádku nebo ve sloupci. CSS Grid jde dál: pracuje ve dvou rozměrech najednou, řádcích i sloupcích. Je to nejlepší nástroj pro tvorbu celkového layoutu stránky nebo komplexních mřížek – jako jsou fotogalerie, kartičky produktů nebo rozložení se sidebarem.

Základní použití

Grid aktivuješ stejně jako Flexbox – vlastností display: grid na rodičovském prvku. Poté definuješ sloupce pomocí grid-template-columns:

/* CSS */
.mrizka {
  display: grid;
  grid-template-columns: 200px 200px 200px; /* tři sloupce po 200px */
  gap: 20px;                                /* mezera mezi buňkami */
}
<!-- HTML -->
<div class="mrizka">
  <div>Buňka 1</div>
  <div>Buňka 2</div>
  <div>Buňka 3</div>
  <div>Buňka 4</div>
  <div>Buňka 5</div>
  <div>Buňka 6</div>
</div>

Potomci se automaticky rozmístí do mřížky – tři do prvního řádku, tři do druhého.

Jednotka fr – zlomek dostupného prostoru

Místo pevných pixelů lze použít jednotku fr (fraction – zlomek). Je to klíč k flexibilním mřížkám:

/* Tři stejně široké sloupce */
grid-template-columns: 1fr 1fr 1fr;

/* Sidebar + hlavní obsah: sidebar má 250px, obsah zabere zbytek */
grid-template-columns: 250px 1fr;

/* Dvě kolony: druhá je dvakrát širší než první */
grid-template-columns: 1fr 2fr;

Zkratka repeat()

Místo opakování stejné hodnoty lze použít funkci repeat():

/* Těchto dvě zápisy jsou ekvivalentní */
grid-template-columns: 1fr 1fr 1fr 1fr;
grid-template-columns: repeat(4, 1fr);

Kombinace repeat() s hodnotou auto-fill nebo auto-fit a funkcí minmax() vytvoří responzivní mřížku bez media queries – počet sloupců se přizpůsobí šířce obrazovky automaticky:

.galerie {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
  gap: 16px;
}

Tento kód říká: „Vytvoř tolik sloupců, kolik se vejde, přičemž každý musí mít alespoň 200px a nejvýše celý dostupný prostor.\“ Na velkém monitoru vznikne pět sloupců, na telefonu jeden.

Řádky a mezery

Podobně jako sloupce lze definovat i výšku řádků pomocí grid-template-rows. Vlastnost gap nastavuje mezery – buď pro oba směry najednou, nebo zvlášť:

.mrizka {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  grid-template-rows: 100px 200px;  /* první řádek 100px, druhý 200px */
  column-gap: 20px;                 /* mezera mezi sloupci */
  row-gap: 10px;                    /* mezera mezi řádky */
  /* nebo zkráceně: gap: 10px 20px; (řádky sloupce) */
}

Umístění prvku v mřížce

Každý potomek lze umístit přesně – říct mu, od kterého sloupce do kterého má sahat. Čísla čar začínají od 1:

.hlavni-obsah {
  grid-column: 2 / 4; /* od 2. čáry do 4. čáry = zabere 2. a 3. sloupec */
  grid-row: 1 / 3;    /* od 1. čáry do 3. čáry = zabere 1. a 2. řádek */
}

/* Zkratka: span říká „přes N buněk“ */
.hlavni-obsah {
  grid-column: 2 / span 2; /* začne na 2. sloupci, zabere 2 sloupce */
}

Typický layout stránky pomocí Gridu

Grid se výborně hodí pro celkový layout stránky. Pomocí vlastnosti grid-template-areas lze definovat oblasti pojmenovaně, což je velmi čitelné:

.stranka {
  display: grid;
  grid-template-columns: 250px 1fr;
  grid-template-rows: auto 1fr auto;
  grid-template-areas:
    "header  header"
    "sidebar main"
    "footer  footer";
  min-height: 100vh;
}

header { grid-area: header; }
.sidebar { grid-area: sidebar; }
main { grid-area: main; }
footer { grid-area: footer; }

Grid vs. Flexbox – kdy co použít?

  • Flexbox – pro rozvržení prvků v jednom směru: řádek tlačítek, navigaci, kartu s ikonou a textem vedle sebe.
  • Grid – pro dvourozměrné rozvržení: celkový layout stránky, fotogalerie, mřížka produktů, formuláře se zarovnanými poli.

Nejsou alternativy – jsou to komplementární nástroje. Na jedné stránce klidně použij oba: Grid pro celkové rozvržení, Flexbox pro dílčí komponenty uvnitř.

Tip od Zdeňka

Zdeněk radí: Na tomto webu používám Grid pro layout kontejneru se dvěma sloupci – hlavní obsah vlevo a navigační panel vpravo. Jeden řádek CSS (display: grid; grid-template-columns: 1fr 300px;) nahradil dřívější komplikované absolutní pozicování. Grid je přímočarý a výsledek je čistší jak v kódu, tak na obrazovce. Pokud tě děsí složité příklady, začni od té nejjednodušší věci: display: grid; grid-template-columns: repeat(3, 1fr); gap: 20px; – tři stejné sloupce, mezera, hotovo.