flex-grow: расширение
flex-growзадаёт коэффициент роста flex-элемента: какую долю свободного пространства контейнера он должен занять сверх своего базового размера.
Зачем нужно
По умолчанию flex-элементы занимают ровно столько места, сколько требует их содержимое, а свободное пространство остаётся пустым. flex-grow позволяет "раздать" это пространство элементам пропорционально их коэффициентам. Это основа для равных колонок, гибкого контента и раскладок вида "сайдбар + основной блок".
Где используется
- Равные колонки:
flex-grow: 1у всех - Главный блок занимает всё оставшееся пространство
- Поле ввода в форме вытягивается, кнопка остаётся фиксированной
Синтаксис и значения
.item {
flex-grow: 0; /* по умолчанию — не растёт */
flex-grow: 1; /* занимает долю свободного пространства */
flex-grow: 2; /* занимает вдвое больше, чем элемент с flex-grow: 1 */
}
Примеры
Элемент заполняет оставшееся пространство
.search-bar {
display: flex;
gap: 8px;
}
.search-bar input {
flex-grow: 1; /* растёт, занимает всё свободное место */
}
.search-bar button {
flex-grow: 0; /* фиксированный размер по контенту */
}
<div class="search-bar">
<input type="text" placeholder="Поиск...">
<button>Найти</button>
</div>
Пропорциональное распределение
.container {
display: flex;
width: 600px; /* пусть базовый размер всех элементов = 0 */
}
.item-a { flex: 1; } /* получит 200px (1/3 от 600px) */
.item-b { flex: 2; } /* получит 400px (2/3 от 600px) */
Равные колонки
.columns {
display: flex;
gap: 16px;
}
.columns > * {
flex-grow: 1; /* или просто flex: 1 */
}
<div class="columns">
<div>Колонка 1</div>
<div>Колонка 2</div>
<div>Колонка 3</div>
</div>
Сайдбар + основной контент
.layout {
display: flex;
}
.sidebar {
flex: 0 0 250px; /* grow=0, фиксированный */
}
.content {
flex-grow: 1; /* занимает остаток */
}
Как вычисляется рост
Свободное пространство = ширина контейнера − сумма flex-basis всех элементов. Прирост элемента = свободное пространство × (его flex-grow / сумма всех flex-grow).
Частые ошибки
flex-grow: 1не даёт равных размеров приflex-basis: auto— если у элементов разный контент, они получат разный итоговый размер. Для истинно равных — нуженflex: 1(basis=0%)flex-growприменён к контейнеру — работает только на flex-элементах- Ожидание роста без свободного пространства — если контейнер не шире суммы элементов, расти некуда
Связанные темы
- flex-shrink -- сжатие
- flex-basis -- базовый размер
- flex -- сокращённое свойство
- flex-grow -- расширение
- _MOC Flexbox