Lekce 1.2

Flexbox a responzivní vzory

Jak si prvky dělí místo v řádku, kdy sáhnout po mřížce a jak psát velikosti tak, aby se stránka přizpůsobila sama.

Zarovnání a zalomení

Kolem zarovnání ve Flexboxu bývá zmatek a má jednu příčinu: zarovnává se podél tzv. hlavní a vedlejší osy. Neříkáme tedy vodorovně nebo svisle.

Hlavní osa ve flexboxu ve výchozím stavu vede vodorovně zleva doprava. To platí v našem západním světě. Jiné jazyky mohou mít jiné konvence a hlavní osa může směřovat jinak.

Vedlejší osa standardně směřuje shora dolů (opět: u nás, jinde to může být jinak).

Už víme, že směr hlavní osy můžeme ve flexboxu změnit pomocí flex-direction. Vedlejší osa je vždy kolmá na hlavní osu.

Zarovnávání položek ve flexboxu řídí dvě vlastnosti:

  • justify-content ve směru hlavní osy
  • align-items ve směru vedlejší osy
css
.nav {
  display: flex;
  gap: 12px;

  /*
  zarovnání podél hlavní osy
  ve výchozím stavu vodorovně
  */
  justify-content: space-between;

  /*
  zarovnání podél vedlejší osy
  ve výchozím stavu svisle
  */
  align-items: center;
}

Dokud je směr row, je hlavní osa vodorovná a všechno sedí, jak čekáme. Jakmile se přepne na column, obě vlastnosti si role prohodí – justify-content najednou řeší svislé rozmístění a align-items vodorovné.

Dokumentace

Obě vlastnosti mají víc hodnot, než kolik jich stihneme probrat – třeba space-around nebo stretch. Kompletní seznam s interaktivní ukázkou u každé hodnoty najdete v dokumentaci MDN: justify-content a align-items.

Zalomení ve flexboxu

Pokud se prvky do flexboxu nevejdou, můžeme pomocí vlastnosti flex-wrap nastavit, že se mají zalomit na další řádek.

css
.tags {
  display: flex;
  gap: 8px;

  /* zalomení */
  flex-wrap: wrap;
}

Mohlo by to vypadat, že jsme najednou z flexboxu vyrobili grid - má řádky a v nich “sloupce”, ale není to tak. Každý zalomený řádek si o šířce prvků rozhoduje sám, takže prvky na druhém řádku mohou mít úplně jiné šířky, než prvky na prvním řádku. Prvky pod sebou nelícují (mohou, ale nemusí). V gridu prvky dodržují nastavené sloupce a přesně zapadají pod sebe.

Vlevo Flexbox: dva řádky prvků různých šířek, které pod sebou nelícují, s jednou šipkou podél řádku. Vpravo Grid: prvky zarovnané do tří společných sloupců, se šipkou vodorovnou i svislou.

Kdy grid a kdy flexbox

Když mají prvky dodržovat nastavené rozložení sloupců, volíme grid. Když mohou být různě široké a nemohou dodržovat přesnou mřížku, volíme flexbox.

Situace Nástroj
Rozvržení celé stránky Grid
Galerie, kde karty lícují do sloupců Grid
Prvek přes dva sloupce Grid
Navigace, řádek tlačítek Flexbox
Obsah karty pod sebou Flexbox
Štítky, které se zalomí do dalšího řádku Flexbox

V praxi se v rámci jedné stránky setkáme s oběma a je to úplně v pořádku: např. mřížka drží rozvržení stránky, Flexbox obsah uvnitř jednotlivých karet.

Bonus

Vlastnost align-items má sourozence align-self, kterým se dá konkrétní prvek zarovnat jinak než zbytek řádku. Např. můžeme mít všechny prvky ve flexboxu zarovnané k horní hraně, ale jeden prvek v řadě zarovnat na střed nebo ke spodní hraně.