Flexbox в CSS: полное руководство с примерами для новичков
Перейти

Flexbox в CSS: полное руководство с примерами для новичков

#Веб-разработка  #CSS и верстка  #Фронтенд CSS  
Пройдите тест, узнайте какой профессии подходите
Сколько вам лет
0%
До 18
От 18 до 24
От 25 до 34
От 35 до 44
От 45 до 49
От 50 до 54
Больше 55

Для кого эта статья:

  • Новички в веб-разработке, которым необходимо освоить основы 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-контейнера предельно просто:

CSS
Скопировать код
.container {
display: flex;
}

После этого все прямые потомки данного контейнера автоматически становятся flex-элементами и выстраиваются в ряд (по умолчанию слева направо).

Традиционные методы верстки Flexbox
Сложное выравнивание по вертикали Простое выравнивание с помощью align-items
Проблемы с пропорциональным распределением пространства Интуитивное распределение с flex-grow и flex-shrink
Ограниченная адаптивность без медиа-запросов Встроенная адаптивность
Необходимость в очистке потоков (clearfix) Отсутствие проблем с потоками

Анна Петрова, фронтенд-разработчик

Помню свой первый серьезный проект — корпоративный сайт для клиента из финансового сектора. Требования были высокими: сайт должен идеально отображаться на всех устройствах и поддерживать все браузеры, включая IE11.

Я начала верстку с использованием традиционных методов — float и position. Бесконечные часы отладки и попытки выровнять элементы превратились в кошмар. Верстка рассыпалась при малейшем изменении контента.

Когда сроки начали гореть, я решила рискнуть и переписать ключевые компоненты на Flexbox. Результат превзошел все ожидания — код стал чище, логичнее, а верстка держалась как влитая даже при динамическом контенте.

Клиент был в восторге от скорости работы сайта и его идеальной адаптивности. С тех пор Flexbox стал моим основным инструментом, который экономит десятки часов на каждом проекте.

Пошаговый план для смены профессии

Flex-контейнер и его свойства для управления макетом

Flex-контейнер — это основа всей системы Flexbox. Именно его свойства определяют, как будут располагаться дочерние элементы. Рассмотрим ключевые свойства, которые можно применить к контейнеру для точного управления макетом. 🧩

1. flex-direction — задает направление главной оси:

CSS
Скопировать код
.container {
display: flex;
flex-direction: row; /* значение по умолчанию */
}

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

  • row — элементы располагаются в строку (слева направо)
  • row-reverse — элементы располагаются в строку (справа налево)
  • column — элементы располагаются в столбец (сверху вниз)
  • column-reverse — элементы располагаются в столбец (снизу вверх)

2. flex-wrap — определяет, должны ли элементы располагаться в одну линию или могут переноситься:

CSS
Скопировать код
.container {
display: flex;
flex-wrap: nowrap; /* значение по умолчанию */
}

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

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

3. flex-flow — сокращенная запись для flex-direction и flex-wrap:

CSS
Скопировать код
.container {
display: flex;
flex-flow: row wrap;
}

4. justify-content — выравнивание элементов вдоль главной оси:

CSS
Скопировать код
.container {
display: flex;
justify-content: flex-start; /* значение по умолчанию */
}

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

  • flex-start — элементы прижимаются к началу контейнера
  • flex-end — элементы прижимаются к концу контейнера
  • center — элементы центрируются по главной оси
  • space-between — равномерное распределение с прижатием крайних элементов к краям
  • space-around — равномерное распределение с одинаковым пространством вокруг каждого элемента
  • space-evenly — равномерное распределение с одинаковыми отступами между всеми элементами

5. align-items — выравнивание элементов вдоль поперечной оси:

CSS
Скопировать код
.container {
display: flex;
align-items: stretch; /* значение по умолчанию */
}

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

  • stretch — элементы растягиваются, чтобы заполнить контейнер
  • flex-start — элементы выравниваются по началу поперечной оси
  • flex-end — элементы выравниваются по концу поперечной оси
  • center — элементы центрируются по поперечной оси
  • baseline — элементы выравниваются по базовой линии текста

6. align-content — распределение пространства вдоль поперечной оси при наличии нескольких строк:

CSS
Скопировать код
.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 — изменяет порядок отображения элемента:

CSS
Скопировать код
.item {
order: 0; /* значение по умолчанию */
}

Чем меньше значение, тем раньше элемент будет отображаться в контейнере. Элементы с одинаковым значением order отображаются в порядке их появления в HTML.

