Flexbox в CSS: полное руководство с примерами для новичков
#Веб-разработка #CSS и верстка #Фронтенд CSSДля кого эта статья:
- Новички в веб-разработке, которым необходимо освоить основы CSS и Flexbox.
- Опытные разработчики, желающие усовершенствовать свои навыки адаптивной верстки.
- Преподаватели и тренеры, занимающиеся обучением веб-разработке.
Верстка веб-страниц перестала быть головной болью с появлением CSS Flexbox. Этот инструмент позволяет разработчику контролировать расположение элементов на странице с минимальными усилиями. 😎 Помните мучения с float и clearfix? Забудьте о них! Flexbox предоставляет элегантное решение для создания адаптивных макетов без танцев с бубном. Независимо от того, новичок вы в веб-разработке или опытный кодер, желающий оптимизировать свои навыки, это руководство проведет вас через все аспекты Flexbox — от базовых концепций до продвинутых техник верстки.
Что такое Flexbox: основные принципы и концепции
Flexbox (Flexible Box Layout) — это модуль CSS, разработанный для упрощения создания гибких и адаптивных макетов. Он решает проблемы, связанные с выравниванием элементов, распределением пространства и изменением размеров, которые были сложно решаемы с традиционными методами верстки.
Основная идея Flexbox заключается в возможности изменять ширину и высоту элементов, чтобы наилучшим образом заполнить доступное пространство. Это особенно полезно для адаптивных дизайнов, где макет должен подстраиваться под различные размеры экранов.
Прежде чем погрузиться в детали, важно понять ключевую терминологию:
- Flex-контейнер — родительский элемент с установленным свойством
display: flexилиdisplay: inline-flex - Flex-элементы — прямые потомки flex-контейнера
- Главная ось (main axis) — основное направление, вдоль которого располагаются flex-элементы
- Поперечная ось (cross axis) — ось, перпендикулярная главной
Создание flex-контейнера предельно просто:
.container {
display: flex;
}
После этого все прямые потомки данного контейнера автоматически становятся flex-элементами и выстраиваются в ряд (по умолчанию слева направо).
| Традиционные методы верстки | Flexbox |
|---|---|
| Сложное выравнивание по вертикали | Простое выравнивание с помощью align-items |
| Проблемы с пропорциональным распределением пространства | Интуитивное распределение с flex-grow и flex-shrink |
| Ограниченная адаптивность без медиа-запросов | Встроенная адаптивность |
| Необходимость в очистке потоков (clearfix) | Отсутствие проблем с потоками |
Анна Петрова, фронтенд-разработчик
Помню свой первый серьезный проект — корпоративный сайт для клиента из финансового сектора. Требования были высокими: сайт должен идеально отображаться на всех устройствах и поддерживать все браузеры, включая IE11.
Я начала верстку с использованием традиционных методов — float и position. Бесконечные часы отладки и попытки выровнять элементы превратились в кошмар. Верстка рассыпалась при малейшем изменении контента.
Когда сроки начали гореть, я решила рискнуть и переписать ключевые компоненты на Flexbox. Результат превзошел все ожидания — код стал чище, логичнее, а верстка держалась как влитая даже при динамическом контенте.
Клиент был в восторге от скорости работы сайта и его идеальной адаптивности. С тех пор Flexbox стал моим основным инструментом, который экономит десятки часов на каждом проекте.

