
Flexbox (Flexible Box Layout) — это мощная система компоновки элементов в CSS, которая позволяет легко и эффективно управлять расположением, выравниванием и распределением пространства между элементами в контейнере, даже если их размер неизвестен или динамически изменяется.
Flexbox идеально подходит для создания адаптивных сеток, навигации, карточек, хедеров, футеров и любых других компонентов, где важна гибкость.
До появления Flexbox верстальщики использовали:
floatinline-blocktable-cellpositionНо эти методы имели множество ограничений:
Flexbox решил эти проблемы, став стандартом современной вёрстки.
Flexbox работает с двумя уровнями:
.flex-container {
display: flex; /* делает элемент контейнером */
}<div class="flex-container">
<div class="flex-item">1</div>
<div class="flex-item">2</div>
<div class="flex-item">3</div>
</div>Теперь все .flex-item становятся гибкими элементами внутри контейнера.
display: flexСоздаёт flex-контейнер.
Внутренние элементы становятся одной строкой по умолчанию.
flex-direction — направление осиОпределяет основную ось (main axis).
| Значение | Описание |
|---|---|
row (по умолчанию) | Слева направо (для ltr) |
row-reverse | Справа налево |
column | Сверху вниз |
column-reverse | Снизу вверх |
.container {
flex-direction: column;
}Пример: вертикальное меню
flex-wrap — перенос строкПо умолчанию все элементы пытаются поместиться в одну строку.
| Значение | Описание |
|---|---|
nowrap (по умолчанию) | Все элементы в одной строке |
wrap | Переносятся на следующую строку при нехватке места |
wrap-reverse | Перенос снизу вверх |
.container {
flex-wrap: wrap;
}Идеально для сетки карточек.
flex-flow — краткая записьСокращение для flex-direction + flex-wrap.
.container {
flex-flow: row wrap;
}justify-content — выравнивание по основной осиУправляет распределением пространства между и вокруг элементов по основной оси.
| Значение | Описание |
|---|---|
flex-start | По левому краю (по умолчанию) |
flex-end | По правому краю |
center | По центру |
space-between | Равные промежутки между элементами |
space-around | Равные промежутки вокруг элементов |
space-evenly | Равные промежутки между и по краям |
.container {
justify-content: space-between;
}Пример: хедер с логотипом слева и меню справа.
align-items — выравнивание по поперечной осиВыравнивает элементы по высоте (если flex-direction: row).
| Значение | Описание |
|---|---|
stretch (по умолчанию) | Растягивает по высоте контейнера |
flex-start | По верхнему краю |
flex-end | По нижнему краю |
center | По центру |
baseline | По базовой линии текста |
Пример: вертикальное центрирование кнопки и текста.
align-content — выравнивание нескольких строкРаботает только при flex-wrap: wrap. Аналогично justify-content, но для строк.
| Значение | Описание |
|---|---|
stretch | Растягивает строки |
flex-start, flex-end, center | Выравнивание строк |
space-between, space-around | Промежутки между строками |
.container {
align-content: center;
}order — порядок элементовМеняет порядок отображения элементов.
.item-1 { order: 2; }
.item-2 { order: 1; }.item-2 будет первым, несмотря на положение в HTML.
Полезно для адаптивности: на мобильных менять порядок блоков.
flex-grow — растяжениеОпределяет, насколько элемент может расти, если есть свободное пространство.
.item-1 { flex-grow: 1; }
.item-2 { flex-grow: 2; }.item-2 займёт вдвое больше места, чем .item-1.
Пример: двухколоночный макет, где правая колонка шире.
flex-shrink — сжатиеОпределяет, насколько элемент может сжаться, если не хватает места.
.item { flex-shrink: 0; } /* Не сжимается */Используется, чтобы запретить сжатие изображений или кнопок.
flex-basis — базовый размерЗадаёт начальный размер элемента до распределения свободного пространства.
.item {
flex-basis: 200px;
}Элемент начинается с 200px, затем применяется grow/shrink.
flex — краткая записьСокращение: flex: <grow> <shrink> <basis>
.item {
flex: 1 1 200px; /* grow=1, shrink=1, basis=200px */
}Часто используемые значения:
flex: 1 → 1 1 0 — растягивается, сжимается, база = 0flex: auto → 1 1 auto — растягивается, сжимается, база = содержимоеflex: none → 0 0 auto — не растягивается, не сжимается.center {
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
}<div class="center">
<p>Я по центру!</p>
</div>Лучший способ центрирования в CSS!
.header {
display: flex;
justify-content: space-between;
align-items: center;
padding: 1rem;
}<header class="header">
<div class="logo">Logo</div>
<nav class="menu">
<a href="#">Главная</a>
<a href="#">Блог</a>
<a href="#">Контакты</a>
</nav>
</header>.cards {
display: flex;
flex-wrap: wrap;
gap: 1rem;
}
.card {
flex: 1 1 300px; /* Минимум 300px, может расти */
background: var(--secondary-bg);
border-radius: 8px;
padding: 1rem;
}<div class="cards">
<div class="card">Карточка 1</div>
<div class="card">Карточка 2</div>
<div class="card">Карточка 3</div>
</div>Адаптивная сетка без media запросов!
.layout {
display: flex;
height: 100vh;
}
.sidebar {
width: 250px;
background: #f0f0f0;
}
.content {
flex: 1; /* Занимает всё оставшееся место */
padding: 1rem;
}<div class="layout">
<aside class="sidebar">Меню</aside>
<main class="content">Основной контент</main>
</div>| Flexbox | CSS Grid |
|---|---|
| Одномерная (строка ИЛИ столбец) | Двумерная (строки И столбцы) |
| Идеален для списков, навигации | Для сложных сеток и макетов |
| Гибкость по одному направлению | Полный контроль над сеткой |
| Лучше для компонентов | Лучше для страниц |
Используйте Flexbox для компонентов
Используйте Grid для общей разметки страницы
min-width: 0 для flex-элементовИначе они могут не сжиматься:
.flex-item {
min-width: 0;
overflow: hidden;
text-overflow: ellipsis;
}width: 100% внутри flexОн может сломать поведение flex.
Вместо:
.item { width: 100%; }Лучше:
.item { flex: 1; }Flexbox хорошо поддерживается, но старые версии требуют префиксов.