Урок 6 из 8 · 20 мин · обновлено

Flexbox: раскладываем блоки в ряд

Как с помощью Flexbox выстроить элементы в строку или столбец, распределить место между ними, выровнять по центру и перенести на новую строку.

Зачем нужен Flexbox

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

Включаем flex

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

HTML
<div class="cards">
  <article class="card">Пицца</article>
  <article class="card">Паста</article>
  <article class="card">Салат</article>
</div>
CSS
.cards {
  display: flex;
  gap: 16px;
}

Карточки встали в ряд, а gap задал расстояние между ними — без лишних отступов у краёв.

Две оси

У flex-контейнера есть главная ось — по умолчанию горизонтальная, слева направо — и поперечная, вертикальная. Почти все свойства Flexbox — про выравнивание вдоль одной из них.

justify-content — распределение вдоль главной оси:

Значение Что делает
flex-start всё в начало (по умолчанию)
center всё по центру
flex-end всё в конец
space-between первый в начало, последний в конец, между ними поровну

align-items — выравнивание поперёк главной оси: stretch (растянуть на всю высоту, по умолчанию), center, flex-start, flex-end.

Классика: шапка сайта

HTML
<header class="header">
  <a class="logo" href="/">Пиццерия</a>
  <nav class="menu">
    <a href="#menu">Меню</a>
    <a href="#delivery">Доставка</a>
    <a href="#contacts">Контакты</a>
  </nav>
</header>
CSS
.header {
  display: flex;
  justify-content: space-between;  /* логотип слева, меню справа */
  align-items: center;             /* по центру по высоте */
  padding: 16px;
}

.menu {
  display: flex;
  gap: 24px;
}

Flex-контейнеры можно вкладывать: шапка раскладывает логотип и меню, а меню — свои ссылки.

Центр по обеим осям

Раньше ровно отцентрировать блок было целым приключением. С Flexbox — две строки:

CSS
.hero {
  display: flex;
  justify-content: center;
  align-items: center;
  min-height: 300px;
}

Столбец и перенос

  • flex-direction: column — элементы встают столбцом, и главная ось становится вертикальной;
  • flex-wrap: wrap — если элементы не помещаются в строку, они переносятся на следующую.
CSS
.cards {
  display: flex;
  flex-wrap: wrap;
  gap: 16px;
}

.card {
  flex: 1 1 250px;   /* расти, сжиматься, базовая ширина 250px */
}

Получилась сетка карточек, которая сама перестраивается под ширину экрана: на широком помещаются три в ряд, на телефоне — по одной.

flex: 1 — занять свободное место

Свойство flex у дочернего элемента говорит, как делить свободное место:

CSS
.search {
  display: flex;
  gap: 8px;
}

.search input {
  flex: 1;   /* поле растягивается на всё свободное место */
}

Кнопка «Найти» остаётся своего размера, а поле поиска занимает всё остальное.

Попробуйте сами. Сверстайте подвал сайта: слева — копирайт, справа — три ссылки в ряд с расстоянием 16px. Оба блока выровнены по центру по высоте.

Решение
HTML
<footer class="footer">
  <p>© 2026 Пиццерия</p>
  <nav class="footer-links">
    <a href="/about.html">О нас</a>
    <a href="/delivery.html">Доставка</a>
    <a href="/privacy.html">Конфиденциальность</a>
  </nav>
</footer>
CSS
.footer {
  display: flex;
  justify-content: space-between;
  align-items: center;
  padding: 24px 16px;
}

.footer-links {
  display: flex;
  gap: 16px;
}

Та же схема, что у шапки: внешний flex разносит блоки по краям, внутренний выстраивает ссылки.

Мини-тест: проверьте себя

Закрепите урок: несколько вопросов, разбор ответов — в конце.

  1. Кому нужно задать display: flex, чтобы три карточки встали в ряд?

  2. Какое свойство разнесёт логотип и меню по краям шапки?

  3. Как выровнять элемент по центру и по горизонтали, и по вертикали внутри flex-контейнера?

  4. Что делает gap: 16px у flex-контейнера?