Гид по технологиям

Flexbox в CSS: руководство по выравниванию элементов

7 min read CSS Обновлено 14 Dec 2025
Flexbox в CSS: руководство по выравниванию
Flexbox в CSS: руководство по выравниванию

Ноутбук с открытым сайтом, где товары показаны в виде квадратных плиток

Введение

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

Краткие определения одно строкой

  • Flex container — элемент с display: flex; контейнер, внутри которого применяются правила flex.
  • Flex item — непосредственный дочерний элемент flex-контейнера.
  • Main axis — основная ось; направление, заданное flex-direction.
  • Cross axis — поперечная ось; перпендикулярна основной оси.

Важно: flexbox — инструмент для «одномерных» макетов (одна строка/колонка). Для «двумерных» сеток лучше подходит CSS Grid.

Когда использовать Flexbox и когда нет

Важно

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

Когда Flexbox может подвести

  • Нужно выстроить сложную двумерную сетку (Grid лучше).
  • Нужна точная выравненная таблица с множеством ячеек одинакового размера и независимыми строками/столбцами.
  • Браузерная поддержка очень старых браузеров (IE10–11 поддержка есть, но с ограничениями).

Как настроить flex-контейнер

Простейшая структура HTML — несколько дочерних блоков внутри родителя:

Чтобы сделать контейнер Flexbox, добавьте display: flex к родителю:

.parent {
  display: flex;
}

Без display: flex дочерние блоки будут позиционироваться как обычные блочные элементы (в столбик).

Как управлять направлением раскладки

flex-direction контролирует направление основной оси и порядок расположения элементов.

Иллюстрация разных направлений flex-direction: row, column, row-reverse, column-reverse

Возможные значения:

flex-direction: row | column | row-reverse | column-reverse;

Пример HTML:

CSS краски и размер элементов:

.red { background-color: red; }
.orange { background-color: orange; }
.yellow { background-color: yellow; }
.green { background-color: green;}
.blue { background-color: blue; }
.purple { background-color: purple; }

.parent div {
  width: 40px;
  height: 40px;
}

Применение flex-direction:

.parent {
  width: 300px;
  display: flex;
  flex-direction: row;
}

Ментальная модель

  • Представьте, что внутри контейнера проходит «осевая линия» — это main axis. flex-direction= row делает её горизонтальной, column — вертикальной. Все свойства, влияющие на распределение, применяются по отношению к этим осям.

Выравнивание по поперечной оси

align-items управляет выравниванием дочерних элементов вдоль cross axis (по умолчанию это вертикальная ось при row).

Примеры выравнивания align-items: start, center, end, stretch, baseline

Значения:

align-items: flex-start | flex-end | center | baseline | stretch;

Пример:

.parent {
  display: flex;
  align-items: flex-start;
}

Дополнительно: baseline

align-items: baseline выравнивает элементы по их текстовой базовой линии. Для заметного эффекта элементы должны иметь разные высоты.

.align-demo > div { display: inline-block }

Совет

  • stretch растягивает элементы по поперечной оси, если у них нет фиксированного размера в этом направлении.

Переопределение выравнивания для отдельного элемента

align-self позволяет одному элементу игнорировать align-items родителя и задать собственное выравнивание.

Пример align-self для отдельного элемента, центрирование одного блока среди других

Значения:

align-self: auto | flex-start | flex-end | center | baseline | stretch;

Пример использования:

.parent {
  display: flex;
  flex-direction: row;
}

Важно

  • align-self влияет только на конкретный флекс-элемент, а не на его потомков.

Выравнивание строк по поперечной оси

align-content управляет распределением свободного пространства между строками в мультистрочном флекс-контейнере (когда используется flex-wrap).

Иллюстрация align-content при wrap: start, center, space-between, stretch

Значения:

align-content: flex-start | flex-end | center | stretch | space-between | space-around;

Пример настройки:

.parent {
  flex-wrap: wrap;
  display: flex;
  align-content: flex-start;
  width: 180px;
}

Ключевая деталь

  • align-content действует только при переносе строк (flex-wrap: wrap) и когда есть свободное пространство вдоль поперечной оси.

Выравнивание по основной оси

justify-content управляет расположением элементов по основной оси: сдвигает их влево/вправо или распределяет свободное пространство.

Иллюстрация justify-content: flex-start, center, space-between, space-around, space-evenly

Значения:

justify-content: flex-start | flex-end | center | space-between | space-around | space-evenly;

Пример:

.red { background-color: red; } .green { background-color: lightgreen; } .blue { background-color: blue; } .parent { width: 300px; display: flex; justify-content: flex-start; }

Дополнительные значения и безопасность

  • specification CSS Box Alignment вводит такие значения как start, end, left, right. Поддержка в браузерах может отличаться.
  • safe center предотвращает выход элементов за пределы контейнера в некоторых ситуациях (браузерная поддержка ограничена).

Дополнительные примеры justify-content с ключевыми словами safe и start

Интервалы между элементами

gap — простой способ задать промежутки между элементами (ранее свойство gap было у grid, сейчас поддерживается и для flex).

Иллюстрация gap между элементами в строке и при переносе

Пример:

.parent {
  display: flex;
  gap: 70px;
}

Поведение при переполнении

Если суммарная ширина элементов плюс gap превышает ширину контейнера, элементы будут сжиматься (в зависимости от flex-shrink) или переноситься, если задан flex-wrap.

Пример с переносом:

.parent {
  width: 300px;
  flex-wrap: wrap;
  gap: 120px;
}

Дополнительно можно задать row-gap и column-gap:

.parent {
  row-gap: 120px;
  column-gap: 20px;
}

Иллюстрация gap при flex-wrap: строка и столбец с отступами между ними

