Lekce 1.1

CSS Grid do hloubky

Linie a souřadnice v mřížce, rozvržení nakreslené jmény oblastí, řádky, které dokreslí prohlížeč, a galerie, jež se přizpůsobí sama.

Kontejner a jeho položky

Mřížka vždycky vzniká na jednom prvku a platí pro to, co je uvnitř něj. Ukažme si to na programu kina – šest filmů, které chceme rozmístit do tří sloupců a dvou řádků.

html
<section class="schedule">
  <article class="movie">Vetřelec</article>
  <article class="movie">Sedm samurajů</article>
  <article class="movie">Kmotr</article>
  <article class="movie">Rašomon</article>
  <article class="movie">Metropolis</article>
  <article class="movie">Casablanca</article>
</section>
css
.schedule {
  display: grid;
  grid-template-columns: 1fr 1fr 1fr;
  grid-template-rows: 200px 200px;
  gap: 16px;
}

Tři hodnoty v grid-template-columns znamenají tři sloupce, dvě hodnoty v grid-template-rows dva řádky. Filmy se do vzniklých šesti míst posadí samy v tom pořadí, v jakém stojí v HTML – zleva doprava, pak o řádek níž.

Rodič a potomci

Prvek, na kterém jsme mřížku zapnuli, je rodičovský prvek; v gridu se mu říká kontejner (grid container). Prvky uvnitř něj jsou jeho potomci (children) a mřížka z nich dělá položky gridu (grid items). Mezi sebou jsou to sourozenci (siblings) a právě ti se v mřížce rozmisťují.

Položkami se stanou jen přímí potomci. Kdyby byl uvnitř každého článku ještě nadpis a odstavec, mřížka o nich neví – ta pracuje s články, ne s jejich vnitřkem. Odtud plyne obvyklý postup: rozvržení stránky děláme jednou mřížkou, a co je uvnitř jednotlivých položek, řešíme zvlášť.

Co patří rodiči a co potomkovi

Vlastnosti gridu se dělí na dvě skupiny a plete se to jen do chvíle, než si uvědomíme, o čem která mluví. Rodič popisuje, jak mřížka vypadá:

Vlastnost rodiče Co dělá
display: grid zapne mřížku
grid-template-columns kolik je sloupců a jak jsou široké
grid-template-rows kolik je řádků a jak jsou vysoké
grid-template-areas rozvržení nakreslené jmény oblastí
gap mezery mezi řádky i mezi sloupci

Potomek o mřížce nerozhoduje. Řekne si jen, kde v ní sedí:

Vlastnost potomka Co dělá
grid-column odkud kam položka sahá vodorovně
grid-row odkud kam položka sahá svisle
grid-area do které oblasti se položka posadí

Vlastnost napsaná na špatné straně je nejčastější důvod, proč se „nic nestalo“. grid-column na kontejneru neudělá vůbec nic a grid-template-columns na položce taky ne – pokud tedy z položky sami neuděláme další mřížku.

Jednotka fr a funkce repeat()

Jednotka fr je zkratka z fraction, tedy díl dostupného místa. Prohlížeč nejdřív odečte mezery a pevné šířky, a co zbude, rozdělí mezi fr sloupce. Tři sloupce po 1fr si tedy dostupné místo rozdělí na třetiny.

Opakující se hodnoty umí zkrátit funkce repeat():

css
.schedule {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  grid-template-rows: repeat(2, 200px);
  gap: 16px;
}

Obojí zapisuje přesně tutéž mřížku. repeat() se vyplatí od tří dráh výš a u galerií bez ní prakticky nehneme – uvidíme proč, až si necháme počet sloupců spočítat prohlížečem.

Pozor

1fr a 33.33 % nejsou totéž. Procenta se počítají z celé šířky rodiče a mezery z gap se do nich nevejdou, takže tři sloupce po 33.33 % s mezerami přetečou. 1fr počítá až s dostupným místem, tedy s tím, co po mezerách zůstalo.

Slovník mřížky

Zbytek lekce se o části mřížky opírá jménem, takže si je pojmenujme rovnou. Anglické názvy uvádíme proto, že přesně takhle jsou pojmenované ve vývojářských nástrojích i v dokumentaci:

Česky Anglicky Co to je
kontejner grid container rodičovský prvek s display: grid
položka gridu grid item přímý potomek kontejneru
dráha track celý sloupec nebo celý řádek mřížky
linie grid line čára mezi dráhami a po obou krajích mřížky
buňka grid cell průsečík jedné sloupcové a jedné řádkové dráhy
oblast grid area obdélník přes jednu nebo víc buněk

grid-template-rows v ukázce psát nemusíme – řádky si prohlížeč umí dokreslit sám. Napsali jsme je schválně, ať je vidět, že mřížka opravdu vzniká ve dvou rozměrech. Co se stane, když je vynecháme, si ukážeme v kapitole o implicitní mřížce.