📐Flexbox

Одномерная раскладка: flex-direction, justify-content, align-items, flex-grow/shrink.

📖7 мин чтения📊Уровень 8📅16 апреля 2026 г.

Загрузка карты...

Flexbox (Flexible Box Layout) — модуль CSS, который позволяет создавать гибкие одномерные раскладки. В отличие от традиционных методов позиционирования, Flexbox автоматически распределяет пространство между элементами и выравнивает их.

Традиционные методы CSS-раскладок (float, inline-block, position) были неудобны для создания гибких интерфейсов. Центрирование, равномерное распределение элементов требовали множества хаков и костылей.

Зачем нужен Flexbox

До появления Flexbox верстальщики использовали float, inline-block и position для создания раскладок. Это работало, но требовало костылей. Центрирование элемента по вертикали превращалось в квест с отрицательными margin.

Flexbox решил эти проблемы. Он появился в спецификации CSS3 в 2009 году. В 2012 стал стандартом W3C. С 2015 года поддерживается всеми современными браузерами. В России активно используется с 2016 года — Яндекс, Mail.ru, Сбербанк перешли на Flexbox для новых проектов.

Главное преимущество — работа в одном измерении. Flexbox управляет раскладкой либо по горизонтали (строка), либо по вертикали (колонка). Для двумерных сеток есть CSS Grid.

Основные свойства контейнера

Чтобы начать работать с Flexbox, нужно создать flex-контейнер. Для этого элементу задаётся display: flex или display: inline-flex. Все прямые потомки автоматически становятся flex-элементами.

flex-direction задаёт направление главной оси. Значения: row (горизонтально, по умолчанию), row-reverse (справа налево), column (вертикально), column-reverse (снизу вверх). Главная ось определяет, как будут выстраиваться элементы.

justify-content выравнивает элементы по главной оси. Варианты: flex-start (прижать к началу), flex-end (к концу), center (по центру), space-between (равные промежутки между элементами), space-around (равные отступы вокруг каждого элемента), space-evenly (все промежутки одинаковые).

align-items выравнивает по поперечной оси. Если flex-direction: row, то это вертикальное выравнивание. Значения: stretch (растянуть на всю высоту, по умолчанию), flex-start, flex-end, center, baseline (по базовой линии текста).

flex-wrap определяет, переносятся ли элементы на новую строку. По умолчанию nowrap — все элементы в одной линии, даже если не влезают. wrap — переносит на следующую строку. wrap-reverse — переносит, но строки идут снизу вверх.

Свойства flex-элементов

У отдельных элементов внутри flex-контейнера есть свои свойства для управления размером и порядком.

flex-grow — коэффициент роста. Показывает, какую долю свободного пространства займёт элемент. По умолчанию 0 — элемент не растёт. Если задать flex-grow: 1 всем элементам, они поделят пространство поровну. Если одному задать 2, а остальным 1 — он займёт в два раза больше.

flex-shrink — коэффициент сжатия. Работает наоборот: как элемент уменьшается, если не хватает места. По умолчанию 1 — элемент может сжиматься. 0 — элемент не сжимается, даже если вылезает за границы.

flex-basis — базовый размер элемента до распределения свободного пространства. Можно задать в пикселях, процентах или auto (по умолчанию, берёт размер контента). Работает как width для row или height для column, но с учётом flex-логики.

Есть сокращённое свойство flex, которое объединяет три предыдущих: flex: 1 0 auto означает flex-grow: 1, flex-shrink: 0, flex-basis: auto. В 90% случаев используют либо flex: 1 (растёт и сжимается), либо flex: 0 0 200px (фиксированный размер).

order меняет порядок элементов. По умолчанию все элементы имеют order: 0. Элементы с меньшим order идут первыми. Можно задать отрицательные значения. Полезно для адаптива — на мобильных переставить блоки без изменения HTML.

Практические примеры

Центрирование элемента — самая частая задача. Решается двумя строками:

.container {
  display: flex;
  justify-content: center; /* горизонталь */
  align-items: center;     /* вертикаль */
}

Адаптивная навигация. На десктопе элементы в строку, на мобильных — в колонку:

.nav {
  display: flex;
  flex-direction: row; /* десктоп */
}

@media (max-width: 768px) {
  .nav {
    flex-direction: column; /* мобильные */
  }
}

Равные колонки с gap между ними:

