Flexbox в CSS: освойте основы и адаптивную вёрстку с примерами
#Веб-разработка #CSS и верстка #Фронтенд CSSДля кого эта статья:
- Веб-разработчики
- Дизайнеры интерфейсов
- Студенты и специалисты, изучающие CSS и веб-технологии
Когда я впервые столкнулся с вёрсткой многоколоночных макетов на CSS, это напоминало сражение с драконом — многострочные хаки, бесконечные float-ы и сотни строк медиа-запросов. Flexbox изменил правила игры. Этот инструмент CSS стал настоящей революцией в вёрстке, превратив сложные задачи в изящные решения из нескольких строк кода. Сегодня я поделюсь всем, что нужно знать о Flexbox — от базовых принципов до продвинутых техник создания адаптивных интерфейсов. Готовы превратить хаос вёрстки в стройную систему? 🚀
Flexbox: что это и почему он упрощает CSS-вёрстку
Flexbox (Flexible Box Layout) — это модуль CSS, созданный специально для упрощения расположения элементов в одномерном пространстве. В отличие от традиционных методов вёрстки, которые часто требуют сложных хаков и обходных путей, Flexbox предлагает интуитивно понятную модель для создания гибких и предсказуемых макетов.
До появления Flexbox веб-разработчики использовали различные методы для создания многоколоночных макетов:
- Таблицы (устаревший подход, смешивающий структуру и представление)
- Float (требует явного очищения потока, сложен для вертикального выравнивания)
- Inline-block (проблемы с пробелами между элементами)
- Позиционирование (абсолютное позиционирование вырывает элементы из потока)
Алексей Петров, технический директор
В 2018 году наша команда работала над редизайном популярного новостного портала. Клиент требовал сетку новостей с равными по высоте карточками, но с заголовками разной длины. Когда мы использовали float, карточки выглядели как зубы крокодила — неровными и хаотичными.
Переход на Flexbox занял буквально 15 минут, а вёрстка стала не только аккуратнее, но и адаптивной без дополнительных ухищрений. Клиент был в восторге, а наши разработчики освободились от поддержки сотен строк костылей. Это был переломный момент, когда мы полностью перешли на Flexbox в новых проектах.
Flexbox решает множество проблем, с которыми ежедневно сталкиваются веб-разработчики:
| Проблема | Решение с Flexbox |
|---|---|
| Вертикальное выравнивание | Простое центрирование по вертикали с помощью align-items: center |
| Равные высоты колонок | Контейнер Flexbox автоматически уравнивает высоту элементов |
| Изменение порядка элементов | Свойство order позволяет менять порядок без изменения HTML |
| Распределение пространства | Простое распределение с justify-content и align-items |
Преимущества использования Flexbox:
- 🔄 Адаптивность — элементы легко подстраиваются под доступное пространство
- 🎯 Направление — возможность менять направление оси (горизонтальное/вертикальное)
- ⚖️ Порядок — переопределение визуального порядка элементов без изменения HTML
- 📏 Выравнивание — простое выравнивание элементов по основной и поперечной осям
- 📊 Распределение пространства — гибкое распределение свободного пространства между элементами
Поддержка Flexbox сейчас практически повсеместна — более 98% браузеров поддерживают эту технологию без префиксов, что делает её безопасным выбором для большинства проектов.