Практическая методология выбора свойств

Мини-методология при проектировании компонента:

  1. Решите, одномерный ли это макет. Если да — Flexbox. Если нужен контроль двух осей — Grid.
  2. Определите основную ось (row или column) через flex-direction.
  3. Настройте выравнивание по основной оси через justify-content.
  4. Настройте выравнивание по поперечной оси через align-items и отдельно для исключений через align-self.
  5. Если элементы должны переходить на новые строки — включите flex-wrap и отрегулируйте align-content и gap.
  6. Протестируйте при разных размерах экранов и с контентом разной длины.

Быстрая шпаргалка по свойствам

  • display: flex — превращает контейнер в flex-контейнер.
  • flex-direction — направление основного потока.
  • justify-content — распределение вдоль основной оси.
  • align-items — выравнивание вдоль поперечной оси для всех элементов.
  • align-self — индивидуальное выравнивание элемента.
  • align-content — распределение строк (при wrap).
  • gap / row-gap / column-gap — интервалы между элементами.
  • flex-wrap — перенос элементов на новые строки.

Тесты и критерии приёмки

Критерии приёмки

  • Элементы корректно центрируются по обоим осям при использовании justify-content: center и align-items: center.
  • При уменьшении ширины контейнера и включенном flex-wrap элементы переносятся, и расстояния между строками соответствуют row-gap.
  • align-self переопределяет align-items только для указанного элемента.
  • align-content вступает в силу только при наличии нескольких строк (flex-wrap: wrap) и свободного пространства по поперечной оси.

Набор тест-кейсов

  1. Контейнер с тремя элементами: установить justify-content: space-between и проверить равные промежутки.
  2. Контейнер с элементами разной высоты: align-items: baseline должен выстроить их по базовой линии текста.
  3. Контейнер с gap: 50px и шириной, при которой суммарная ширина > контейнера: проверить сжатие или перенос элементов.
  4. Проверка совместимости: открыть страницу в Chrome, Firefox, Safari и Edge; при необходимости — IE11 и мобильных браузерах.

Рольные чек-листы при работе с Flexbox

Frontend-разработчик

  • Проверить использование display: flex на родителе.
  • Убедиться, что дочерние элементы — непосредственные дети (flex не действует на вложенные элементы).
  • Проверить поведение при переполнении и при flex-wrap.
  • Проверить доступность: порядок в DOM важен для навигации клавиатурой.

Дизайнер

  • Согласовать, где нужен одномерный макет, а где — сетка.
  • Предусмотреть пробелы (gap) и поведение для длинных слов/переносов.

QA

  • Протестировать на разных разрешениях и с различным контентом.
  • Убедиться в корректной работе ARIA/фокусных состояний при перекрытиях.

Альтернативы и совместимость

Альтернативы

  • CSS Grid — лучше для двумерных задач (независимые строки и колонки).
  • inline-block / float — устаревшие приёмы, используются как фолбэки в очень старых проектах.

Совместимость

  • Современные версии Chrome, Firefox, Edge и Safari обладают хорошей поддержкой Flexbox.
  • Internet Explorer 10–11 частично поддерживает Flexbox, но есть отличия в синтаксисе и баги (например, поведение flex-basis и min-height). Для критичных интерфейсов оставляйте фолбэки.

Совет по фолбэку

  • Если нужно поддержать старые браузеры, можно сочетать display: flex с float/inline-block как запасной вариант, либо использовать автопрефиксы через PostCSS/Autoprefixer.

Отдельные нюансы и подводные камни

  • Если элементы не реагируют на align-items: stretch, проверьте, не задан ли им явный размер по соответствующей оси.
  • При использовании safe center убедитесь в поддержке в целевых браузерах — это экспериментальная опция.
  • При наличии long-word без переноса текст может выйти за пределы контейнера; добавьте word-break: break-word или overflow-wrap: anywhere при необходимости.

Краткая галерея исключений

  • Центрирование по вертикали не работает, если родитель не имеет высоты — задайте высоту или min-height.
  • align-content не сработает на одном ряду даже при flex-wrap: wrap, если элементы не заняли несколько строк.
  • align-items: baseline может вести себя непредсказуемо с элементами, где font-size или line-height сильно отличаются.

1‑строчный глоссарий

  • Flexbox — модуль CSS для одномерного выравнивания.
  • Main axis — основная ось движения элементов.
  • Cross axis — поперечная ось.
  • Gap — расстояние между флекс-элементами.

Короткое резюме

Flexbox даёт быстрые и предсказуемые способы выравнивания элементов в одном направлении. Сначала выбирайте основную ось (flex-direction), затем распределяйте элементы по основной и поперечной осям через justify-content и align-items. Для индивидуальных исключений используйте align-self. Если нужно управлять и строками, и колонками одновременно, рассматривайте CSS Grid. Всегда тестируйте на реальном контенте и целевых браузерах.

Примечание

  • Для глубокого понимания полезно экспериментировать с живыми примерами (например, в CodePen) и проверять поведение при разных размерах экранов.
Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Несколько аккаунтов Skype: Multi Skype Launcher
Программное обеспечение

Несколько аккаунтов Skype: Multi Skype Launcher

Журнал для работы: повысить продуктивность
Productivity

Журнал для работы: повысить продуктивность

Персональные звуки уведомлений на Android
Android.

Персональные звуки уведомлений на Android

Скачивание шоу Hulu для офлайн‑просмотра
Стриминг

Скачивание шоу Hulu для офлайн‑просмотра

Microsoft Start: персонализированная новостная лента
Новости

Microsoft Start: персонализированная новостная лента

Как изменить имя в Epic Games быстро
Гайды

Как изменить имя в Epic Games быстро