Пусть сейчас у нас есть два флекс-блока,
выстроенных в ряд. Этим блокам задана ширина
в 100px
, а их родителю - 300px
:
<div class="parent">
<div class="child">1</div>
<div class="child">2</div>
</div>
.parent {
display: flex;
width: 300px;
height: 200px;
border: 1px solid red;
}
.child {
width: 100px;
height: 100px;
border: 1px solid green;
}
:
Как вы видите, суммарная ширина наших элементов меньше ширины родителя, поэтому справа остается пустое пространство.
При желании это пустое пространство можно
пропорционально разделить между нашими элементами.
Это делается с помощью свойства flex-grow
,
задаваемого флекс-элементам. Значением этого
свойства служит безразмерное число.
Давайте посмотрим на практике, как работает это свойство.
Пример
Сейчас у нас два флекс-блока с шириной в
100px
. Их суммарная ширина элементов
200px
, а ширина родителя - 300px
.
Получается, что остается свободное пространство
в 100px
.
Если элементам не задан flex-grow
,
то мы просто увидим это свободное пространство.
Если же он им задан, то реальная ширина элементов
будет больше заданной - они пропорционально
поделят свободное пространство между собой
и добавят его к своей ширине.
Пусть для примера у первого элемента flex-grow
равен 1
, а у второго - 3
. Давайте
вычислим, какую часть свободного пространства
получит каждый элемент.
Для начала нужно получить суммарное количество
единиц flex-grow
всех наших элементов.
У первого элемента он равен 1
, а в
у второго - 3
. Это значит, что в сумме
он равен 4
.
Поделим теперь 100px
свободного пространства
на 4
и получим, что 25px
приходится
на одну единицу flex-grow
. Получится,
что к первому элементу добавится одна единица
flex-grow
, то есть 25px
, а
ко второму - три единицы, то есть 75px
.
Ширина первого элемента получится 125px
,
а второго - 175px
:
<div class="parent">
<div class="child elem1">1</div>
<div class="child elem2">2</div>
</div>
.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;
}
:
Пример
Пусть теперь ширина родителя равна 400px
,
ширина первого элемента 200px
, а ширина
второго элемента - 100px
. Получится,
что свободное пространство опять равно 100px
.
Давайте каждому элементу зададим flex-grow
,
равный 1
. В сумме получится 2
,
то есть 100px
свободного пространства
нужно разделить на 2
. Получится, что
50px
приходится на одну единицу жадности.
Так как у всех элементов одинаковое значение
flex-grow
, то ко всем элементам добавится
одинаковое значение в 50px
. Это значит,
что первый элемент станет 250px
, и
а второй станет 150px
:
<div class="parent">
<div class="child elem1">1</div>
<div class="child elem2">2</div>
</div>
.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;
}
:
Пример
Пусть опять ширина родителя равна 400px
,
ширина первого элемента 200px
, а ширина
второго элемента - 100px
.
Давайте теперь первому элементу установим
flex-grow
в значение 3
, а второму
- в значении 1
. Получится, что жадность
в сумме равна 4
. Тогда одна единица
жадности равна
.
100px
/ 4
= 25px
К первому элементу добавится 75px
,
и он станет 275px
, а ко второму -
25px
, он станет 125px
:
<div class="parent">
<div class="child elem1">1</div>
<div class="child elem2">2</div>
</div>
.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;
}
:
Практические задачи
Во всех задачах ниже вам будет представлен
некоторый код с флекс-элементами, имеющими
ширину и flex-grow
. По представленному
коду рассчитайте, какие размеры будет иметь
каждый из элементов. Затем запустите код
и проверьте ваши расчеты, измерив реальные
ширины элементов.
<div class="parent">
<div class="child elem1">1</div>
<div class="child elem2">2</div>
<div class="child elem3">3</div>
</div>
.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;
}
<div class="parent">
<div class="child elem1">1</div>
<div class="child elem2">2</div>
<div class="child elem3">3</div>
</div>
.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;
}
<div class="parent">
<div class="child elem1">1</div>
<div class="child elem2">2</div>
<div class="child elem3">3</div>
</div>
.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;
}
<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>
.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;
}