flex: сокращённое свойство
flex— shorthand-свойство flex-элемента, объединяющееflex-grow,flex-shrinkиflex-basisв одну декларацию.
Зачем нужно
Писать три отдельных свойства (flex-grow, flex-shrink, flex-basis) громоздко и ошибкоёмко. Shorthand flex позволяет задать поведение элемента одной строкой и при этом имеет удобные ключевые слова (auto, none, 1) для самых распространённых случаев. Браузер также правильно выставляет дефолты, что при раздельной записи легко упустить.
Где используется
- Равное распределение пространства между элементами:
flex: 1 - Элемент с фиксированным размером без роста и сжатия:
flex: none - Адаптивные колонки в раскладках
Синтаксис
/* flex: <flex-grow> <flex-shrink> <flex-basis> */
.item {
flex: 1 1 auto; /* полная запись */
}
/* Одно число — flex-grow; shrink=1, basis=0% */
.item { flex: 1; } /* grow=1, shrink=1, basis=0% */
.item { flex: 2; } /* grow=2, shrink=1, basis=0% */
/* Ключевые слова */
.item { flex: auto; } /* 1 1 auto — растёт и сжимается */
.item { flex: none; } /* 0 0 auto — не растёт и не сжимается */
.item { flex: initial; } /* 0 1 auto — по умолчанию */
Типичные паттерны
Равные колонки
.columns {
display: flex;
gap: 16px;
}
.columns > * {
flex: 1; /* каждый элемент занимает равную долю */
}
<div class="columns">
<div>Колонка 1</div>
<div>Колонка 2</div>
<div>Колонка 3</div>
</div>
Фиксированный сайдбар + гибкий контент
.layout {
display: flex;
}
.sidebar {
flex: 0 0 240px; /* grow=0, shrink=0, basis=240px — не меняется */
}
.content {
flex: 1; /* занимает оставшееся пространство */
}
Элемент не меняет размер
.badge {
flex: none; /* 0 0 auto — размер по содержимому, без роста и сжатия */
}
Важно: basis=0% при числовом значении
/* flex: 1 означает flex: 1 1 0% — basis=0%, а не auto */
/* Элементы делят ВСЁ пространство контейнера поровну */
.item { flex: 1; }
/* Если нужно basis=auto — пишите явно */
.item { flex: 1 1 auto; }
/* Элементы делят СВОБОДНОЕ пространство пропорционально */
Частые ошибки
flex: 1не то же самое, чтоflex: 1 1 auto— basis отличается:0%vsauto. Приflex: 1все элементы равного размера; приflex: 1 1 auto— пропорционально контенту плюс равное свободное пространствоflex: noneна контейнере — свойство применяется к элементу, а не контейнеру- Забытый
display: flexна родителе —flexна элементе без flex-контейнера не работает
Связанные темы
- flex-grow -- расширение
- flex-shrink -- сжатие
- flex-basis -- базовый размер
- flex-grow -- расширение
- _MOC Flexbox