Flexbox в CSS: освойте основы и адаптивную вёрстку с примерами
Перейти

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

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

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

  • Веб-разработчики
  • Дизайнеры интерфейсов
  • Студенты и специалисты, изучающие 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-контейнера:

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

CSS
Скопировать код
.container {
display: flex;
flex-wrap: wrap; /* элементы переносятся на новую строку при необходимости */
}

Для flex-элементов важно понимать три ключевых свойства, контролирующих их размер и поведение:

  • flex-grow — определяет, насколько элемент может расширяться относительно других элементов (число ≥ 0)
  • flex-shrink — определяет, насколько элемент может сжиматься относительно других элементов (число ≥ 0)
  • flex-basis — устанавливает начальный размер элемента перед распределением свободного пространства

Эти свойства часто объединяются в сокращённое свойство flex:

CSS
Скопировать код
.item {
flex: 1 0 200px; /* grow shrink basis */
}

Часто используемые значения свойства flex:

  • flex: 1 — элемент может растягиваться и занимает всё доступное пространство поровну с другими элементами
  • flex: 0 0 auto — элемент не растягивается и не сжимается, размер определяется содержимым
  • flex: 0 0 200px — элемент имеет фиксированную ширину 200px и не меняет размер

Понимание взаимодействия контейнера и элементов — основа для создания сложных и гибких макетов с Flexbox.

Главные свойства Flexbox для профессиональной вёрстки

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

Свойства контейнера:

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

    • flex-start (по умолчанию) — элементы выравниваются к началу главной оси
    • flex-end — элементы выравниваются к концу главной оси
    • center — элементы центрируются вдоль главной оси
    • space-between — элементы равномерно распределяются, первый у начала, последний у конца
    • space-around — элементы равномерно распределяются с равными отступами вокруг
    • space-evenly — элементы распределяются так, чтобы расстояние между элементами и до краёв было одинаковым
  2. align-items — выравнивает элементы вдоль поперечной оси:

    • stretch (по умолчанию) — элементы растягиваются, заполняя контейнер
    • flex-start — элементы выравниваются к началу поперечной оси
    • flex-end — элементы выравниваются к концу поперечной оси
    • center — элементы центрируются вдоль поперечной оси
    • baseline — элементы выравниваются по базовой линии текста
  3. align-content — распределяет строки в многострочном flex-контейнере (работает только при flex-wrap: wrap):

    • flex-start — строки прижимаются к началу поперечной оси
    • flex-end — строки прижимаются к концу поперечной оси
    • center — строки центрируются вдоль поперечной оси
    • stretch (по умолчанию) — строки растягиваются, заполняя контейнер
    • space-between — строки равномерно распределяются, первая у начала, последняя у конца
    • space-around — строки равномерно распределяются с равными отступами вокруг

Свойства flex-элементов:

  1. order — меняет порядок следования элемента (по умолчанию 0):
CSS
Скопировать код
.item {
order: -1; /* элемент появится перед всеми с order: 0 */
}

  1. align-self — переопределяет выравнивание для отдельного элемента:
CSS
Скопировать код
.special-item {
align-self: center; /* только этот элемент будет центрирован */
}

  1. flex-grow, flex-shrink, flex-basis — контролируют размеры элемента:
CSS
Скопировать код
.item {
flex: 2 1 300px; /* растёт в 2 раза быстрее других, сжимается как все, начальный размер 300px */
}

Игорь Соколов, фронтенд-архитектор

Я работал над проектом онлайн-маркетплейса, где требовалось создать сетку товаров с фильтрами, которая должна была безупречно работать на всех устройствах от телефона до 4K-мониторов. Первая версия использовала CSS Grid для основной сетки.

Проблемы начались, когда заказчик захотел, чтобы при наведении карточки товара увеличивались и перекрывали соседние. Grid не справлялся с этой задачей. Мы переписали сетку на Flexbox с комбинацией свойств flex-grow и z-index. Это позволило карточкам плавно увеличиваться при наведении и возвращаться в исходное состояние, сохраняя при этом полную адаптивность. Ключом стало использование media-queries для корректировки свойств flex-basis на разных разрешениях экрана.

Примеры продвинутых техник с использованием Flexbox:

Равномерное распределение с переменным количеством элементов:

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

.item {
flex: 1 1 200px; /* Минимум 200px, но может растягиваться */
margin: 10px;
}

Прилипающий футер (sticky footer):

CSS
Скопировать код
body {
display: flex;
flex-direction: column;
min-height: 100vh;
}

main {
flex: 1;
}

footer {
flex-shrink: 0;
}

Центрирование элемента по горизонтали и вертикали:

CSS
Скопировать код
.container {
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
}

Построение адаптивных макетов с помощью Flexbox

Адаптивная вёрстка — одно из главных преимуществ Flexbox. Благодаря своей гибкости, Flexbox позволяет создавать макеты, которые естественным образом адаптируются к различным размерам экрана без необходимости писать множество медиа-запросов.

Рассмотрим основные стратегии создания адаптивных интерфейсов с Flexbox:

1. Гибкие размеры с flex-basis и медиа-запросами

Гибкое распределение элементов в зависимости от доступного пространства:

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

Переключение между горизонтальным и вертикальным расположением:

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

@media (max-width: 768px) {
.navigation {
flex-direction: column; /* Переключение на вертикальное меню на мобильных */
}
}

3. Переупорядочивание элементов с order

Изменение порядка элементов без изменения HTML-структуры:

CSS
Скопировать код
.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" (Святой Грааль)

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

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

Сетка карточек, которая автоматически перестраивается в зависимости от размера экрана:

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

CSS
Скопировать код
.container {
display: flex;
justify-content: center; /* горизонтальное центрирование */
align-items: center; /* вертикальное центрирование */
height: 100vh; /* занимаем всю высоту экрана */
}

Задача 2: Меню с равномерно распределёнными пунктами

CSS
Скопировать код
.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: Макет с фиксированным сайдбаром и адаптивным контентом

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

CSS
Скопировать код
.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: "Липкий" футер, всегда прижатый к низу страницы

CSS
Скопировать код
body {
display: flex;
flex-direction: column;
min-height: 100vh; /* минимальная высота – высота экрана */
margin: 0;
}

.content {
flex: 1; /* растягивается, чтобы заполнить доступное пространство */
}

.footer {
padding: 20px;
background: #333;
color: white;
}

Задача 6: Галерея изображений с адаптивной сеткой

CSS
Скопировать код
.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: Форма с выравниванием лейблов и инпутов

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

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

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

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

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

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

Загрузка...