2. flex-grow — определяет, как элемент будет расти относительно других элементов:

CSS
Скопировать код
.item {
flex-grow: 0; /* значение по умолчанию */
}

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

3. flex-shrink — определяет, насколько элемент будет сжиматься относительно других:

CSS
Скопировать код
.item {
flex-shrink: 1; /* значение по умолчанию */
}

Чем больше значение, тем сильнее элемент будет сжиматься при нехватке пространства.

4. flex-basis — устанавливает начальный размер элемента перед применением flex-grow и flex-shrink:

CSS
Скопировать код
.item {
flex-basis: auto; /* значение по умолчанию */
}

Может принимать значения в пикселях, процентах или ключевое слово auto (размер будет определяться содержимым).

5. flex — сокращенная запись для flex-grow, flex-shrink и flex-basis:

CSS
Скопировать код
.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-элемента:

CSS
Скопировать код
.item {
align-self: auto; /* значение по умолчанию */
}

Принимает те же значения, что и align-items, плюс auto (используется значение align-items контейнера).

Например, чтобы создать гибкий макет с одним доминирующим элементом:

CSS
Скопировать код
.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; — элементы равномерно распределяются с одинаковым отступом между всеми

Пример центрирования элементов по горизонтали:

CSS
Скопировать код
.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 для конкретного элемента:

CSS
Скопировать код
.special-item {
align-self: flex-end;
}

Центрирование элемента по обеим осям

Одна из самых популярных задач в CSS — центрирование элемента как по горизонтали, так и по вертикали. С Flexbox это становится тривиальной задачей:

CSS
Скопировать код
.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; — строки растягиваются, чтобы занять всё пространство (по умолчанию)

Пример создания галереи изображений с равномерным распределением пространства:

CSS
Скопировать код
.gallery {
display: flex;
flex-wrap: wrap;
justify-content: space-between;
align-content: space-between;
}

.gallery-item {
flex: 0 0 32%; /* каждый элемент занимает примерно треть контейнера */
margin-bottom: 2%;
}

Решение распространенных задач выравнивания

  1. Прижатие элемента к правому краю: Иногда нужно, чтобы один элемент был прижат вправо, а остальные — влево:
CSS
Скопировать код
.navbar {
display: flex;
}

.logo {
/* стандартное поведение */
}

.login-button {
margin-left: auto; /* "волшебное" свойство, прижимающее элемент вправо */
}

  1. Выравнивание последней строки: При использовании flex-wrap элементы в последней строке могут выглядеть неаккуратно, если их количество отличается от предыдущих строк:
CSS
Скопировать код
.gallery {
display: flex;
flex-wrap: wrap;
justify-content: space-between;
}

.gallery::after {
content: "";
flex: 0 0 32%; /* такая же ширина, как у элементов галереи */
}

Это создает невидимый элемент, который "подталкивает" последний ряд влево, если в нем не хватает элементов для заполнения строки.

Практические задачи и решения с использованием Flexbox

Теория — это хорошо, но практика — лучше. Давайте рассмотрим несколько типичных задач верстки и их решения с использованием Flexbox. 🛠️

Задача 1: Создание отзывчивой навигационной панели

CSS
Скопировать код
.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: Карточки одинаковой высоты

Классическая проблема — создание сетки карточек с разным содержимым, но одинаковой высотой:

CSS
Скопировать код
.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)

Классический макет с шапкой, подвалом, центральным содержимым и двумя боковыми панелями:

CSS
Скопировать код
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: Выравнивание последнего элемента формы

Часто нужно, чтобы кнопка отправки формы была выровнена по правому краю:

CSS
Скопировать код
.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: Сложная сетка с элементами разной ширины

Создание динамической сетки с элементами, которые занимают разное количество "столбцов":

CSS
Скопировать код
.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-элементов, вы откроете новые возможности для реализации даже самых сложных дизайнерских задумок. Начните с простых примеров, постепенно добавляя сложность, и вскоре вы увидите, как задачи, которые раньше требовали хитрых обходных путей, решаются элегантно и интуитивно. Самое время применить полученные знания в своем следующем проекте!

Проверь как ты усвоил материалы статьи
Пройди тест и узнай насколько ты лучше других читателей
Что такое flex контейнер в CSS?
1 / 5

Владимир Лисицын

разработчик фронтенда

Свежие материалы

Загрузка...