Veronika Pavlíková PhD Student and Software Developer

CSS Grid Layout

Na dnešním cvičení se podíváme na tvorbu layoutu webové stránky pomocí CSS Gridu. Zopakujeme si tvorbu mřížky a její přizpůsobení a vyzkoušíme si, jak do ní elementy umístit.

CSS grid

CSS Grid je specifikace (sada vlasností), která umožňuje tvořit layout pomocí pravidelné, dvoudimenzionální mřížky. Tato mřížka se nazývá grid a je možné do ní umísťovat prvky. Element, který takto mřížkou rozdělíme, se nazývá grid kontejner. Ten je rozdělen na jednotlivé řádky a sloupce, které se skládají z buněk.

Vytvoření mřížky

Mřížku vytvoříme jednoduše: vybereme kontejner a nastavíme mu vlastnost display na hodnotu grid (případně inline-grid). Pro plnohodnotné vytvoření mřížky ale musíme specifikovat počet sloupců a řádků a také jejich velikost. Pro řádky uvádíme jejich výšku, pro sloupce jejich šířku. Příklad jednoduché mřížky následuje:

.box {
    display: grid;
    grid-template-rows: 100px 200px 100px;
    grid-template-columns: 200px 100px 200px;
}

Takto jsme vytvořili mřížku s přesně danou výškou řádku a šířkou sloupců. Tento přístup má ale tu nevýhodu, že layout je pevný a nereaguje na změnu velikosti obrazovky. Lepší flexibilitu získáme, pokud použijeme relativní jednotky, například %, kdy se šířka sloupců počítá z kontejneru, nebo fr, která rozdělí dostupný prostor mezi sloupce podle zadaných poměrů. Například místo pevného 100px 200px 100px můžeme použít 20% 60% 20% nebo 1fr 2fr 1fr, což zajistí, že mřížka zůstane proporčně správná i při změně šířky okna. Je ale potřeba myslet na to, že tyto jednotky jsou relativní – jejich výsledná velikost se odvíjí od velikosti rodičovského kontejneru a dostupného prostoru v mřížce.

Kromě uvedených jednotek můžeme použít i další hodnoty, například minmax(), min-content, max-content nebo auto. Ty umožňují přizpůsobit velikost řádků a sloupců podle obsahu nebo nastavit jejich minimální a maximální rozměry. Konkrétní řešení vždy závisí na tom, jaký obsah chceme do mřížky umístit a jakého výsledného rozložení chceme dosáhnout.

Při definování většího počtu řádků nebo sloupců by bylo nepraktické vypisovat stejnou hodnotu stále dokola. Proto můžeme použít funkci repeat(), která umožňuje určit, kolikrát se má určitý vzor v mřížce opakovat. Například zápis:

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

vytvoří čtyři stejně široké sloupce. Funkce repeat() navíc umožňuje používat speciální hodnoty auto-fill nebo auto-fit. Hodnota auto-fill automaticky vytvoří tolik sloupců, kolik se jich vejde do kontejneru při zachování zadané minimální velikosti. To se často kombinuje například s funkcí minmax(), takže mřížka může automaticky přidávat nebo ubírat sloupce podle dostupného prostoru. Díky tomu lze velmi snadno vytvořit flexibilní layouty, které se přizpůsobují velikosti obrazovky

Umístění prvků do mřížky

Nyní už umíme vytvořit mřížku. Pojďme si nyní ukázat, jak do mřížky umístit jednotlivé prvky.

Umístění prvků v CSS Gridu může probíhat automaticky nebo ručně. Pokud prvkům explicitně neřekneme, kam patří, prohlížeč je do mřížky umístí automaticky v pořadí, v jakém jsou napsány v HTML kódu. Postup je jednoduchý. Prohlížeč začne v levém horním rohu a postupně umisťuje prvky do řádku. Pokud už v řádku není volná buňka, pokračuje na další řádek.

Ne vždy ale chceme umístit prvky do mřížky v takto definovaném pořadí. Některé prvky mohou mít jinou šířku nebo začínat na rozdílných indexech. Tyto prvky musíme umístit ručně pomocí vlastností grid-column a grid-row, které nám říkají, do kterého sloupce nebo řádku chceme prvek vložit. Každou z těchto vlastností lze také "rozdělit" na dvě vlasnosti: grid-column-start a grid-column-end určují začátek a konec sloupce, zatímco grid-row-start a grid-row-end určují začátek a konec řádku. Tak lze přesně definovat, kde se prvek v mřížce objeví a kolik sloupců nebo řádků zabere. Například zápis grid-column: 1 / 3; znamená, že prvek začne na první čáře sloupců a skončí na třetí čáře, tedy zabírá dva sloupce.

Pojmenování oblastí

Aby se nám s mřížkou lépe pracovalo, protože si ne vždy pamatujeme čísla řádků a sloupců, můžeme jednotlivé části layoutu pojmenovat. Každá oblast může mít vlastní název, například header, sidebar, content nebo footer, a zápis rozložení pak připomíná vizuální náčrt stránky. Prvky do těchto oblastí přiřazujeme pomocí vlastnosti grid-area, která určuje, do které pojmenované oblasti mají patřit. Tento přístup je velmi užitečný pro složitější layouty, protože umožňuje rychle měnit rozložení, přesouvat prvky nebo upravovat mřížku, aniž bychom museli složitě počítat čáry – kód je tak čitelnější a lépe udržovatelný.

.box {
    display: grid;
    grid-template-rows: 100px 200px 200px 100px;
    grid-template-columns: 200px 100px 200px;
    grid-template-areas:
        "header header header"
        "main main aside"
        "main main aside"
        "footer footer footer"
}

Ve velmi podobném duchu lze pojmenovat i čáry pomocí hranatých závorek, například:

grid-template-columns: [start] 1fr [middle] 2fr [end];

To umožňuje odkazovat se na jednotlivé čáry pomocí jména a ne jejich indexů.

Na zopakování si zahrajeme jednoduchou hru na CSS Grid. Zkuste si udělat několik úrovní.

Odkaz na dobrovolné úkoly k dnešnímu cvičení.