Основы Flexbox
Flexbox (Flexible Box Layout) — одномерная система раскладки CSS, которая распределяет пространство между элементами вдоль одной оси. Это основной инструмент для компонентной раскладки в современном CSS.
Зачем нужно
До Flexbox для центрирования, выравнивания и распределения пространства использовались хаки с float, table-cell, inline-block. Flexbox решает эти задачи одной строкой. Навбары, карточки, формы, хедеры, футеры — всё это Flexbox.
Где используется
- Навигационные меню
- Карточные раскладки
- Центрирование элементов
- Распределение пространства между элементами
- Управление порядком элементов
- Адаптивные компоненты
Предпосылки
- Display — display: flex
- Margin и Padding — отступы
- Position — контекст позиционирования
Flex-контейнер и flex-элементы
/* Контейнер */
.container {
display: flex; /* или inline-flex */
}
/* Все прямые потомки становятся flex-элементами */
<div class="container"> <!-- flex-контейнер -->
<div class="item">A</div> <!-- flex-элемент -->
<div class="item">B</div> <!-- flex-элемент -->
<div class="item">C</div> <!-- flex-элемент -->
</div>
Только прямые потомки контейнера становятся flex-элементами. Вложенные элементы — нет.
Оси Flexbox
Главная ось (Main Axis)
Направление, в котором размещаются элементы. По умолчанию — горизонтально (слева направо).
Поперечная ось (Cross Axis)
Перпендикулярна главной. По умолчанию — вертикально (сверху вниз).
flex-direction: row (по умолчанию)
Main Axis →
┌──────────────────────────┐
│ ┌───┐ ┌───┐ ┌───┐ │ ↑
│ │ A │ │ B │ │ C │ │ │ Cross
│ └───┘ └───┘ └───┘ │ │ Axis
└──────────────────────────┘ ↓
flex-direction: column
Cross Axis →
┌──────────┐
│ ┌────┐ │ ↑
│ │ A │ │ │
│ └────┘ │ │
│ ┌────┐ │ │ Main
│ │ B │ │ │ Axis
│ └────┘ │ │
│ ┌────┐ │ │
│ │ C │ │ ↓
│ └────┘ │
└──────────┘
display: flex vs display: inline-flex
/* Блочный flex-контейнер — занимает всю ширину */
.block-flex {
display: flex;
}
/* Строчный flex-контейнер — ширина по контенту */
.inline-flex {
display: inline-flex;
}
Что происходит при display: flex
Когда элемент становится flex-контейнером:
- Прямые потомки становятся flex-элементами
- Элементы выстраиваются в строку (
flex-direction: row) - Элементы не переносятся на новую строку (
flex-wrap: nowrap) - Элементы растягиваются по поперечной оси (
align-items: stretch) - Элементы не растут по главной оси (
flex-grow: 0) - Элементы могут сжиматься (
flex-shrink: 1)
/* Значения по умолчанию */
.container {
display: flex;
flex-direction: row;
flex-wrap: nowrap;
justify-content: flex-start;
align-items: stretch;
align-content: stretch;
}
.item {
flex-grow: 0;
flex-shrink: 1;
flex-basis: auto;
order: 0;
align-self: auto;
}
Влияние направления письма
Flexbox учитывает direction и writing-mode:
/* LTR (по умолчанию): A → B → C */
.ltr { direction: ltr; }
/* RTL: C ← B ← A */
.rtl { direction: rtl; }
/* Вертикальный текст: оси меняются */
.vertical { writing-mode: vertical-rl; }
Быстрые решения с Flexbox
Центрирование
.center {
display: flex;
justify-content: center;
align-items: center;
}
Элемент вправо
.nav {
display: flex;
}
.nav .logo { /* Слева */ }
.nav .spacer { flex: 1; } /* Или margin-left: auto на .actions */
.nav .actions { /* Справа */ }
Равные колонки
.columns {
display: flex;
gap: 16px;
}
.columns > * {
flex: 1; /* Равная ширина */
}
Частые ошибки
-
Flex-элементы работают только на прямых потомках — вложенные
<span>внутри<div>не являются flex-элементами -
Забыт
display: flexна контейнере —justify-contentиalign-itemsне работают без него -
Путаница осей —
justify-contentработает по главной оси,align-itemsпо поперечной. Приflex-direction: columnоси меняются -
inline-flexнеожиданно — контейнер занимает ширину по контенту, а не 100%
Практика
- Создать flex-контейнер с тремя элементами
- Центрировать элемент по обеим осям одной строкой
- Переключить
flex-directionс row на column и наблюдать смену осей - Попробовать
display: inline-flexи сравнить сdisplay: flex
Связанные темы
- Свойства контейнера — justify-content, align-items, gap
- Свойства элементов — flex-grow, flex-shrink, flex-basis
- Практика Flexbox — реальные паттерны
- Flexbox tips — подводные камни и хитрости
Ресурсы
- MDN — Flexbox
- CSS Tricks — A Complete Guide to Flexbox
- Flexbox Froggy — интерактивная игра
- Дока — Flexbox