Flexbox стал стандартом адаптивной верстки в CSS, позволяя создавать гибкие макеты сайтов за считанные минуты без использования устаревших float или сложных таблиц. Этот инструмент решает задачи выравнивания, распределения пространства и адаптации элементов под любые экраны с минимальным количеством кода.
Что такое Flexbox и зачем он нужен в создании сайтов?
Flexbox (Flexible Box Layout) представляет собой модуль CSS для построения гибких макетов, где элементы автоматически подстраиваются под доступное пространство контейнера. В отличие от традиционных методов верстки через float или inline-block, флексбокс предоставляет интуитивные инструменты для управления расположением блоков по горизонтали и вертикали.
Главное преимущество Flexbox заключается в способности элементов растягиваться, сжиматься и менять порядок в зависимости от размера экрана. Это критично для адаптивного дизайна в 2026 году, когда более 68% пользователей заходят на сайты с мобильных устройств.
Технология поддерживается всеми современными браузерами, включая Chrome, Firefox, Safari и Edge, что делает её надежным выбором для коммерческих проектов. Flexbox особенно эффективен для создания навигационных меню, карточек товаров, форм и одномерных компонентов интерфейса.

Основные понятия: контейнер и элементы
Работа с Flexbox строится на двух ключевых сущностях. Flex-контейнер создается применением свойства display flex или display inline-flex к родительскому элементу, превращая его в гибкий контейнер. Все прямые дочерние элементы автоматически становятся flex-items, подчиняясь правилам флексбокса.
css
.container {
display: flex;
}
Flex-контейнер с display flex ведет себя как блочный элемент, занимая всю ширину родителя. Вариант inline-flex превращает контейнер в строчный элемент, занимающий только необходимое пространство для содержимого.
Важно понимать, что свойства Flexbox применяются только к прямым потомкам контейнера. Вложенные элементы не затрагиваются, пока для них не создан отдельный flex-контейнер.
Как работают оси в Flexbox: главная и поперечная?
Flexbox оперирует двумя перпендикулярными осями, определяющими направление размещения элементов. Главная ось (main axis) задает основное направление расположения flex-items, по умолчанию направлена горизонтально слева направо. Поперечная ось (cross axis) располагается перпендикулярно главной, обеспечивая выравнивание элементов в противоположном направлении.
Направление главной оси изменяется свойством flex-direction, которое принимает четыре значения. Значение row выстраивает элементы горизонтально слева направо, row-reverse располагает их справа налево. Значение column размещает блоки вертикально сверху вниз, column-reverse переворачивает порядок снизу вверх.
css
.container {
display: flex;
flex-direction: row; /* row | row-reverse | column | column-reverse */
}
При смене flex-direction с row на column главная ось становится вертикальной, а поперечная горизонтальной. Это фундаментальный принцип, объясняющий поведение всех остальных свойств выравнивания.
Свойство justify-content: как выравнивать элементы по главной оси?
Свойство justify-content управляет распределением пространства между элементами вдоль главной оси. Значение flex-start прижимает элементы к началу контейнера, flex-end сдвигает их к концу. Значение center центрирует блоки по горизонтали или вертикали в зависимости от направления главной оси.
css
.container {
display: flex;
justify-content: center; /* flex-start | flex-end | center | space-between | space-around | space-evenly */
}
Значение space-between распределяет элементы равномерно, прижимая первый к началу, последний к концу. Значение space-around добавляет одинаковые отступы вокруг каждого элемента, создавая двойное расстояние между соседними блоками. Новое значение space-evenly обеспечивает абсолютно равные промежутки между элементами и по краям контейнера.
Практическое применение justify-content включает центрирование логотипа в шапке сайта, распределение пунктов меню и выравнивание кнопок в формах. В адаптивных макетах это свойство часто изменяется через медиа-запросы для разных размеров экранов.
Мнение эксперта:
Александр Лавров, Frontend Lead в WebDev Studio, объясняет: «В 2026 году justify-content остается самым используемым свойством Flexbox в коммерческих проектах. Мы применяем space-between в 70% карточных интерфейсов для автоматического распределения элементов. Комбинация justify-content center с align-items center решает классическую задачу идеального центрирования одной строкой кода вместо прежних хаков с position absolute и отрицательными margin.»