Базовая анатомия Flexbox: контейнеры и элементы
Модель Flexbox строится вокруг двух ключевых концепций: flex-контейнер (родительский элемент) и flex-элементы (дочерние элементы). Понимание их взаимодействия критически важно для эффективного использования Flexbox.
Flex-контейнер — это элемент, к которому применяется свойство display: flex или display: inline-flex. Все его прямые дочерние элементы автоматически становятся flex-элементами.
Создание базового flex-контейнера:
.container {
display: flex; /* или inline-flex */
}
После объявления flex-контейнера необходимо понять две оси, вдоль которых выстраиваются элементы:
- Главная ось (main axis) — по умолчанию горизонтальная, идёт слева направо
- Поперечная ось (cross axis) — по умолчанию вертикальная, идёт сверху вниз
Направление главной оси определяется свойством flex-direction:
row(по умолчанию) — элементы размещаются в строку слева направоrow-reverse— элементы размещаются в строку справа налевоcolumn— элементы размещаются в столбец сверху внизcolumn-reverse— элементы размещаются в столбец снизу вверх
| Компонент Flexbox | CSS-свойство | Применяется к |
|---|---|---|
| Контейнер | display: flex | Родительскому элементу |
| Направление | flex-direction | Контейнеру |
| Перенос | flex-wrap | Контейнеру |
| Размер элемента | flex-grow, flex-shrink, flex-basis | Flex-элементам |
| Выравнивание | justify-content, align-items | Контейнеру |
Когда элементов становится слишком много для одной строки или столбца, используется свойство flex-wrap:
.container {
display: flex;
flex-wrap: wrap; /* элементы переносятся на новую строку при необходимости */
}
Для flex-элементов важно понимать три ключевых свойства, контролирующих их размер и поведение:
flex-grow— определяет, насколько элемент может расширяться относительно других элементов (число ≥ 0)flex-shrink— определяет, насколько элемент может сжиматься относительно других элементов (число ≥ 0)flex-basis— устанавливает начальный размер элемента перед распределением свободного пространства
Эти свойства часто объединяются в сокращённое свойство flex:
.item {
flex: 1 0 200px; /* grow shrink basis */
}
Часто используемые значения свойства flex:
flex: 1— элемент может растягиваться и занимает всё доступное пространство поровну с другими элементамиflex: 0 0 auto— элемент не растягивается и не сжимается, размер определяется содержимымflex: 0 0 200px— элемент имеет фиксированную ширину 200px и не меняет размер
Понимание взаимодействия контейнера и элементов — основа для создания сложных и гибких макетов с Flexbox.
Главные свойства Flexbox для профессиональной вёрстки
Профессиональное владение Flexbox подразумевает глубокое понимание всех его свойств и их взаимодействия. Рассмотрим ключевые свойства, которые используются при создании сложных макетов.
Свойства контейнера:
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-контейнере (работает только приflex-wrap: wrap):flex-start— строки прижимаются к началу поперечной осиflex-end— строки прижимаются к концу поперечной осиcenter— строки центрируются вдоль поперечной осиstretch(по умолчанию) — строки растягиваются, заполняя контейнерspace-between— строки равномерно распределяются, первая у начала, последняя у концаspace-around— строки равномерно распределяются с равными отступами вокруг
Свойства flex-элементов:
order— меняет порядок следования элемента (по умолчанию 0):
.item {
order: -1; /* элемент появится перед всеми с order: 0 */
}
align-self— переопределяет выравнивание для отдельного элемента:
.special-item {
align-self: center; /* только этот элемент будет центрирован */
}
flex-grow,flex-shrink,flex-basis— контролируют размеры элемента:
.item {
flex: 2 1 300px; /* растёт в 2 раза быстрее других, сжимается как все, начальный размер 300px */
}
Игорь Соколов, фронтенд-архитектор
Я работал над проектом онлайн-маркетплейса, где требовалось создать сетку товаров с фильтрами, которая должна была безупречно работать на всех устройствах от телефона до 4K-мониторов. Первая версия использовала CSS Grid для основной сетки.
Проблемы начались, когда заказчик захотел, чтобы при наведении карточки товара увеличивались и перекрывали соседние. Grid не справлялся с этой задачей. Мы переписали сетку на Flexbox с комбинацией свойств flex-grow и z-index. Это позволило карточкам плавно увеличиваться при наведении и возвращаться в исходное состояние, сохраняя при этом полную адаптивность. Ключом стало использование media-queries для корректировки свойств flex-basis на разных разрешениях экрана.
Примеры продвинутых техник с использованием Flexbox:
Равномерное распределение с переменным количеством элементов:
.container {
display: flex;
flex-wrap: wrap;
}
.item {
flex: 1 1 200px; /* Минимум 200px, но может растягиваться */
margin: 10px;
}
Прилипающий футер (sticky footer):
body {
display: flex;
flex-direction: column;
min-height: 100vh;
}
main {
flex: 1;
}
footer {
flex-shrink: 0;
}
Центрирование элемента по горизонтали и вертикали:
.container {
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
}
Построение адаптивных макетов с помощью Flexbox
Адаптивная вёрстка — одно из главных преимуществ Flexbox. Благодаря своей гибкости, Flexbox позволяет создавать макеты, которые естественным образом адаптируются к различным размерам экрана без необходимости писать множество медиа-запросов.
Рассмотрим основные стратегии создания адаптивных интерфейсов с Flexbox:
1. Гибкие размеры с flex-basis и медиа-запросами
Гибкое распределение элементов в зависимости от доступного пространства:
.card-container {
display: flex;
flex-wrap: wrap;
}
.card {
flex: 1 1 300px; /* Начальный размер 300px с возможностью расти и сжиматься */
margin: 10px;
}
@media (max-width: 768px) {
.card {
flex-basis: 100%; /* На маленьких экранах карточки занимают всю ширину */
}
}
2. Изменение направления flex-direction
Переключение между горизонтальным и вертикальным расположением:
.navigation {
display: flex;
flex-direction: row;
}
@media (max-width: 768px) {
.navigation {
flex-direction: column; /* Переключение на вертикальное меню на мобильных */
}
}
3. Переупорядочивание элементов с order
Изменение порядка элементов без изменения HTML-структуры:
.container {
display: flex;
flex-wrap: wrap;
}
.sidebar {
flex: 1 0 200px;
order: 2;
}
.main-content {
flex: 3 0 400px;
order: 1;
}
@media (max-width: 768px) {
.sidebar {
order: 1; /* Боковая панель первая на мобильных */
}
.main-content {
order: 2; /* Основной контент второй на мобильных */
}
}
4. Адаптивные макеты с использованием "Holy Grail" (Святой Грааль)
Классический макет сайта с шапкой, футером, контентом и двумя боковыми колонками:
body {
display: flex;
flex-direction: column;
min-height: 100vh;
}
header, footer {
flex: 0 0 auto;
}
.content-wrapper {
display: flex;
flex: 1;
}
.content {
flex: 1;
}
.left-sidebar, .right-sidebar {
flex: 0 0 200px;
}
@media (max-width: 768px) {
.content-wrapper {
flex-direction: column;
}
.left-sidebar, .right-sidebar {
flex-basis: auto;
}
}
| Размер экрана | Стратегия адаптации | Рекомендуемые свойства Flexbox |
|---|---|---|
| Большие экраны (>1200px) | Многоколоночные макеты с фиксированными размерами колонок | flex-basis с точными значениями, flex-grow: 0 |
| Средние экраны (768px – 1200px) | Адаптивное распределение доступного пространства | flex-grow: 1, flex-basis с процентными значениями |
| Маленькие экраны (<768px) | Вертикальное расположение блоков, переопределение порядка | flex-direction: column, order, flex-basis: 100% |
| Мобильные устройства (<480px) | Максимальное упрощение, скрытие второстепенных элементов | flex: 1 0 100%, использование медиа-запросов для display: none |
5. Создание адаптивной сетки карточек
Сетка карточек, которая автоматически перестраивается в зависимости от размера экрана:
.card-grid {
display: flex;
flex-wrap: wrap;
margin: -10px; /* Компенсируем внутренние отступы карточек */
}
.card {
flex: 1 1 300px; /* Начальный размер 300px */
margin: 10px;
max-width: calc(50% – 20px); /* Максимум 2 карточки в ряд на средних экранах */
}
@media (max-width: 768px) {
.card {
max-width: 100%; /* Одна карточка в ряд на мобильных */
}
}
@media (min-width: 1200px) {
.card {
max-width: calc(33.333% – 20px); /* До 3 карточек в ряд на больших экранах */
}
}
Ключевые практики для создания адаптивных макетов с Flexbox:
- Используйте
flex-wrap: wrapдля автоматического переноса элементов - Комбинируйте
flex-basisсmin-widthиmax-widthдля лучшего контроля - Применяйте
flex-direction: columnна мобильных устройствах - Используйте
orderдля изменения визуального порядка элементов на разных устройствах - Минимизируйте количество медиа-запросов, позволяя Flexbox делать большую часть работы
Практикум: решение типичных задач вёрстки с Flexbox
Рассмотрим практические примеры решения типичных задач вёрстки с использованием Flexbox. Каждый пример включает описание задачи, решение и код, который можно сразу применить в проектах.
Задача 1: Идеальное центрирование по вертикали и горизонтали
Задача центрирования элементов была одной из самых сложных в CSS до появления Flexbox. Теперь это делается в три строки кода:
.container {
display: flex;
justify-content: center; /* горизонтальное центрирование */
align-items: center; /* вертикальное центрирование */
height: 100vh; /* занимаем всю высоту экрана */
}
Задача 2: Меню с равномерно распределёнными пунктами
.menu {
display: flex;
justify-content: space-between; /* равномерное распределение */
padding: 0;
list-style: none;
}
.menu-item {
padding: 10px 15px;
}
/* Для адаптивности */
@media (max-width: 768px) {
.menu {
flex-direction: column;
}
}
Задача 3: Макет с фиксированным сайдбаром и адаптивным контентом
.page-container {
display: flex;
min-height: 100vh;
}
.sidebar {
flex: 0 0 250px; /* фиксированная ширина 250px */
background: #f5f5f5;
}
.content {
flex: 1; /* занимает всё оставшееся пространство */
padding: 20px;
}
@media (max-width: 768px) {
.page-container {
flex-direction: column;
}
.sidebar {
flex-basis: auto; /* автоматическая высота на мобильных */
}
}
Задача 4: Карточки одинаковой высоты с разным содержимым
.card-container {
display: flex;
flex-wrap: wrap;
gap: 20px; /* современный способ добавления отступов */
}
.card {
display: flex;
flex-direction: column;
flex: 1 1 300px;
border: 1px solid #ddd;
border-radius: 4px;
}
.card-header {
padding: 15px;
background: #f5f5f5;
}
.card-body {
flex: 1; /* этот блок растянется, чтобы все карточки имели одинаковую высоту */
padding: 15px;
}
.card-footer {
padding: 15px;
border-top: 1px solid #ddd;
}
Задача 5: "Липкий" футер, всегда прижатый к низу страницы
body {
display: flex;
flex-direction: column;
min-height: 100vh; /* минимальная высота – высота экрана */
margin: 0;
}
.content {
flex: 1; /* растягивается, чтобы заполнить доступное пространство */
}
.footer {
padding: 20px;
background: #333;
color: white;
}
Задача 6: Галерея изображений с адаптивной сеткой
.gallery {
display: flex;
flex-wrap: wrap;
gap: 10px;
}
.gallery-item {
height: 250px;
flex-grow: 1;
flex-basis: 200px; /* минимальная ширина */
}
.gallery-item img {
width: 100%;
height: 100%;
object-fit: cover; /* изображения заполняют контейнер без искажений */
border-radius: 4px;
}
Задача 7: Форма с выравниванием лейблов и инпутов
.form-row {
display: flex;
margin-bottom: 15px;
align-items: center;
}
.form-label {
flex: 0 0 120px; /* фиксированная ширина для всех лейблов */
}
.form-input {
flex: 1; /* занимает оставшееся пространство */
padding: 8px;
}
@media (max-width: 768px) {
.form-row {
flex-direction: column;
align-items: stretch;
}
.form-label {
flex-basis: auto;
margin-bottom: 5px;
}
}
Задача 8: Ценовые планы с выделенным рекомендуемым вариантом
.pricing-container {
display: flex;
flex-wrap: wrap;
gap: 20px;
justify-content: center;
}
.pricing-plan {
display: flex;
flex-direction: column;
flex: 1 1 300px;
max-width: 350px;
border: 1px solid #ddd;
border-radius: 4px;
padding: 20px;
}
.pricing-plan.featured {
transform: scale(1.05);
border-color: #3498db;
box-shadow: 0 0 15px rgba(0,0,0,0.1);
z-index: 1; /* выносим наверх, чтобы перекрывал соседние элементы */
}
.pricing-header {
text-align: center;
margin-bottom: 20px;
}
.pricing-features {
flex: 1;
margin-bottom: 20px;
}
.pricing-action {
text-align: center;
}
При решении задач вёрстки с Flexbox помните о нескольких ключевых принципах:
- 🤔 Определите основную ось макета (горизонтальная или вертикальная)
- 📱 Продумайте поведение на разных устройствах заранее
- 🔄 Используйте flex-wrap для многострочных макетов
- ⚖️ Учитывайте содержимое при задании flex-basis
- 📊 Используйте flex-grow и flex-shrink для контроля распределения пространства
- 🧪 Тестируйте на различных размерах экрана
Flexbox радикально изменил подход к созданию веб-интерфейсов, сделав возможными макеты, которые раньше требовали сложных хаков и костылей. Мощь Flexbox проявляется не в отдельных свойствах, а в системном подходе к расположению элементов. Освоение этой технологии открывает новые горизонты, позволяя сосредоточиться не на борьбе с браузером, а на творческих задачах. Комбинируйте Flexbox с CSS Grid для создания по-настоящему впечатляющих интерфейсов, и вы никогда не вернётесь к старым методам вёрстки.
Владимир Лисицын
разработчик фронтенда