Flex-контейнер и его свойства для управления макетом
Flex-контейнер — это основа всей системы Flexbox. Именно его свойства определяют, как будут располагаться дочерние элементы. Рассмотрим ключевые свойства, которые можно применить к контейнеру для точного управления макетом. 🧩
1. flex-direction — задает направление главной оси:
.container {
display: flex;
flex-direction: row; /* значение по умолчанию */
}
Возможные значения:
row— элементы располагаются в строку (слева направо)row-reverse— элементы располагаются в строку (справа налево)column— элементы располагаются в столбец (сверху вниз)column-reverse— элементы располагаются в столбец (снизу вверх)
2. flex-wrap — определяет, должны ли элементы располагаться в одну линию или могут переноситься:
.container {
display: flex;
flex-wrap: nowrap; /* значение по умолчанию */
}
Возможные значения:
nowrap— все элементы в одной линии, даже если они не помещаютсяwrap— элементы переносятся на новую строку при необходимостиwrap-reverse— перенос строк в обратном порядке
3. flex-flow — сокращенная запись для flex-direction и flex-wrap:
.container {
display: flex;
flex-flow: row wrap;
}
4. justify-content — выравнивание элементов вдоль главной оси:
.container {
display: flex;
justify-content: flex-start; /* значение по умолчанию */
}
Возможные значения:
flex-start— элементы прижимаются к началу контейнераflex-end— элементы прижимаются к концу контейнераcenter— элементы центрируются по главной осиspace-between— равномерное распределение с прижатием крайних элементов к краямspace-around— равномерное распределение с одинаковым пространством вокруг каждого элементаspace-evenly— равномерное распределение с одинаковыми отступами между всеми элементами
5. align-items — выравнивание элементов вдоль поперечной оси:
.container {
display: flex;
align-items: stretch; /* значение по умолчанию */
}
Возможные значения:
stretch— элементы растягиваются, чтобы заполнить контейнерflex-start— элементы выравниваются по началу поперечной осиflex-end— элементы выравниваются по концу поперечной осиcenter— элементы центрируются по поперечной осиbaseline— элементы выравниваются по базовой линии текста
6. align-content — распределение пространства вдоль поперечной оси при наличии нескольких строк:
.container {
display: flex;
flex-wrap: wrap;
align-content: stretch; /* значение по умолчанию */
}
Это свойство работает только если есть несколько строк flex-элементов (когда используется flex-wrap: wrap).
| Свойство | Ось применения | Наиболее частое применение | Сложность освоения |
|---|---|---|---|
| flex-direction | Определяет оси | Изменение направления потока элементов | Низкая |
| flex-wrap | Влияет на обе оси | Адаптивные макеты с переполнением | Низкая |
| justify-content | Главная ось | Выравнивание навигации, распределение карточек | Средняя |
| align-items | Поперечная ось | Центрирование элементов, выравнивание в строке | Средняя |
| align-content | Поперечная ось | Галереи изображений, сетки карточек | Высокая |
Flex-элементы: настройка отображения дочерних блоков
Flex-элементы — это дочерние элементы flex-контейнера, которые можно настраивать индивидуально. Это позволяет создавать сложные макеты с разным поведением отдельных компонентов. 🧠
Рассмотрим основные свойства, применимые к flex-элементам:
1. order — изменяет порядок отображения элемента:
.item {
order: 0; /* значение по умолчанию */
}
Чем меньше значение, тем раньше элемент будет отображаться в контейнере. Элементы с одинаковым значением order отображаются в порядке их появления в HTML.
2. flex-grow — определяет, как элемент будет расти относительно других элементов:
.item {
flex-grow: 0; /* значение по умолчанию */
}
Значение указывает на пропорцию распределения свободного пространства. Если все элементы имеют flex-grow: 1, они займут равное пространство. Если один элемент имеет flex-grow: 2, он займет вдвое больше места, чем элементы с flex-grow: 1.
3. flex-shrink — определяет, насколько элемент будет сжиматься относительно других:
.item {
flex-shrink: 1; /* значение по умолчанию */
}
Чем больше значение, тем сильнее элемент будет сжиматься при нехватке пространства.
4. flex-basis — устанавливает начальный размер элемента перед применением flex-grow и flex-shrink:
.item {
flex-basis: auto; /* значение по умолчанию */
}
Может принимать значения в пикселях, процентах или ключевое слово auto (размер будет определяться содержимым).
5. flex — сокращенная запись для flex-grow, flex-shrink и flex-basis:
.item {
flex: 0 1 auto; /* значение по умолчанию */
}
Часто используемые комбинации:
flex: 1;— эквивалентноflex: 1 1 0%;(элемент может расти и сжиматься)flex: auto;— эквивалентноflex: 1 1 auto;(элемент растет и сжимается, учитывая содержимое)flex: none;— эквивалентноflex: 0 0 auto;(элемент не растет и не сжимается)
6. align-self — переопределяет align-items для конкретного flex-элемента:
.item {
align-self: auto; /* значение по умолчанию */
}
Принимает те же значения, что и align-items, плюс auto (используется значение align-items контейнера).
Например, чтобы создать гибкий макет с одним доминирующим элементом:
.container {
display: flex;
}
.sidebar {
flex: 0 0 250px; /* фиксированная ширина 250px */
}
.main-content {
flex: 1; /* занимает все доступное пространство */
}
Дмитрий Соколов, тренер по веб-разработке
На моем курсе для новичков была студентка Мария, которая никак не могла освоить верстку. Особенно ее раздражали непредсказуемые отступы и выравнивание элементов. Каждый раз, когда она пыталась создать что-то более сложное, чем простой текстовый блок, верстка "разваливалась".
На одном из занятий я показал группе принцип работы flex-элементов. Особенно подробно остановился на свойстве flex: 1, которое так магически решает проблему распределения пространства.
После занятия Мария осталась и переделала свой проект, используя Flexbox. То, что раньше требовало десятки строк CSS и множество вложенных div'ов, теперь решалось буквально несколькими строками.
Через неделю она прислала мне сообщение с фотографией своего нового портфолио-сайта. Сайт был адаптивным, с идеальными отступами и выравниванием. В сообщении было только: "Flex-grow и flex-shrink изменили мою жизнь".
Именно тогда я понял, что правильное понимание flex-элементов — это тот переломный момент, когда новичок перестает бороться с CSS и начинает им управлять.
Выравнивание и распределение элементов внутри Flexbox
Одна из самых мощных особенностей Flexbox — возможность простого выравнивания и распределения элементов. 💪 Это решает многие проблемы верстки, которые раньше требовали сложных трюков с отрицательными отступами или абсолютным позиционированием.
Выравнивание по главной оси
Свойство justify-content контролирует выравнивание элементов по главной оси (горизонтально при стандартном направлении row):
justify-content: flex-start;— элементы выравниваются к началу контейнераjustify-content: flex-end;— элементы выравниваются к концу контейнераjustify-content: center;— элементы центрируютсяjustify-content: space-between;— элементы равномерно распределяются с крайними элементами у границjustify-content: space-around;— элементы равномерно распределяются с половинным отступом у краёвjustify-content: space-evenly;— элементы равномерно распределяются с одинаковым отступом между всеми
Пример центрирования элементов по горизонтали:
.navigation {
display: flex;
justify-content: center;
}
Выравнивание по поперечной оси
Свойство align-items управляет выравниванием элементов по поперечной оси (вертикально при направлении row):
align-items: stretch;— элементы растягиваются, чтобы заполнить контейнер (по умолчанию)align-items: flex-start;— элементы выравниваются по верхнему краю контейнераalign-items: flex-end;— элементы выравниваются по нижнему краю контейнераalign-items: center;— элементы центрируются вертикальноalign-items: baseline;— элементы выравниваются по базовой линии текста
Для индивидуального выравнивания используйте align-self для конкретного элемента:
.special-item {
align-self: flex-end;
}
Центрирование элемента по обеим осям
Одна из самых популярных задач в CSS — центрирование элемента как по горизонтали, так и по вертикали. С Flexbox это становится тривиальной задачей:
.container {
display: flex;
justify-content: center;
align-items: center;
height: 100vh; /* задаем высоту контейнера */
}
Распределение пространства между несколькими строками
Если у вас есть несколько строк flex-элементов (при использовании flex-wrap: wrap), свойство align-content определяет, как эти строки распределяются по поперечной оси:
align-content: flex-start;— строки прижимаются к началу контейнераalign-content: flex-end;— строки прижимаются к концу контейнераalign-content: center;— строки центрируютсяalign-content: space-between;— строки равномерно распределяются с первой строкой вверху и последней внизуalign-content: space-around;— строки равномерно распределяются с половинным отступом сверху и снизуalign-content: stretch;— строки растягиваются, чтобы занять всё пространство (по умолчанию)
Пример создания галереи изображений с равномерным распределением пространства:
.gallery {
display: flex;
flex-wrap: wrap;
justify-content: space-between;
align-content: space-between;
}
.gallery-item {
flex: 0 0 32%; /* каждый элемент занимает примерно треть контейнера */
margin-bottom: 2%;
}
Решение распространенных задач выравнивания
- Прижатие элемента к правому краю: Иногда нужно, чтобы один элемент был прижат вправо, а остальные — влево:
.navbar {
display: flex;
}
.logo {
/* стандартное поведение */
}
.login-button {
margin-left: auto; /* "волшебное" свойство, прижимающее элемент вправо */
}
- Выравнивание последней строки: При использовании flex-wrap элементы в последней строке могут выглядеть неаккуратно, если их количество отличается от предыдущих строк:
.gallery {
display: flex;
flex-wrap: wrap;
justify-content: space-between;
}
.gallery::after {
content: "";
flex: 0 0 32%; /* такая же ширина, как у элементов галереи */
}
Это создает невидимый элемент, который "подталкивает" последний ряд влево, если в нем не хватает элементов для заполнения строки.
Практические задачи и решения с использованием Flexbox
Теория — это хорошо, но практика — лучше. Давайте рассмотрим несколько типичных задач верстки и их решения с использованием Flexbox. 🛠️
Задача 1: Создание отзывчивой навигационной панели
.navbar {
display: flex;
justify-content: space-between;
align-items: center;
padding: 10px 20px;
}
.logo {
flex: 0 0 auto; /* логотип не растягивается и не сжимается */
}
.nav-links {
display: flex;
gap: 20px; /* современная альтернатива отступам между элементами */
}
@media (max-width: 768px) {
.navbar {
flex-direction: column;
}
.nav-links {
margin-top: 10px;
width: 100%;
justify-content: space-around;
}
}
В этом примере навигационная панель автоматически адаптируется к ширине экрана: на больших экранах элементы расположены горизонтально, а на маленьких — вертикально.
Задача 2: Карточки одинаковой высоты
Классическая проблема — создание сетки карточек с разным содержимым, но одинаковой высотой:
.card-container {
display: flex;
flex-wrap: wrap;
gap: 20px;
}
.card {
flex: 1 0 300px; /* растягивается, не сжимается, базовая ширина 300px */
display: flex;
flex-direction: column;
}
.card-body {
flex-grow: 1; /* растягивается, чтобы занять доступное пространство */
}
.card-footer {
margin-top: auto; /* прижимает подвал карточки к низу */
}
Этот подход обеспечивает, что все карточки будут одинаковой высоты, а футер каждой карточки будет прижат к низу, независимо от объема контента.
Задача 3: Макет "Святой Грааль" (Holy Grail Layout)
Классический макет с шапкой, подвалом, центральным содержимым и двумя боковыми панелями:
body {
display: flex;
flex-direction: column;
min-height: 100vh; /* заставляет body растянуться на весь экран */
}
header, footer {
flex: 0 0 auto; /* не растягиваются и не сжимаются */
}
.main-container {
display: flex;
flex: 1; /* занимает все доступное пространство */
}
.sidebar-left {
flex: 0 0 200px; /* фиксированная ширина */
}
.content {
flex: 1; /* занимает все доступное пространство */
}
.sidebar-right {
flex: 0 0 200px; /* фиксированная ширина */
}
@media (max-width: 768px) {
.main-container {
flex-direction: column;
}
.sidebar-left, .sidebar-right {
flex: 0 0 auto;
}
}
Задача 4: Выравнивание последнего элемента формы
Часто нужно, чтобы кнопка отправки формы была выровнена по правому краю:
.form {
display: flex;
flex-direction: column;
}
.form-row {
display: flex;
margin-bottom: 15px;
}
.form-label {
flex: 0 0 150px; /* фиксированная ширина для меток */
}
.form-input {
flex: 1; /* занимает оставшееся пространство */
}
.form-buttons {
display: flex;
justify-content: flex-end; /* выравнивает кнопки по правому краю */
}
Задача 5: Сложная сетка с элементами разной ширины
Создание динамической сетки с элементами, которые занимают разное количество "столбцов":
.grid {
display: flex;
flex-wrap: wrap;
gap: 10px;
}
.grid-item {
flex: 1 0 calc(25% – 10px); /* базовая ширина — четверть контейнера */
}
.grid-item.double {
flex-basis: calc(50% – 10px); /* занимает половину контейнера */
}
.grid-item.triple {
flex-basis: calc(75% – 10px); /* занимает три четверти контейнера */
}
@media (max-width: 768px) {
.grid-item {
flex-basis: calc(50% – 10px); /* на меньших экранах — половина */
}
.grid-item.double, .grid-item.triple {
flex-basis: 100%; /* на маленьких экранах — вся ширина */
}
}
| Распространенные задачи | Решение с Flexbox | Альтернативное решение | Преимущество Flexbox |
|---|---|---|---|
| Вертикальное центрирование | align-items: center; | transform: translateY(-50%); | Простота, нет искажений |
| Равные колонки | display: flex; | float + clearfix | Автоматическая высота |
| Прижатый футер | flex с min-height: 100vh | Отрицательные margin | Чистый и понятный код |
| Адаптивное меню | flex-direction изменение | JavaScript переключение | Чистый CSS без JS |
| Выравнивание по базовой линии | align-items: baseline; | Вертикальное позиционирование | Автоматическое выравнивание |
Flexbox — это не просто набор CSS-свойств, а мощный инструмент, который меняет подход к созданию веб-макетов. Освоив принципы работы flex-контейнеров и flex-элементов, вы откроете новые возможности для реализации даже самых сложных дизайнерских задумок. Начните с простых примеров, постепенно добавляя сложность, и вскоре вы увидите, как задачи, которые раньше требовали хитрых обходных путей, решаются элегантно и интуитивно. Самое время применить полученные знания в своем следующем проекте!
Владимир Лисицын
разработчик фронтенда