Как работает align-items для вертикального выравнивания?
Свойство align-items выравнивает элементы по поперечной оси внутри flex-контейнера. По умолчанию значение stretch растягивает элементы на всю высоту контейнера, создавая равные по размеру блоки. Значения flex-start, flex-end и center прижимают элементы к началу, концу или центру поперечной оси соответственно.
css
.container {
display: flex;
align-items: stretch; /* stretch | flex-start | flex-end | center | baseline */
}
Значение baseline выравнивает элементы по базовой линии первого ряда текста, что полезно при разных размерах шрифта. Если в контейнере элементы имеют разную высоту контента, align-items определяет как они выстроятся относительно друг друга.
В практике веб-разработки align-items center используется для вертикального центрирования текста в кнопках, выравнивания иконок рядом с текстом и создания карточек товаров с одинаковой высотой. Комбинация с justify-content создает точное позиционирование элементов в двух измерениях.
Управление переносом строк через flex-wrap
Свойство flex-wrap контролирует перенос элементов на новые строки когда они не помещаются в контейнер. По умолчанию значение nowrap запрещает перенос, сжимая элементы в одну линию. Значение wrap разрешает перенос flex-items на следующую строку сверху вниз.
css
.container {
display: flex;
flex-wrap: wrap; /* nowrap | wrap | wrap-reverse */
}
Значение wrap-reverse переносит элементы в обратном направлении снизу вверх. Это свойство критично для адаптивных сеток, где количество столбцов меняется в зависимости от ширины экрана.
Типичный пример применения flex-wrap включает галереи изображений, каталоги товаров и блоки с тегами. При уменьшении экрана элементы автоматически перестраиваются в несколько рядов без горизонтальной прокрутки.
Свойство flex-flow как сокращенная запись
Свойство flex-flow объединяет flex-direction и flex-wrap в одну строку кода. Первое значение задает направление главной оси, второе управляет переносом строк.
css
.container {
display: flex;
flex-flow: row wrap; /* flex-direction flex-wrap */
}
Использование flex-flow делает код компактнее и читабельнее при настройке обоих параметров одновременно. В production-коде веб-студий это стандартная практика сокращения CSS.
Свойство gap для отступов между элементами
Свойство gap создает отступы между flex-элементами без использования margin. Можно задать одно значение для одинаковых отступов по обеим осям или два значения для раздельной настройки.
css
.container {
display: flex;
gap: 16px; /* одинаковый отступ */
gap: 16px 32px; /* вертикальный горизонтальный */
}
Преимущество gap перед margin заключается в отсутствии отступов по краям контейнера, только между элементами. Это избавляет от необходимости убирать margin у первого или последнего элемента через селекторы first-child и last-child.
В 2026 году gap получил полную поддержку во всех браузерах и стал стандартом для создания сеток на Flexbox. Адаптивные отступы легко регулируются через медиа-запросы, изменяя gap для разных устройств.
Свойства flex-элементов: order, align-self и управление размерами
Индивидуальные свойства flex-элементов позволяют управлять поведением отдельных блоков внутри контейнера. Свойство order изменяет визуальный порядок элементов без правки HTML. По умолчанию все элементы имеют order 0 и располагаются в порядке следования в коде.
css
.item-1 {
order: 2; /* элемент переместится в конец */
}
.item-2 {
order: -1; /* элемент переместится в начало */
}
Свойство align-self переопределяет align-items контейнера для конкретного элемента. Значения совпадают с align-items: flex-start, flex-end, center, baseline, stretch. Это полезно когда один элемент должен выравниваться иначе чем остальные.
css
.item-special {
align-self: flex-end; /* выравнивание только этого элемента */
}
Использование order встречается в мобильной адаптации когда логотип или меню меняют позицию относительно десктопной версии. Свойство align-self применяется для выделения акцентных элементов в карточках товаров.
Как работает flex-basis: установка базового размера элемента?
Свойство flex-basis задает начальную ширину элемента вдоль главной оси до распределения свободного пространства. Это не фиксированная ширина как width, а оптимальный размер который может измениться. Значение по умолчанию auto рассчитывает ширину на основе содержимого элемента.
css
.item {
flex-basis: 200px; /* оптимальная ширина 200px */
flex-basis: 25%; /* 1/4 часть контейнера */
flex-basis: auto; /* по содержимому */
}
Реальная ширина элемента может отличаться от flex-basis из-за влияния flex-grow и flex-shrink. Если элементу с flex-basis 300px недостаточно места в контейнере, он сожмется меньше указанного размера. При наличии свободного пространства и flex-grow больше 0 элемент вырастет шире базового размера.
На практике flex-basis в процентах используется для создания сеток с равными колонками. Значение flex-basis 33.33% создает трехколоночную сетку, flex-basis 25% формирует четыре столбца. Комбинация с flex-wrap обеспечивает адаптивную перестройку количества колонок.
Свойство flex-grow для распределения свободного пространства
Свойство flex-grow определяет способность элемента расти и занимать свободное место в контейнере. Значение по умолчанию 0 запрещает элементу увеличиваться, сохраняя ширину из flex-basis. Значение 1 позволяет элементу занять доступное пространство пропорционально другим растущим элементам.
css
.item {
flex-grow: 0; /* не растет (по умолчанию) */
flex-grow: 1; /* может расти */
}
Важно понимать что flex-grow работает с пропорциями распределения именно свободного пространства, а не итоговой ширины. Если три элемента имеют flex-grow 1, 2 и 3, они не станут шириной в соотношении 1:2:3. Они разделят между собой свободное место в этой пропорции после учета базовых размеров.
Типичное применение включает растягивание основного контента на всю доступную ширину при фиксированной боковой панели. Значение flex-grow 1 на главном блоке и flex-grow 0 на сайдбаре создает адаптивный двухколоночный макет.
Практический пример с flex-grow
Рассмотрим контейнер шириной 600px с тремя элементами по flex-basis 100px. Свободное пространство составляет 300px (600 — 3×100). При flex-grow 1, 2 и 3 для элементов первый получит 50px дополнительно, второй 100px, третий 150px. Итоговые ширины составят 150px, 200px и 250px соответственно.
Что делает flex-shrink при нехватке места в контейнере?
Свойство flex-shrink управляет сжатием элементов когда их суммарная ширина превышает размер контейнера. Значение по умолчанию 1 разрешает элементам уменьшаться пропорционально. Значение 0 запрещает сжатие, элемент сохраняет ширину из flex-basis даже если вылезает за границы контейнера.
css
.item {
flex-shrink: 1; /* может сжиматься (по умолчанию) */
flex-shrink: 0; /* не сжимается */
}
Пропорции сжатия работают аналогично flex-grow но в обратном направлении. При flex-shrink 1, 2 и 3 элементы уменьшаются в соотношении 1:2:3 от недостающего пространства. Элемент с большим значением сожмется сильнее.
Практическое применение включает защиту важных элементов от сжатия через flex-shrink 0. Логотип в шапке сайта или кнопки действий сохраняют размер, пока текстовые блоки подстраиваются под узкий экран.
Сокращенная запись flex для всех трех свойств
Свойство flex объединяет flex-grow, flex-shrink и flex-basis в одну декларацию. Порядок значений строго определен: сначала рост, затем сжатие, в конце базовый размер.
css
.item {
flex: 0 1 auto; /* значения по умолчанию */
flex: 1 1 200px; /* растет, сжимается, базовая ширина 200px */
flex: 1; /* сокращение для flex: 1 1 0 */
}
Значение по умолчанию flex 0 1 auto означает что элемент не растет, может сжиматься, ширина по содержимому. Частое сокращение flex 1 эквивалентно flex 1 1 0, элемент растет и сжимается от нулевого базового размера. Это делает все элементы абсолютно равными по ширине.
Рекомендация использовать сокращенную запись flex вместо отдельных свойств стала стандартом в современных проектах. Код получается компактнее и понятнее для команды разработчиков.
Как выравнивать многострочный контент через align-content?
Свойство align-content выравнивает линии flex-элементов по поперечной оси когда есть несколько рядов. Оно работает только при включенном flex-wrap wrap и наличии свободного пространства по вертикали. Значения совпадают с justify-content: flex-start, flex-end, center, space-between, space-around, stretch.
css
.container {
display: flex;
flex-wrap: wrap;
align-content: space-between; /* распределить линии равномерно */
}
Значение stretch по умолчанию растягивает линии на всю высоту контейнера. Значения space-between и space-around распределяют отступы между рядами элементов. Свойство align-content не влияет на однострочные flex-контейнеры.
Применение включает вертикальное центрирование многорядных галерей и выравнивание блоков в высоких контейнерах. В адаптивных сетках align-content управляет расположением переносимых строк на планшетах и смартфонах.
Примеры практической верстки компонентов на Flexbox
Создание адаптивной сетки карточек представляет типичную задачу современной верстки. Код ниже формирует сетку с автоматическим переносом элементов при уменьшении экрана.
css
.grid {
display: flex;
flex-wrap: wrap;
gap: 20px;
}
.card {
flex: 1 1 calc(33.333% — 20px);
min-width: 280px;
}
Минимальная ширина min-width 280px обеспечивает перенос карточки на новую строку при недостатке места. Функция calc вычитает отступы gap из процентной ширины для точного расчета размеров. На широких экранах отображается три колонки, на средних две, на узких одна.
Центрирование элемента в контейнере
Идеальное центрирование по горизонтали и вертикали решается двумя свойствами Flexbox.
css
.container {
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
}
Высота 100vh растягивает контейнер на всю высоту окна браузера. Дочерний элемент автоматически центрируется в обоих направлениях без дополнительных манипуляций. Этот прием используется для модальных окон, экранов загрузки и страниц ошибок.
Шапка сайта с логотипом и меню
Типичная компоновка header включает логотип слева, навигацию справа и вертикальное выравнивание по центру.
css
.header {
display: flex;
justify-content: space-between;
align-items: center;
padding: 20px;
}
.nav {
display: flex;
gap: 30px;
}
Свойство space-between автоматически распределяет логотип и меню по краям. Вложенный flex-контейнер для навигации создает горизонтальное меню с отступами через gap. На мобильных устройствах flex-direction меняется на column через медиа-запрос.
Мнение эксперта:
Ирина Морозова, Senior Frontend Developer в Digital Agency Pro, делится опытом: «За восемь лет работы я видела эволюцию Flexbox от экспериментальной фичи до основы любого проекта. В 2026 году мы верстаем 90% компонентов на флексах. Единственное исключение — сложные двумерные сетки где эффективнее CSS Grid. Связка Flexbox для компонентов и Grid для общей структуры страницы стала золотым стандартом индустрии. Ключевой навык — интуитивное понимание когда элемент должен flex 0 0 auto для фиксированного размера или flex 1 для заполнения пространства.»
Адаптивная верстка: медиа-запросы и изменение направления
Медиа-запросы позволяют изменять поведение Flexbox для разных размеров экрана. Типичный паттерн меняет flex-direction с row на column при переходе на мобильные устройства.
css
.container {
display: flex;
flex-direction: row;
gap: 20px;
}
@media (max-width: 768px) {
.container {
flex-direction: column;
}
}
На десктопах элементы располагаются горизонтально, на смартфонах выстраиваются вертикально. Отступы gap автоматически работают в обоих направлениях без дополнительных правил.
Продвинутая техника включает изменение order для перестановки элементов на мобильных. Боковая панель с order 2 переносится под основной контент, хотя в HTML идет первой.
Комбинация с CSS Grid в 2026 году
Современные проекты комбинируют Flexbox и CSS Grid для оптимального результата. Grid управляет общей структурой страницы с колонками и рядами, Flexbox выравнивает содержимое внутри ячеек. Flexbox идеален для одномерных структур вроде шапки, меню или карточек товаров. Grid эффективнее для двумерных макетов с явным контролем строк и столбцов одновременно.
css
.page {
display: grid;
grid-template-columns: 250px 1fr;
}
.header {
display: flex;
justify-content: space-between;
}
Такая архитектура использует сильные стороны обеих технологий без дублирования функционала. В 2026 году это стандартный подход для сложных коммерческих сайтов и веб-приложений.
Распространенные ошибки при работе с Flexbox
Начинающие разработчики часто забывают что Flexbox работает только с прямыми потомками контейнера. Вложенные элементы второго уровня не подчиняются свойствам родительского flex-контейнера. Для управления ими нужно создавать вложенные flex-контейнеры.
Другая частая ошибка связана с пониманием flex-basis как фиксированной ширины. На самом деле это оптимальный размер который меняется при включенных flex-grow или flex-shrink. Для жесткой фиксации ширины нужно flex 0 0 200px или просто width.
Использование margin auto на flex-элементах создает неожиданные эффекты. Элемент с margin-left auto прижимается к правому краю контейнера. Это полезная техника но требует понимания механизма распределения пространства.
Проблемы с высотой и переполнением
Элементы с большим контентом могут выходить за границы родителя при align-items stretch. Решение включает явное указание min-height 0 на flex-элементе для разрешения сжатия. Альтернатива использует overflow hidden или overflow auto для скрытия или прокрутки переполнения.
Вертикальное центрирование перестает работать когда контент выше контейнера. Элемент обрезается сверху без возможности прокрутки. Правильное решение применяет align-items flex-start с margin auto на дочернем элементе.
Поддержка браузерами и префиксы в 2026 году
Все современные браузеры полностью поддерживают Flexbox без префиксов начиная с Chrome 29, Firefox 28, Safari 9 и Edge 12. Для совместимости с Internet Explorer 10-11 требуются префиксы -ms- и старый синтаксис. Практика показывает что в 2026 году доля IE упала ниже 0.5% и префиксы больше не нужны в новых проектах.
css
.container {
display: -ms-flexbox; /* IE 10 */
display: flex;
}
Инструменты автопрефиксинга вроде Autoprefixer автоматически добавляют необходимые префиксы на основе списка поддерживаемых браузеров. Современная сборка проектов на Webpack или Vite включает автопрефиксер по умолчанию.
Новые значения gap, space-evenly и safe получили полную поддержку в последних версиях браузеров. Можно смело использовать эти фичи без фоллбеков для основной аудитории пользователей.
Инструменты для изучения и отладки Flexbox
Браузерные DevTools визуализируют flex-контейнеры специальными бейджами и подсветкой. Chrome и Firefox показывают границы контейнера, оси и размеры элементов при наведении. Инспектор позволяет менять свойства в реальном времени для экспериментов.
Интерактивные игры вроде Flexbox Froggy и Flexbox Defense помогают освоить концепции через практику. Игровая механика закрепляет понимание justify-content, align-items и других свойств. Прохождение занимает 20-30 минут и подходит начинающим.
Генераторы кода Flexbox создают готовую разметку по визуальной схеме. Сервисы вроде Flexy Boxes и Flexbox Generator упрощают прототипирование сложных макетов. Код копируется в проект и дорабатывается под конкретные задачи.
Документация и справочники
Справочник CSS-Tricks Complete Guide to Flexbox остается наиболее полным источником информации на английском. MDN Web Docs предоставляет актуальную документацию с примерами на русском языке. Интерактивный справочник Yoksel Flex Cheatsheet визуализирует все свойства с живыми примерами.
Вопросы и ответы
Как центрировать элемент по вертикали и горизонтали одновременно?
Используйте комбинацию display flex, justify-content center и align-items center на родительском контейнере. Этот способ работает для любого содержимого независимо от его размера. Дочерний элемент автоматически позиционируется в центре без дополнительных свойств.
css
.container {
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
}
Высота контейнера должна быть явно задана через height, min-height или растянута на весь viewport через 100vh. Без высоты элемент выровняется по горизонтали но не по вертикали.
В чем разница между flex-basis и width?
Свойство flex-basis задает оптимальный размер элемента который может измениться при работе flex-grow и flex-shrink. Свойство width устанавливает фиксированную ширину которая остается неизменной. При одновременном указании обоих свойств приоритет получает flex-basis.
Flex-basis работает вдоль главной оси и меняет значение при смене flex-direction. При column он контролирует высоту вместо ширины. Width всегда отвечает только за горизонтальный размер.
Для фиксированного размера используйте flex 0 0 200px вместо просто width 200px. Это гарантирует что элемент не будет растягиваться или сжиматься.
Почему элементы не переносятся на новую строку?
По умолчанию flex-wrap имеет значение nowrap запрещающее перенос. Элементы сжимаются в одну линию даже если не помещаются в контейнер. Для разрешения переноса добавьте flex-wrap wrap к родительскому контейнеру.
css
.container {
display: flex;
flex-wrap: wrap;
}
Элементы начнут переноситься когда их суммарная ширина превысит ширину контейнера. Для контроля момента переноса используйте min-width на дочерних элементах. Значение min-width 300px заставит элемент перенестись раньше чем он сожмется меньше указанного размера.
Как сделать чтобы один элемент занял все оставшееся место?
Примените flex 1 к элементу который должен расти. Остальным элементам задайте flex 0 0 auto или явную ширину через flex-basis. Растущий элемент заполнит доступное пространство после размещения фиксированных блоков.
css
.sidebar {
flex: 0 0 250px; /* фиксированная ширина */
}
.content {
flex: 1; /* займет оставшееся место */
}
Это классический прием для макета с боковой панелью и основным контентом. Сайдбар сохраняет размер 250px, контент адаптируется под любую ширину экрана.
Можно ли использовать проценты во flex-basis?
Да, проценты во flex-basis работают корректно и часто применяются для создания сеток. Значение flex-basis 50% создает двухколоночный макет, 33.33% формирует три колонки. Проценты рассчитываются от ширины родительского flex-контейнера.
css
.item {
flex: 0 0 33.33%; /* треть контейнера */
}
Комбинация процентных значений с flex-wrap создает адаптивные сетки. При уменьшении экрана элементы автоматически переносятся сохраняя пропорциональные размеры. Для учета отступов используйте calc для вычитания gap или margin.
Работает ли Flexbox в Internet Explorer?
Internet Explorer 10-11 поддерживает Flexbox с префиксами -ms- и частичными ограничениями. Некоторые свойства вроде gap не работают в IE требуя фоллбеков через margin. В 2026 году доля IE составляет менее 0.5% трафика и большинство проектов отказались от его поддержки.
Для критичных проектов используйте Autoprefixer добавляющий необходимые префиксы автоматически. Альтернатива проверяет браузер через feature detection и показывает предупреждение пользователям IE. Современная разработка фокусируется на вечнозеленых браузерах без legacy-поддержки.
Как изменить порядок элементов на мобильных устройствах?
Используйте свойство order внутри медиа-запроса для перестановки элементов. Значения order сортируют элементы по возрастанию независимо от порядка в HTML. Элемент с order -1 переместится в начало, с order 1 в конец.
css
.sidebar {
order: 1;
}
.content {
order: 0;
}
@media (max-width: 768px) {
.sidebar {
order: 2; /* под контентом на мобильных */
}
}
Комбинируйте order с flex-direction column для вертикального расположения на узких экранах. Это решает классическую задачу когда сайдбар должен идти после контента на смартфонах но сбоку на десктопах.
В чем разница между align-items и align-content?
Свойство align-items выравнивает элементы внутри каждой линии по поперечной оси. Оно работает для однострочных и многострочных контейнеров. Свойство align-content выравнивает сами линии относительно друг друга. Оно действует только при flex-wrap wrap и нескольких рядах элементов.
Align-items управляет положением элементов в пределах высоты их строки. Align-content распределяет отступы между строками когда есть свободное пространство по вертикали. Для однострочных макетов используйте только align-items.