.container {
  display: flex;
  gap: 20px; /* отступ между элементами */
}

.item {
  flex: 1; /* все элементы одинаковой ширины */
}

Прижать футер к низу страницы:

body {
  display: flex;
  flex-direction: column;
  min-height: 100vh;
}

footer {
  margin-top: auto; /* прижимается к низу */
}

Частые ошибки

Забыть про flex-wrap — элементы сжимаются до нечитаемости вместо переноса на новую строку. Решение: добавить flex-wrap: wrap.

Путать justify-content и align-items — justify управляет главной осью (та, что задана в flex-direction), align — поперечной. Для flex-direction: row это горизонталь и вертикаль соответственно.

Использовать Flexbox для сложных сеток — если макет двумерный (и столбцы, и строки), лучше подходит CSS Grid. Flexbox для одномерных раскладок.

Не учитывать базовый размер при flex: 1 — элементы делят пространство пропорционально, но с учётом исходного контента. Если нужна строгая пропорция, задавайте flex-basis: 0.

Вкладывать слишком много flex-контейнеров — усложняет отладку и снижает производительность. Проще использовать Grid для общей структуры, Flexbox для компонентов.

Инструменты для работы

Название Для кого Цена
Flexbox Froggy Новички Бесплатно
Flexbox Defense Новички Бесплатно
CSS Tricks Flexbox Guide Все Бесплатно
Chrome DevTools Разработчики Бесплатно
  1. 1

    Появление в спецификации

    Flexbox впервые появился в рабочей спецификации CSS3 как способ решить проблемы традиционных раскладок.

  2. 2

    Стандартизация W3C

    Flexbox Layout Module стал кандидатом в рекомендации W3C. Браузеры начали постепенную реализацию.

  3. 3

    Полная поддержка браузерами

    Chrome, Firefox, Safari, Edge получили полную поддержку Flexbox без префиксов. С этого момента технология стала массово применяться.

  4. 4

    Массовое внедрение в России

    Российские компании (Яндекс, Mail.ru, Сбербанк) начали использовать Flexbox в новых проектах вместо float-раскладок.

  5. 5

    Flexbox Gap

    Добавлена поддержка свойства gap для Flexbox (ранее работало только в Grid), упрощающего создание отступов между элементами.

5 ключевых событий

Flexbox vs CSS Grid: когда что использовать

Сравнение двух современных систем раскладки

КритерийFlexboxCSS Grid
ИзмеренияОдномерный (строка или колонка)Двумерный (строки и колонки)
Лучше дляКомпонентов, простых раскладокСложных сеток, макетов страниц
КонтрольОт содержимого к раскладкеОт раскладки к содержимому
ПоддержкаС 2015 года (99% браузеров)С 2017 года (98% браузеров)
Типичные задачиНавигация, карточки, центрированиеЖурнальные макеты, дашборды

Сравнительная таблица: анализ различий

Свойства flex-контейнера

Основные CSS-свойства, которые применяются к контейнеру

СвойствоЗначенияЧто делает
flex-directionrow, column, row-reverse, column-reverseНаправление главной оси
justify-contentflex-start, center, space-between, space-aroundВыравнивание по главной оси
align-itemsstretch, flex-start, center, baselineВыравнивание по поперечной оси
flex-wrapnowrap, wrap, wrap-reverseПеренос элементов на новую строку
align-contentflex-start, center, space-betweenВыравнивание строк (при wrap)
gap20px, 1rem, 5%Отступ между элементами

Технические характеристики

Свойства flex-элементов

CSS-свойства для индивидуального управления элементами

СвойствоЗначенияЧто делает
flex-grow0 (по умолчанию), 1, 2...Коэффициент роста при наличии свободного места
flex-shrink1 (по умолчанию), 0Коэффициент сжатия при нехватке места
flex-basisauto, 200px, 50%Базовый размер до распределения пространства
flex1, 0 0 200px, 1 1 autoСокращение для grow/shrink/basis
order0 (по умолчанию), -1, 1, 2...Порядок элемента в раскладке
align-selfauto, flex-start, centerИндивидуальное выравнивание элемента

Технические характеристики

Часто задаваемые вопросы

Flexbox работает в одном измерении (строка или колонка), Grid — в двух (строки и колонки одновременно). Flexbox для компонентов и простых раскладок, Grid для сложных сеток.