// csstahak/ · 03 z 10

CSS Grid

Dvourozměrný layout — řady i sloupce zároveň. Nejsilnější nástroj pro stránkový layout, komplexní mřížky a automaticky responzivní gridy.

// Grid vlastnosti — na kontejneru vs na itemu
Na grid kontejneru (parent):
display: grid / inline-grid
grid-template-columns
grid-template-rows
grid-template-areas
grid-template (shorthand)
gap / row-gap / column-gap
justify-items / align-items
justify-content / align-content
grid-auto-columns / rows
grid-auto-flow
Na grid itemu (child):
grid-column-start
grid-column-end
grid-column (shorthand)
grid-row-start / end
grid-row (shorthand)
grid-area
justify-self / align-self
order
Grid vs Flexbox: Grid = dvourozměrný (řady + sloupce současně). Flexbox = jednorozměrný (řada NEBO sloupec). Kombinujte: Grid pro stránkový layout, Flex pro komponenty uvnitř grid cells.
display: grid

Grid kontejner

Aktivuje CSS Grid. Přímí potomci se stávají grid items rozmístěné do mřížky řádků a sloupců.

KONTEJNER

display: grid vytvoří grid kontejner. Na rozdíl od Flexboxu je Grid dvourozměrný — řídí rozmístění v řadách i sloupcích současně. Přímí potomci se stávají grid items. display: inline-grid = grid který se chová jako inline element.

// Implicitní vs explicitní gridExplicitní grid = definovaný přes grid-template-columns/rows. Implicitní grid = automaticky vytvořené řady/sloupce pro items které se nevejdou do explicitního gridu. grid-auto-rows nastaví výšku implicitních řad.
Hodnoty
grid inline-grid
  • Funguje jen na přímé potomky (ne vnuky)
  • Grid items jsou defaultně stretch v obou osách
  • Absolutně pozicovaní potomci nejsou grid items
  • grid-auto-flow: dense = vyplní mezery v gridu
Základní grid příklady
CSS
/* 3 stejné sloupce */
.grid {
  display: grid;
  grid-template-columns: 1fr 1fr 1fr;
  gap: 1rem;
}

/* 2 sloupce + automatické řady */
.grid {
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  grid-auto-rows: minmax(100px, auto);
  gap: 1rem;
}

/* Implicitní řady auto-výška */
.gallery {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  grid-auto-rows: 200px;
  gap: 1rem;
}

/* Masonry-like s dense */
.masonry {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  grid-auto-flow: dense;
  gap: 1rem;
}
grid-template-columns / rows

Definice sloupců a řádků

fr, px, %, auto, repeat(), minmax(), auto-fill, auto-fit. Nejdůležitější grid vlastnost.

KONTEJNER

fr (fraction) = podíl zbývajícího prostoru po pevných hodnotách. repeat(n, šířka) = N sloupců stejné šířky. minmax(min, max) = flexibilní rozmezí. auto-fill = co nejvíce sloupců. auto-fit = jako auto-fill ale smrští prázdné stopy.

// Nejlepší trick v CSS Gridrepeat(auto-fill, minmax(200px, 1fr)) = automaticky responzivní grid bez media queries. Prohlížeč sám vypočítá kolik sloupců se vejde. Při 800px: ~4 sloupce. Při 500px: ~2 sloupce. Bez jediné media query.
Klíčové hodnoty
fr px / em / rem % auto min-content max-content minmax(min, max) repeat(n, size) auto-fill auto-fit
Živá ukázka — různé definice sloupců
repeat(3, 1fr)
1fr
1fr
1fr
80px 1fr 2fr
80px
1fr
2fr
repeat(auto-fill, minmax(80px, 1fr))
A
B
C
D
  • fr = distribuuje ZBÝVAJÍCÍ prostor (po px/auto)
  • minmax(0, 1fr) pro správný overflow v grid cell
  • auto-fill: zachová prázdné sloupce
  • auto-fit: smrší prázdné sloupce → items se roztáhnou
Příklady
CSS
/* 3 stejné sloupce */
.grid { grid-template-columns: 1fr 1fr 1fr; }
/* nebo: */
.grid { grid-template-columns: repeat(3, 1fr); }

/* Různě wide sloupce */
.layout {
  grid-template-columns: 240px 1fr 180px;
}

/* ✅ NEJLEPŠÍ: responzivní bez media queries */
.cards {
  display: grid;
  grid-template-columns:
    repeat(auto-fill, minmax(200px, 1fr));
  gap: 1rem;
}
/* 800px → 4 sloupce (200px každý) */
/* 500px → 2 sloupce               */
/* 250px → 1 sloupec                */

/* auto-fit: items se roztáhnou */
.cards-fit {
  grid-template-columns:
    repeat(auto-fit, minmax(200px, 1fr));
}

/* Řádky s min výškou */
.grid {
  grid-template-rows:
    60px        /* první řádek: pevný */
    1fr         /* druhý: zbývající prostor */
    auto;       /* třetí: dle obsahu */
}

