0 added
0 removed
Original
2026-01-01
Modified
2026-02-26
1
<p>В прошлых уроках мы рассмотрели работу с флекс-контейнерами. Помимо этого у флекс-элементов, которые лежат внутри контейнера, также существует множество различных правил. В данном уроке мы рассмотрим правила flex-grow, которые позволяют управлять гибкостью элементов, то есть динамически определять их ширину/высоту в зависимости от наших потребностей.</p>
1
<p>В прошлых уроках мы рассмотрели работу с флекс-контейнерами. Помимо этого у флекс-элементов, которые лежат внутри контейнера, также существует множество различных правил. В данном уроке мы рассмотрим правила flex-grow, которые позволяют управлять гибкостью элементов, то есть динамически определять их ширину/высоту в зависимости от наших потребностей.</p>
2
<p>В качестве примера мы возьмем три блока, расположенные во флекс-контейнере. Все примеры также будут сделаны в<em>CodePen</em>, поэтому обязательно меняйте в них значения и смотрите, к каким результатам это приведет.</p>
2
<p>В качестве примера мы возьмем три блока, расположенные во флекс-контейнере. Все примеры также будут сделаны в<em>CodePen</em>, поэтому обязательно меняйте в них значения и смотрите, к каким результатам это приведет.</p>
3
<p><a>https://codepen.io/hexlet/pen/dyyOERb</a></p>
3
<p><a>https://codepen.io/hexlet/pen/dyyOERb</a></p>
4
<p>Свойство flex-grow (от англ. flex grow factor - "коэффициент увеличения flex") позволяет указать коэффициент увеличения элемента относительно свободного пространства внутри флекс-контейнера. Свободным пространством считается разница между размером флекс-контейнера и размером всех элементов внутри. Это важно, так как во многих источниках указано, что свойство flex-grow увеличивает размер элемента относительно других элементов контейнера.</p>
4
<p>Свойство flex-grow (от англ. flex grow factor - "коэффициент увеличения flex") позволяет указать коэффициент увеличения элемента относительно свободного пространства внутри флекс-контейнера. Свободным пространством считается разница между размером флекс-контейнера и размером всех элементов внутри. Это важно, так как во многих источниках указано, что свойство flex-grow увеличивает размер элемента относительно других элементов контейнера.</p>
5
<p>Свойство flex-grow может принимать любое<em>неотрицательное</em>значение. Чтобы понять, что означает увеличение относительно свободного пространства, установим всем блокам одинаковое значение свойства flex-grow:</p>
5
<p>Свойство flex-grow может принимать любое<em>неотрицательное</em>значение. Чтобы понять, что означает увеличение относительно свободного пространства, установим всем блокам одинаковое значение свойства flex-grow:</p>
6
<p><a>https://codepen.io/hexlet/pen/rNNWgGq</a></p>
6
<p><a>https://codepen.io/hexlet/pen/rNNWgGq</a></p>
7
<p>Может сложиться ощущение, что такое значение равномерно распределит место внутри флекс-контейнера. И в почти пустых блоках это действительно так, но давайте добавим текст в один из блоков и посмотрим, как сработает flex-grow в таком случае:</p>
7
<p>Может сложиться ощущение, что такое значение равномерно распределит место внутри флекс-контейнера. И в почти пустых блоках это действительно так, но давайте добавим текст в один из блоков и посмотрим, как сработает flex-grow в таком случае:</p>
8
<p><a>https://codepen.io/hexlet/pen/BaaQgjY</a></p>
8
<p><a>https://codepen.io/hexlet/pen/BaaQgjY</a></p>
9
<p>Теперь блоки совсем неодинаковой ширины. Это демонстрирует, что flex-grow распределяет только свободное пространство, которое остается после того, как блоки получат всю необходимую им ширину в зависимости от контента внутри. На самом деле все значения flex-grow в данном случае не нужны, так как блоки внутри контейнера уже займут всю доступную ширину. Попробуем добавить чуть больше контента в центральный блок и выставим ему различные значения:</p>
9
<p>Теперь блоки совсем неодинаковой ширины. Это демонстрирует, что flex-grow распределяет только свободное пространство, которое остается после того, как блоки получат всю необходимую им ширину в зависимости от контента внутри. На самом деле все значения flex-grow в данном случае не нужны, так как блоки внутри контейнера уже займут всю доступную ширину. Попробуем добавить чуть больше контента в центральный блок и выставим ему различные значения:</p>
10
<p><a>https://codepen.io/hexlet/pen/OJJbemZ</a></p>
10
<p><a>https://codepen.io/hexlet/pen/OJJbemZ</a></p>
11
<h2>Пример 0</h2>
11
<h2>Пример 0</h2>
12
<p>У контейнера выставлена ширина в<em>700</em>пикселей. Это сделано для того, чтобы мы могли вычислить, как работает свойство flex-grow. Центральный блок имеет ширину<em>300</em>пикселей, а крайние блоки имеют ширину<em>100</em>пикселей. Свободное пространство обозначено серым цветом и равно<em>200</em>пикселям.</p>
12
<p>У контейнера выставлена ширина в<em>700</em>пикселей. Это сделано для того, чтобы мы могли вычислить, как работает свойство flex-grow. Центральный блок имеет ширину<em>300</em>пикселей, а крайние блоки имеют ширину<em>100</em>пикселей. Свободное пространство обозначено серым цветом и равно<em>200</em>пикселям.</p>
13
<h2>Пример 1</h2>
13
<h2>Пример 1</h2>
14
<p>Добавив свойство flex-grow второму элементу, мы скажем растянуться центральному блоку на всю доступную ему ширину. Так как свободного пространства у нас 200 пикселей, то центральный блок заберет их себе, и ширина центрального блока станет<em>500</em>пикселей.</p>
14
<p>Добавив свойство flex-grow второму элементу, мы скажем растянуться центральному блоку на всю доступную ему ширину. Так как свободного пространства у нас 200 пикселей, то центральный блок заберет их себе, и ширина центрального блока станет<em>500</em>пикселей.</p>
15
<h2>Пример 2</h2>
15
<h2>Пример 2</h2>
16
<p>Оставим у центрального блока значение flex-grow: 1, а первому элементу внутри контейнера выставим значение flex-grow: 2. Попробуйте догадаться, как распределится место? Чтобы понять этот процесс, нужно взять общее количество частей, которое мы указали во flex-grow. Таких частей получилось три (<em>flex-grow: 1 + flex-grow: 2</em>).</p>
16
<p>Оставим у центрального блока значение flex-grow: 1, а первому элементу внутри контейнера выставим значение flex-grow: 2. Попробуйте догадаться, как распределится место? Чтобы понять этот процесс, нужно взять общее количество частей, которое мы указали во flex-grow. Таких частей получилось три (<em>flex-grow: 1 + flex-grow: 2</em>).</p>
17
<p>Высчитаем, чему будет равняться одна часть, если мы знаем, что свободного пространства у нас 200 пикселей:</p>
17
<p>Высчитаем, чему будет равняться одна часть, если мы знаем, что свободного пространства у нас 200 пикселей:</p>
18
<p>flex-grow: 1 =<em>200 / 3</em>=<em>66.67</em>.</p>
18
<p>flex-grow: 1 =<em>200 / 3</em>=<em>66.67</em>.</p>
19
<p>Исходя из этого, можно высчитать, сколько пикселей будет прибавлено каждому блоку со свойством flex-grow:</p>
19
<p>Исходя из этого, можно высчитать, сколько пикселей будет прибавлено каждому блоку со свойством flex-grow:</p>
20
<ul><li>Центральный блок к своей ширине получит еще<em>66.67</em>пикселей</li>
20
<ul><li>Центральный блок к своей ширине получит еще<em>66.67</em>пикселей</li>
21
<li>Первый блок внутри контейнера получит дополнительно<em>133.34</em>пикселя к своей ширине.</li>
21
<li>Первый блок внутри контейнера получит дополнительно<em>133.34</em>пикселя к своей ширине.</li>
22
</ul><p>Важно, что flex-grow только<em>добавляет</em>к ширине элемента, но не отбирает. Если свободного пространства внутри контейнера нет, то свойство flex-grow не будет иметь видимых эффектов.</p>
22
</ul><p>Важно, что flex-grow только<em>добавляет</em>к ширине элемента, но не отбирает. Если свободного пространства внутри контейнера нет, то свойство flex-grow не будет иметь видимых эффектов.</p>
23
<p>Обратите внимание, что при flex-direction: column; свойство flex-grow влияет на высоту элемента. То есть flex-grow увеличивает элемент по главной оси.</p>
23
<p>Обратите внимание, что при flex-direction: column; свойство flex-grow влияет на высоту элемента. То есть flex-grow увеличивает элемент по главной оси.</p>
24
<h2>Документация</h2>
24
<h2>Документация</h2>
25
<ul><li><a>flex-grow</a></li>
25
<ul><li><a>flex-grow</a></li>
26
<li><a>!important</a></li>
26
<li><a>!important</a></li>
27
</ul>
27
</ul>