Загрузка...
Загрузка...
Подробное руководство по CSS Flexbox: свойства контейнера и элементов, оси, выравнивание, практические примеры и типичные паттерны вёрстки.
Сравнение Flexbox и CSS Grid: сильные стороны каждой технологии, типичные сценарии использования и рекомендации по выбору для разных задач вёрстки.
CSS & ДизайнПодробное руководство по CSS Grid: свойства контейнера и элементов, именованные области, авторазмещение, практические примеры и типичные паттерны.
CSS & ДизайнПолное руководство по центрированию элементов с помощью CSS Flexbox: по горизонтали, вертикали, по обеим осям, а также центрирование с учётом отступов.
CSS & ДизайнПрактическое руководство по созданию адаптивных макетов с CSS Grid: брейкпоинты, auto-fill, auto-fit, медиа-запросы и готовые паттерны.
Поделитесь с коллегами или изучите другие материалы блога
CSS Flexbox (Flexible Box Layout) — это модуль макетирования, который позволяет создавать гибкие одномерные раскладки. Flexbox решает множество задач выравнивания и распределения пространства между элементами без использования float и позиционирования. В этой статье рассмотрим все свойства Flexbox с практическими примерами.
Flexbox работает по принципу двух осей: главной (main axis) и поперечной (cross axis). Направление главной оси определяется свойством flex-direction. Элементы располагаются вдоль главной оси и выравниваются по поперечной.
Чтобы включить Flexbox, достаточно установить display: flex или display: inline-flex на родительском элементе:
.container {
display: flex;
}
Все прямые потомки становятся flex-элементами и получают особое поведение по умолчанию: они выстраиваются в ряд, сжимаются до минимального размера и не переносятся.
Определяет направление главной оси и порядок элементов:
| Значение | Описание |
|---|---|
row | По умолчанию. Слева направо (в LTR) |
row-reverse | Справа налево |
column | Сверху вниз |
column-reverse | Снизу вверх |
.container {
display: flex;
flex-direction: row; /* элементы в ряд */
}
.container-column {
display: flex;
flex-direction: column; /* элементы в колонку */
}
Управляет переносом элементов при нехватке места:
| Значение | Описание |
|---|---|
nowrap | По умолчанию. Без переноса |
wrap | Перенос на следующую строку |
wrap-reverse | Перенос в обратном направлении |
.container {
display: flex;
flex-wrap: wrap;
}
Краткая запись для flex-direction и flex-wrap:
.container {
flex-flow: row wrap;
}
Выравнивание элементов вдоль главной оси:
| Значение | Описание |
|---|---|
flex-start | К началу оси |
flex-end | К концу оси |
center | По центру |
space-between | Равномерно, первый у начала, последний у конца |
space-around | Равные отступы вокруг каждого |
space-evenly | Равные отступы между всеми |
.container {
display: flex;
justify-content: space-between;
}
Выравнивание элементов вдоль поперечной оси (в одной строке):
| Значение | Описание |
|---|---|
stretch | По умолчанию. Растягивание на всю высоту |
flex-start | К началу поперечной оси |
flex-end | К концу |
center | По центру |
baseline | По базовой линии текста |
.container {
display: flex;
align-items: center;
}
Выравнивание строк flex-контейнера при flex-wrap: wrap. Игнорируется при одной строке:
.container {
display: flex;
flex-wrap: wrap;
align-content: space-between;
}
Коэффициент роста элемента при наличии свободного места. По умолчанию 0 (не растёт):
.item {
flex-grow: 1; /* займёт всё свободное место */
}
.item-double {
flex-grow: 2; /* займёт в два раза больше, чем элемент с flex-grow: 1 */
}
Коэффициент сжатия при нехватке места. По умолчанию 1:
.item {
flex-shrink: 0; /* не сжимается */
}
Начальный размер элемента до распределения пространства. Может быть в px, %, em или auto:
.item {
flex-basis: 200px;
}
Краткая запись: flex-grow flex-shrink flex-basis. Значение по умолчанию: 0 1 auto:
.item {
flex: 1 1 auto; /* растёт и сжимается, базовый размер auto */
}
.item-fixed {
flex: 0 0 200px; /* фиксированная ширина 200px */
}
Переопределение align-items для отдельного элемента:
.item {
align-self: flex-end;
}
Визуальный порядок элементов. По умолчанию 0. Отрицательные значения выводят элемент раньше:
.item-first {
order: -1;
}
.item-last {
order: 1;
}
.cards {
display: flex;
gap: 1rem;
}
.card {
flex: 1 1 0;
min-width: 0;
}
.nav {
display: flex;
justify-content: space-between;
align-items: center;
padding: 1rem 2rem;
}
.nav-links {
display: flex;
gap: 2rem;
}
.layout {
display: flex;
min-height: 100vh;
}
.sidebar {
flex: 0 0 250px;
}
.main {
flex: 1 1 auto;
}
.centered {
display: flex;
justify-content: center;
align-items: center;
min-height: 100vh;
}
Забытый min-width: 0 — flex-элементы по умолчанию имеют min-width: auto, что мешает сжатию. Для текстового контента добавьте min-width: 0.
Смешение flex и width — при flex: 1 1 auto явный width может конфликтовать. Используйте flex-basis вместо width.
gap и старые браузеры — свойство gap для Flexbox поддерживается не во всех браузерах. Для совместимости используйте margin на элементах.
Для быстрой проверки и отладки Flexbox-раскладок удобно использовать Flexbox Playground на rechecker.ru — интерактивную песочницу, где можно менять свойства и сразу видеть результат.
При необходимости конвертировать готовые Flexbox-стили в классы Tailwind используйте CSS в Tailwind.
Flexbox хорошо сочетается с медиа-запросами для создания адаптивных макетов:
.container {
display: flex;
flex-direction: column;
gap: 1rem;
}
@media (min-width: 768px) {
.container {
flex-direction: row;
flex-wrap: wrap;
}
.item {
flex: 1 1 calc(50% - 1rem);
}
}
@media (min-width: 1024px) {
.item {
flex: 1 1 calc(33.333% - 1rem);
}
}
display: inline-flex создаёт flex-контейнер, который ведёт себя как строчный элемент. Полезно, когда нужно встроить flex-раскладку в текст или ограничить ширину контейнера его содержимым:
.badge-group {
display: inline-flex;
gap: 0.5rem;
align-items: center;
}
Flexbox обрабатывается браузером эффективно. Основные рекомендации:
will-change: flex только при анимации flex-свойств и только на анимируемых элементахflex: 0 0 auto вместо flex: 1 1 auto, если рост не нуженFlexbox поддерживается во всех современных браузерах. Для IE10 и IE11 требуются префиксы -ms-:
.container {
display: -ms-flexbox;
display: flex;
-ms-flex-wrap: wrap;
flex-wrap: wrap;
}
Автопрефиксер и PostCSS автоматически добавляют необходимые префиксы при сборке проекта.
Flexbox оптимален для одномерных раскладок (ряд или колонка). Для двумерных сеток лучше подходит CSS Grid. Подробное сравнение технологий и рекомендации по выбору — в статье Flexbox vs CSS Grid: когда что использовать.
Дополнительные паттерны центрирования с Flexbox описаны в материале Центрирование в CSS с Flexbox: все способы.