/* Named grid lines */
.layout {
  grid-template-columns:
    [sidebar-start] 240px
    [sidebar-end main-start] 1fr
    [main-end];
}
grid-template-areas

Pojmenované oblasti

ASCII mapa layoutu. Nejčitelnější způsob definice komplexního layoutu. Tečka = prázdná buňka.

KONTEJNER

Umožňuje vizuálně popsat layout pomocí pojmenovaných oblastí. Tečka (.) = prázdná buňka. Na grid items přiřaďte grid-area: nazev. Oblasti musí být obdélníkové. Snadno přeuspořádat v media queries pro mobilní layout.

// Proč grid-areasMísto: grid-column: 1/3; grid-row: 1/2 na každém itemu — stačí napsat vizuální mapu. Kód je self-documenting. Přeuspořádat pro mobil = jen přepsat template-areas v media query, ne přepisovat všechny grid-column/row.
Pravidla
  • Každý řádek = uvozovkový string
  • . = prázdná buňka
  • Oblasti musí být obdélníkové (ne L-tvar)
  • Každé jméno musí pokrývat obdélníkovou oblast
Holy Grail layout — živá ukázka
header
nav
main
aside
footer
Příklad — Holy Grail layout
CSS
/* Holy Grail layout */
.page {
  display: grid;
  grid-template-areas:
    "header header  header"
    "nav    main    aside"
    "footer footer  footer";
  grid-template-columns: 200px 1fr 160px;
  grid-template-rows: auto 1fr auto;
  min-height: 100vh;
  gap: 0; /* nebo s mezerami */
}

/* Přiřazení oblastí */
header { grid-area: header; }
nav    { grid-area: nav; }
main   { grid-area: main; }
aside  { grid-area: aside; }
footer { grid-area: footer; }

/* Mobilní layout */
@media (max-width: 768px) {
  .page {
    grid-template-areas:
      "header"
      "main"
      "nav"
      "aside"
      "footer";
    grid-template-columns: 1fr;
  }
}

/* Prázdná buňka s tečkou */
.grid {
  grid-template-areas:
    "logo  .    nav"
    "main  main aside";
}
grid-column / grid-row

Umístění grid items

Čísla linek, span N nebo named lines. 1/-1 = celá šířka. grid-area jako shorthand.

ITEM

grid-column: start / end umístí item na konkrétní linky. span N = roztáhni přes N buněk. Záporné číslo = od konce (-1 = poslední linka). grid-column: 1 / -1 = celá šířka gridu bez ohledu na počet sloupců.

// grid-area shorthandgrid-area: row-start / col-start / row-end / col-end — zkratka pro obě vlastnosti najednou. Nebo grid-area: nazev pro pojmenované oblasti z grid-template-areas.
Syntaxe
auto číslo (linka) span N -1 (od konce) named-line
Živá ukázka
grid-column: 1 / -1 (celá šířka)
1 / -1 (celá šířka)
A
B
C
span — roztažení přes buňky
span 2
C
D
E
span 2
G
  • 1/-1 = celá šířka (bez počítání sloupců)
  • span 2 = přes 2 buňky od aktuální pozice
  • Záporné indexy od konce: -1 = poslední linka
  • grid-area zkratka: row-start / col-start / row-end / col-end
Příklady
CSS
/* Hero přes celou šířku */
.hero { grid-column: 1 / -1; }

/* Span — přes 2 sloupce */
.featured { grid-column: span 2; }

/* Konkrétní pozice */
.sidebar {
  grid-column: 1 / 2;
  grid-row: 1 / 3; /* přes 2 řádky */
}
.main { grid-column: 2 / -1; }

/* grid-area shorthand */
/* row-start / col-start / row-end / col-end */
.item { grid-area: 1 / 2 / 3 / 4; }

/* Named areas (z grid-template-areas) */
header { grid-area: header; }
main   { grid-area: main; }

/* Centrovat item v gridu */
.centered-item {
  justify-self: center;
  align-self: center;
}

/* Překrývání items */
.overlay {
  grid-column: 1 / -1;
  grid-row: 1 / -1;
  /* Překryje všechna ostatní items */
}
fr & minmax()

Fractional unit a rozsahy

fr = podíl zbývajícího prostoru. minmax(min, max) = sloupec s minimem a maximem. Základ responzivního gridu.

KONTEJNER

fr (fraction) je jednotka CSS Gridu. 1fr = jeden podíl z dostupného prostoru po odečtení pevných hodnot (px, %). minmax(min, max) definuje rozmezí velikosti stopy — minimální a maximální velikost. Kombinace auto-fill + minmax = automaticky responzivní grid.

