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.

Rozdělení místa mezi prvky flexboxu

Na flexboxu je nejzajímavější, co se stane se zbylým místem v řádku uvnitř flexboxu. Nebo naopak s přebytečným místem, když se položky nevejdou a měly by z něho trčet ven (šířka všech prvků uvnitř je větší než šířka rodičovského kontejneru).

Chování se dá nastavit pomocí tří vlastnosti, které skoro vždy nastavujeme všechny najednou na položky flexboxu (prvky uvnitř flexboxu).

css
.card {
  /* smí se prvek zvětšovat do volného místa? */
  flex-grow: 1;

  /* smí se zmenšit, když se prvky nevejdou? */
  flex-shrink: 1;

  /*
  námi nastavená velikost, která se považuje za výchozí,
  pokud chceme jinou, než jaká je definovaná obsahem
  */
  flex-basis: 160px;
}

Prvky se do řádku nejprve poskládají za sebe ve velikosti nastavené ve flex-basis. Teprve pak se rozdělí přebytek volného místa (nebo dluh, když je řádek přeplněný) podle hodnot nastacených ve flex-grow a flex-shrink.

Dva řádky se třemi prvky. V horním mají prvky stejnou šířku podle flex-basis a vpravo zbývá volné místo, dvojšipka pod ním ukazuje, že ho je 140 px. V dolním prvky vyrostly: čárkovaná čára v každém boxu značí jeho původní okraj a dvojšipka pod ní ukazuje, kolik z těch 140 px přibylo – krajní prvky o 35 px, prostřední s hodnotou flex-grow 2 dvojnásobně, o 70 px.

Hodnota flex-grow: 2 neznamená dvojnásobnou šířku, ale dvojnásobný díl z toho, co zbylo. Kdyby volné místo nezbylo žádné, nezmění se vůbec nic.

flex-shrink funguje podobně, jen se aplikuje ve chvíli, kdy se všechny prvky do flexboxu nevejdou a je naopak potřeba je zmenšit. flex-shrink pak nastavuje, o kolik dílů z “dluhu” se prvek zmenší.

Pokud do flex-grow nebo flex-shrink nastavíme hodnotu 0, zakážeme prvku se zvětšovat nebo zmenšovat.

Zkrácený zápis

V praxi se všechny tři hodnoty píšou jednou vlastností flex.

css
.card {
  /* flex: grow shrink basis; */
  flex: 1 1 160px;
}

Často se můžete setkat i se zápisem pouze s jedním číslem.

css
.card {
  flex: 1;
}

Co se pod tou jedničkou skrývá a čím se liší od flex: auto?

Zápis Rozepsáno Chování
flex: 1 1 1 0 všechny prvky stejně široké, ať je v nich cokoli
flex: auto 1 1 auto prvek s delším textem dostane víc místa
flex: none 0 0 auto prvek si drží svou velikost a nehne se

Rozdíl dělá poslední hodnota, tedy flex-basis. U flex: 1 se do řádku nastupuje s nulovou šířkou, takže se rozdělí celá šířka řádku a obsah do toho nemá co mluvit. U flex: auto se nastupuje s šířkou obsahu a dělí se až to, co po něm zbylo.