Žravost flex elementů v CSS

Předpokládejme, že nyní máme dva flex bloky, seřazené v řadě. Těmto blokům je nastavena šířka na 100px a jejich rodiči - 300px:

html<div class="parent">
  <div class="child">1</div>
  <div class="child">2</div>
</div>
css.parent {
  display: flex;
  width: 300px;
  height: 200px;
  border: 1px solid red;
}
.child {
  width: 100px;
  height: 100px;
  border: 1px solid green;
}

Результат:

Jak vidíte, celková šířka našich prvků je menší než šířka rodiče, takže vpravo zůstává volný prostor.

V případě potřeby lze tento volný prostor poměrně rozdělit mezi naše prvky. To se provádí pomocí vlastnosti flex-grow, nastavené flex prvkům. Hodnotou této vlastnosti je bezrozměrné číslo.

Podívejme se v praxi, jak tato vlastnost funguje.

Příklad

Nyní máme dva flex bloky s šířkou 100px. Jejich celková šířka prvků je 200px a šířka rodiče je 300px. To znamená, že zbývá volný prostor 100px.

Pokud prvkům není nastaven flex-grow, jednoduše uvidíme tento volný prostor. Pokud je nastaven, pak skutečná šířka prvků bude větší než nastavená - poměrně si rozdělí volný prostor mezi sebou a přidají jej ke své šířce.

Pro příklad nastavme prvnímu prvku flex-grow hodnotu 1 a druhému - 3. Pojďme vypočítat, jakou část volného prostoru získá každý prvek.

Nejprve je potřeba získat celkový počet jednotek flex-grow všech našich prvků. U prvního prvku je hodnota 1 a u druhého - 3. To znamená, že součet je 4.

Nyní vydělme 100px volného prostoru 4 a dostaneme, že 25px připadá na jednu jednotku flex-grow. Vyplývá z toho, že k prvnímu prvku přibude jedna jednotka flex-grow, tedy 25px, a ke druhému - tři jednotky, tedy 75px.

Šířka prvního prvku bude 125px, a druhého - 175px:

html<div class="parent">
  <div class="child elem1">1</div>
  <div class="child elem2">2</div>
</div>
css.parent {
  display: flex;
  width: 300px;
  height: 200px;
  border: 1px solid red;
}
.child {
  height: 50px;
  border: 1px solid green;
}
.elem1 {
  width: 100px;
  flex-grow: 1;
}
.elem2 {
  width: 100px;
  flex-grow: 3;
}

Результат:

Příklad

Nyní předpokládejme, že šířka rodiče je 400px, šířka prvního prvku 200px a šířka druhého prvku - 100px. Vyplývá z toho, že volný prostor je opět 100px.

Nastavme každému prvku flex-grow, hodnotu 1. Součet bude 2, to znamená, že 100px volného prostoru je třeba rozdělit na 2. Vyplývá z toho, že 50px připadá na jednu jednotku žravosti.

Protože všechny prvky mají stejnou hodnotu flex-grow, pak ke všem prvkům přibude stejná hodnota 50px. To znamená, že první prvek bude 250px, a druhý prvek bude 150px:

html<div class="parent">
  <div class="child elem1">1</div>
  <div class="child elem2">2</div>
</div>
css.parent {
  display: flex;
  width: 400px;
  height: 200px;
  border: 1px solid red;
}
.child {
  height: 50px;
  border: 1px solid green;
}
.elem1 {
  width: 200px;
  flex-grow: 1;
}
.elem2 {
  width: 100px;
  flex-grow: 1;
}

Результат:

Příklad

Předpokládejme opět, že šířka rodiče je 400px, šířka prvního prvku 200px a šířka druhého prvku - 100px.

Nyní nastavme prvnímu prvku flex-grow na hodnotu 3 a druhému - na hodnotu 1. Vyplývá z toho, že žravost v součtu je 4. Pak jedna jednotka žravosti se rovná 100px / 4 = 25px.

K prvnímu prvku přibude 75px, a bude 275px, a ke druhému - 25px, bude 125px:

html<div class="parent">
  <div class="child elem1">1</div>
  <div class="child elem2">2</div>
</div>
css.parent {
  display: flex;
  width: 400px;
  height: 200px;
  border: 1px solid red;
}
.child {
  height: 50px;
  border: 1px solid green;
}
.elem1 {
  width: 200px;
  flex-grow: 3;
}
.elem2 {
  width: 100px;
  flex-grow: 1;
}

Результат:

Praktické úlohy

Ve všech níže uvedených úlohách vám bude představen nějaký kód s flex prvky, které mají šířku a flex-grow. Podle představeného kódu vypočítejte, jaké rozměry bude mít každý z prvků. Poté kód spusťte a ověřte své výpočty změřením skutečných šířek prvků.

Задание 1
html<div class="parent">
  <div class="child elem1">1</div>
  <div class="child elem2">2</div>
  <div class="child elem3">3</div>
</div>
css.parent {
  display: flex;
  width: 500px;
  height: 200px;
  border: 1px solid red;
}
.child {
  height: 50px;
  border: 1px solid green;
}
.elem1 {
  width: 200px;
  flex-grow: 3;
}
.elem2 {
  width: 100px;
  flex-grow: 1;
}
.elem3 {
  width: 100px;
  flex-grow: 1;
}
Задание 2
html<div class="parent">
  <div class="child elem1">1</div>
  <div class="child elem2">2</div>
  <div class="child elem3">3</div>
</div>
css.parent {
  display: flex;
  width: 700px;
  height: 200px;
  border: 1px solid red;
}
.child {
  height: 50px;
  border: 1px solid green;
}
.elem1 {
  width: 100px;
  flex-grow: 1;
}
.elem2 {
  width: 100px;
  flex-grow: 2;
}
.elem3 {
  width: 200px;
  flex-grow: 3;
}
Задание 3
html<div class="parent">
  <div class="child elem1">1</div>
  <div class="child elem2">2</div>
  <div class="child elem3">3</div>
</div>
css.parent {
  display: flex;
  width: 500px;
  height: 200px;
  border: 1px solid red;
}
.child {
  height: 50px;
  border: 1px solid green;
}
.elem1 {
  width: 100px;
  flex-grow: 1;
}
.elem2 {
  width: 100px;
  flex-grow: 1;
}
.elem3 {
  width: 100px;
  flex-grow: 1;
}
Задание 4
html<div class="parent">
  <div class="child elem1">1</div>
  <div class="child elem2">2</div>
  <div class="child elem3">3</div>
  <div class="child elem4">4</div>
</div>
css.parent {
  display: flex;
  width: 1000px;
  height: 200px;
  border: 1px solid red;
}
.child {
  height: 50px;
  border: 1px solid green;
}
.elem1 {
  width: 200px;
  flex-grow: 1;
}
.elem2 {
  width: 100px;
  flex-grow: 2;
}
.elem3 {
  width: 100px;
  flex-grow: 4;
}
.elem4 {
  width: 100px;
  flex-grow: 3;
}