// fr vs %1fr vs 50%: Obojí = polovina šířky u dvou sloupců. Rozdíl: fr se počítá ze zbývajícího prostoru PO odečtení pevných hodnot. 240px 1fr 1fr: sidebar má 240px, zbylý prostor se rozdělí na 2 fr. S procenty by se musel přepočítat gap.
minmax() hodnoty
minmax(px, 1fr) minmax(0, 1fr) minmax(auto, 1fr) minmax(100px, max-content)
Živá ukázka — fr poměry
1fr 2fr 1fr (poměr 1:2:1)
1fr
2fr (dvojnásobek)
1fr
80px 1fr 1fr (pevný + 2× fr)
80px
1fr
1fr
  • fr = zbývající prostor po px/auto
  • minmax(0, 1fr) zabrání overflow obsahu v cell
  • auto-fill vs auto-fit: fill zachová prázdné stopy
  • fit-content(200px) = max 200px, pak auto
Příklady
CSS
/* fr poměry */
.grid {
  grid-template-columns: 1fr 1fr 1fr;
  /* nebo: repeat(3, 1fr) */
}

/* Pevný sidebar + fr main */
.layout {
  grid-template-columns: 240px 1fr;
}

/* minmax: sloupec s minimem */
.grid {
  grid-template-columns:
    repeat(3, minmax(150px, 1fr));
  /* Min 150px, roste do 1fr */
}

/* ✅ Automatický responzivní grid */
.auto-grid {
  display: grid;
  grid-template-columns:
    repeat(auto-fill, minmax(250px, 1fr));
  gap: 1.5rem;
}

/* auto-fit: items se roztáhnou */
.auto-fit-grid {
  grid-template-columns:
    repeat(auto-fit, minmax(200px, 1fr));
}
/* 3 items v 800px: každý ~260px */
/* vs auto-fill: mohly by být prázdné sloupce */

/* minmax(0, 1fr) pro overflow fix */
.safe-grid {
  grid-template-columns:
    repeat(3, minmax(0, 1fr));
  /* Zabrání obsahu přetéct buňku */
}
repeat(auto-fill, minmax(200px, 1fr))
minmax(0, 1fr) pro overflow fix
gap (v Gridu)

Mezery v gridu

gap: row-gap column-gap. Stejné jako ve Flexboxu. Dříve grid-gap — název je změněn.

FLEX + GRID

gap přidá mezery mezi grid cells — ne na krajích. Shorthand: gap: row-gap column-gap. Jedna hodnota = stejné v obou směrech. Dříve se jmenovalo grid-gap — starý název stále funguje ale moderní je jen gap.

Hodnoty
px rem % gap: 2rem 1rem (row col)
Longhand
row-gap column-gap
  • gap = mezi cells, ne na okrajích
  • gap: 2rem 1rem = 2rem svisle, 1rem vodorovně
  • grid-gap je zastaralý název (ale stále funkční)
  • % gap je relativní k inline size kontejneru
Příklady
CSS
/* Stejné mezery */
.grid {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 1rem;
}

/* Různé mezery: svisle 2rem, vodorovně 1rem */
.grid {
  gap: 2rem 1rem;
  /* = row-gap: 2rem; column-gap: 1rem; */
}

/* Jen jeden směr */
.grid {
  row-gap: 2rem;    /* jen mezi řádky */
  column-gap: 1rem; /* jen mezi sloupci */
}

/* ❌ Zastaralý název (ale funkční) */
.grid { grid-gap: 1rem; }

/* ✅ Moderní */
.grid { gap: 1rem; }
// Praktické Grid vzory — copy-paste ready
CSS — nejčastější vzory
/* 1. Automaticky responzivní grid (nejčastější) */
.auto-grid {
  display: grid;
  grid-template-columns:
    repeat(auto-fill, minmax(250px, 1fr));
  gap: 1.5rem;
}

/* 2. Holy Grail layout (header/nav/main/aside/footer) */
.page {
  display: grid;
  grid-template-areas:
    "header header"
    "nav    main"
    "footer footer";
  grid-template-columns: 220px 1fr;
  grid-template-rows: auto 1fr auto;
  min-height: 100vh;
}
header { grid-area: header; }
nav    { grid-area: nav; }
main   { grid-area: main; }
footer { grid-area: footer; }

/* 3. Fotogalerie s různými velikostmi */
.gallery {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  grid-auto-rows: 200px;
  gap: 0.5rem;
}
.gallery .featured {
  grid-column: span 2;
  grid-row: span 2;
}

/* 4. Centrovat jeden item v gridu */
.container {
  display: grid;
  place-items: center; /* justify+align najednou */
  min-height: 100vh;
}

/* 5. Překrývající se items */
.overlap-grid {
  display: grid;
  grid-template-columns: 1fr;
}
.overlap-grid > * {
  grid-column: 1;
  grid-row: 1;
}
/* Všechny items jsou na sobě */

/* 6. Responzivní 2→3→4 sloupce */
.responsive {
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  gap: 1rem;
}
@media (min-width: 768px) {
  .responsive {
    grid-template-columns: repeat(3, 1fr);
  }
}
@media (min-width: 1024px) {
  .responsive {
    grid-template-columns: repeat(4, 1fr);
  }
}
← 02 Flexbox 03 / 10 — CSS Grid 04 Typografie →