Свойство
flex
Задаёт, как флекс-элемент делит свободное место с соседями — растёт, сжимается и с какого размера начинает.
Пример
Боковая колонка фиксированной ширины, основная забирает всё остальное:
<div class="layout">
<aside class="layout__side">Меню</aside>
<main class="layout__main">Основное содержимое</main>
</div>.layout {
display: flex;
gap: 1rem;
}
.layout__side {
flex: 0 0 8rem;
padding: 1rem;
background: #eef;
}
.layout__main {
flex: 1;
padding: 1rem;
border: 1px solid;
}Результат
Синтаксис
flex: none | [ <'flex-grow'> <'flex-shrink'>? || <'flex-basis'> ];- Начальное значение
- 0 1 auto
- Применяется к
- флекс-элементам
- Наследуется
- нет
- Анимируется
- как у отдельных свойств flex-grow, flex-shrink и flex-basis
- Вычисляемое значение
- как у отдельных свойств
flex — сокращение для трёх свойств, в этом порядке:
flex-grow— во сколько раз элемент растёт, когда есть свободное место;flex-shrink— во сколько раз сжимается, когда места не хватает;flex-basis— размер, от которого элемент начинает расти или сжиматься.
Значения
initial(0 1 auto)- Не растёт, может сжиматься, стартовый размер — по
widthили содержимому. Так ведут себя флекс-элементы по умолчанию. auto(1 1 auto)- Растёт и сжимается от своего естественного размера. Крупное содержимое получает больше места.
none(0 0 auto)- Не растёт и не сжимается — жёсткий размер.
- Одно число, например
1(1 1 0%) - Растёт с коэффициентом 1 от нулевого стартового размера: свободное место делится пропорционально числам, независимо от содержимого.
flex: 2получит вдвое больше, чемflex: 1. - Три значения, например
0 0 12rem - Полная запись: рост, сжатие и стартовый размер.
Как понять
Флекс-контейнер сначала ставит элементы по их стартовым размерам (flex-basis). Потом смотрит, сколько места осталось. Если осталось свободное место, оно раздаётся тем, у кого flex-grow больше нуля, пропорционально коэффициентам. Если места не хватило, недостачу забирают у элементов пропорционально flex-shrink (с учётом их размера).
Главное различие — flex: 1 и flex: auto. С flex: 1 колонки получаются одинаковыми, потому что стартуют с нуля. С flex: auto колонка с длинным текстом будет шире, потому что стартует со своего содержимого.
Примеры
Равные колонки
<div class="row">
<div>Коротко</div>
<div>Здесь гораздо более длинный текст</div>
<div>Средне</div>
</div>.row {
display: flex;
gap: 0.5rem;
}
.row div {
flex: 1;
padding: 0.5rem;
border: 1px solid;
}Результат
Колонки по содержимому
Та же разметка с flex: auto — длинный текст забирает больше места:
<div class="row">
<div>Коротко</div>
<div>Здесь гораздо более длинный текст</div>
<div>Средне</div>
</div>.row {
display: flex;
gap: 0.5rem;
}
.row div {
flex: auto;
padding: 0.5rem;
border: 1px solid;
}Результат
Карточки с переносом
flex: 1 1 12rem и flex-wrap: wrap: карточки не уже 12rem, лишние переносятся на новую строку и растягиваются:
<ul class="cards">
<li>Один</li>
<li>Два</li>
<li>Три</li>
<li>Четыре</li>
<li>Пять</li>
</ul>.cards {
display: flex;
flex-wrap: wrap;
gap: 0.5rem;
padding: 0;
list-style: none;
}
.cards li {
flex: 1 1 12rem;
padding: 1rem;
border: 1px solid;
}Результат
Подсказки
flexдействует только на прямых детей флекс-контейнера. У обычного блока свойство ничего не делает.- Флекс-элемент по умолчанию не сжимается уже своего самого длинного слова (
min-width: auto). Если длинная строка ломает раскладку, добавьте элементуmin-width: 0. - Лучше писать сокращение
flex, а не отдельные свойства: оно выставляет разумные значения для всех трёх сразу. - Для раскладки в две оси — строки и колонки одновременно — удобнее сетка (
display: grid).
Поддержка браузерами
| Возможность | Chrome | Edge | Firefox | Safari | Chrome Android | Safari iOS | Samsung Internet | Opera |
|---|---|---|---|---|---|---|---|---|
| flex | 29 1 | 12 2 | 22 3 4 5 6 | 9 7 | 29 8 | 9 9 | 2.0 10 | 12.1 |
| auto | 21 | 12 | 22 | 7 | 25 | 7 | 1.5 | 15 |
| content | 94 | 94 | 61 | 15 | 94 | 15 | 17.0 | 80 |
| fit-content | 94 | 94 | 94 | 16 | 94 | 16 | 17.0 | 80 |
| max-content | 94 | 94 | 66 | 16 | 94 | 16 | 17.0 | 80 |
| min-content | 94 | 94 | 66 | 16 | 94 | 16 | 17.0 | 80 |
| none | 21 | 12 | 22 | 7 | 25 | 7 | 1.5 | 15 |
| stretch | 138 | 138 | нет | 27 | 138 | 27 | 30.0 | 122 |
Примечания
- Chrome: С префиксом -webkit- — с версии 21.
- Edge: С префиксом -webkit- — с версии 12.
- Firefox: С префиксом -webkit- — с версии 49.
- Firefox: С Firefox 28 поддерживаются многострочные флекс-контейнеры.
- Firefox: До Firefox 32 браузер не анимировал значения, которые начинаются или заканчиваются на
0. - Firefox: До Firefox 61 флекс-элементы с размером по содержимому получали размер
fit-content, а неmax-content. - Safari: С префиксом -webkit- — с версии 7.
- Chrome Android: С префиксом -webkit- — с версии 25.
- Safari iOS: С префиксом -webkit- — с версии 7.
- Samsung Internet: С префиксом -webkit- — с версии 1.5.
Яндекс Браузер работает на Chromium и поддерживает то же, что Chrome той же версии. Данные: MDN browser-compat-data 8.1.2, обновлено 17 сентября 2026 г.
Спецификация
См. также
- display Задаёт, каким блоком элемент становится снаружи и по каким правилам раскладывает своих потомков внутри — обычным потоком, флексом или сеткой.
- gap Задаёт промежутки между элементами флекс- и грид-контейнера и между колонками текста — только между ними, без лишних отступов по краям.
- width Задаёт ширину блока