Flexbox
Flexbox (от англ. Flexible Box Layout Module — «модуль гибкой компоновки») — это технология веб-вёрстки, предоставляющая набор CSS-свойств для одномерного распределения элементов в контейнере с возможностью управления их размерами, порядком и выравниванием. Flexbox позволяет создавать адаптивные макеты без использования float-ов, таблиц и сложных расчётов ширины, автоматически подстраиваясь под размер экрана или содержимого.
История
Модуль Flexbox был разработан рабочей группой CSS (CSS Working Group) для решения проблем, связанных с созданием гибких и предсказуемых макетов в одномерном пространстве (строка или столбец). До появления Flexbox для вёрстки сеток использовались таблицы, позиционирование и плавающие элементы (float), которые требовали громоздких обходных решений, особенно при создании адаптивных интерфейсов.
Первая черновая версия спецификации была опубликована в 2009 году. В 2011 году была выпущена черновая версия с префиксами (-webkit-), которая получила экспериментальную поддержку в браузерах. После нескольких итераций, учёта отзывов разработчиков и исправления ошибок, финальная версия спецификации (Flexbox Level 1) была рекомендована W3C (World Wide Web Consortium) в 2017 году.
Начиная с 2015 года все основные современные браузеры (Chrome, Firefox, Safari, Edge, Opera) обеспечивают полную поддержку Flexbox без префиксов. Модуль стал одним из стандартных инструментов для построения пользовательских интерфейсов и широко применяется в CSS-фреймворках, таких как Bootstrap 4 и 5, Tailwind CSS и Foundation.
Основные понятия
Flexbox основан на двух ключевых элементах: flex-контейнер (родительский элемент, к которому применяется свойство display: flex или display: inline-flex) и flex-элементы (дочерние элементы, расположенные внутри контейнера).
Оси Flexbox
- Главная ось (main axis) — направление, вдоль которого располагаются flex-элементы. Определяется свойством
flex-direction. По умолчанию — горизонтальная ось (слева направо). - Поперечная ось (cross axis) — ось, перпендикулярная главной. По умолчанию — вертикальная ось (сверху вниз).
Начало и конец осей
- Main start / Main end — начало и конец главной оси. Flex-элементы выстраиваются от main start к main end.
- Cross start / Cross end — начало и конец поперечной оси.
Свойства flex-контейнера
display
Активирует flex-контейнер. Значения:
flex— блочный контейнер.inline-flex— строчно-блочный контейнер (занимает только ширину содержимого).
flex-direction
Определяет направление главной оси:
row(по умолчанию) — слева направо.row-reverse— справа налево.column— сверху вниз.column-reverse— снизу вверх.
flex-wrap
Управляет переносом элементов на новую строку:
nowrap(по умолчанию) — все элементы в одной строке.wrap— элементы переносятся при нехватке места.wrap-reverse— перенос в обратном направлении.
justify-content
Выравнивание по главной оси:
flex-start— прижаты к началу.flex-end— прижаты к концу.center— по центру.space-between— равномерно с крайними элементами у границ.space-around— равномерно с половинными отступами по краям.space-evenly— равномерно с одинаковыми отступами.
align-items
Выравнивание по поперечной оси (для одной строки):
stretch(по умолчанию) — растягивание на всю высоту.flex-start— прижаты к началу поперечной оси.flex-end— прижаты к концу.center— по центру.baseline— по базовой линии текста.
align-content
Выравнивание по поперечной оси при наличии нескольких строк (работает только при flex-wrap: wrap):
flex-startflex-endcenterspace-betweenspace-aroundspace-evenlystretch
gap, row-gap, column-gap
Задают отступы между flex-элементами. Например, gap: 10px или row-gap: 5px; column-gap: 15px.
Свойства flex-элементов
order
Изменяет порядок отображения элемента. По умолчанию 0. Элементы с меньшим значением order располагаются раньше. Может принимать отрицательные значения.
flex-grow
Коэффициент увеличения элемента при наличии свободного места. По умолчанию 0 (элемент не растёт). Если всем элементам задано flex-grow: 1, они занимают всё доступное пространство поровну.
flex-shrink
Коэффициент сжатия элемента при нехватке места. По умолчанию 1 (элементы сжимаются). Значение 0 запрещает сжатие.
flex-basis
Базовый размер элемента по главной оси до распределения свободного пространства. Может быть задан в пикселях, процентах или ключевых словах (auto, content). По умолчанию auto.
flex (сокращение)
Объединяет flex-grow, flex-shrink и flex-basis. Например:
flex: 1— эквивалентноflex: 1 1 0%.flex: auto— эквивалентноflex: 1 1 auto.flex: none— эквивалентноflex: 0 0 auto.
align-self
Переопределяет выравнивание для конкретного элемента по поперечной оси. Принимает те же значения, что и align-items.
margin: auto
Автоматические отступы (margin-left: auto, margin-right: auto и т. д.) в flex-контейнере работают особым образом: они «съедают» свободное пространство и позволяют прижать элемент к одной из сторон.
Примеры использования
Центрирование элемента
``css .container { display: flex; justify-content: center; align-items: center; height: 200px; } ``
Равномерное распределение карточек
``css .cards { display: flex; flex-wrap: wrap; gap: 16px; } .card { flex: 1 1 200px; / растёт, сжимается, база 200px / } ``
Создание «липкого» футера
``css body { display: flex; flex-direction: column; min-height: 100vh; } main { flex: 1; / занимает всё оставшееся место / } ``
Преимущества и недостатки
Преимущества
- Простота создания адаптивных макетов без использования float и таблиц.
- Удобное управление выравниванием, порядком и распределением пространства.
- Поддержка всеми современными браузерами.
- Возможность изменения порядка элементов без изменения HTML-структуры.
Недостатки
- Flexbox ориентирован на одномерные макеты (строка или столбец). Для двумерных сеток (строки и столбцы одновременно) рекомендуется использовать CSS Grid Layout.
- В старых версиях браузеров (Internet Explorer 10-11) поддержка Flexbox была неполной и содержала ошибки (например, проблемы с
flex-wrapиmin-height). - Сложные вложенные структуры могут привести к избыточному количеству контейнеров.
Сравнение с CSS Grid
Flexbox и CSS Grid — две технологии CSS для вёрстки, которые часто используются совместно. Основные различия:
| Характеристика | Flexbox | CSS Grid |
|---|---|---|
| Тип макета | Одномерный (строка или столбец) | Двумерный (строки и столбцы) |
| Управление содержимым | Распределение элементов вдоль оси | Размещение элементов в ячейках сетки |
| Сложность | Проще для линейных макетов | Мощнее для сложных сеток |
| Поддержка браузерами | Полная с 2017 года | Полная с 2018 года |
На практике Flexbox чаще применяется для вёрстки меню, карточек, центрирования и простых компонентов, а Grid — для построения целостной сетки страницы.
Интересные факты
- Изначально Flexbox назывался «CSS Flexible Box Layout» и разрабатывался как альтернатива сложным табличным макетам.
- Свойство
orderпозволяет визуально переставлять элементы, не меняя их порядок в DOM-дереве, что полезно для доступности (screen readers читают в исходном порядке). - В ранних черновиках Flexbox использовались префиксы
-webkit-,-moz-,-ms-, что требовало написания дублирующих правил для разных браузеров.
Источники
- W3C Specification: CSS Flexible Box Layout Module Level 1 (2017).
- MDN Web Docs: Flexbox.
- CSS-Tricks: A Complete Guide to Flexbox.
- Can I Use — таблицы совместимости браузеров.
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →