Урок 22. Теория: Введение во Flexbox

📁 Раздел: Flexbox ⏱️ Время изучения: ~55 мин 🎯 Сложность: Средняя
#display #flex-direction #justify-content #align-items #flex-wrap #gap #align-self

⚡ Кратко

Пишешь display: flex на родителе — он становится flex-контейнером, а его прямые дети — flex-элементами. Дети автоматически выстраиваются в ряд.

  • flex-direction задаёт главную ось: row (по умолчанию, в строку) или column (в колонку).
  • justify-content выравнивает элементы вдоль главной оси (прижать к началу/концу/центру, распределить промежутки).
  • align-items выравнивает поперёк (по поперечной оси).
  • Свойства контейнера (justify-content, align-items) пишутся на родителе, а не на детях.

Главная идея

Flexbox («гибкий контейнер») — это режим раскладки для одномерных задач: расставить элементы в одну строку или одну колонку, управлять промежутками между ними и выравниванием. Достаточно написать display: flex на родителе — и он становится flex-контейнером, а все его прямые дети — flex-элементами, которые сразу выстраиваются в ряд без всяких float и inline-block.

Представь полку-рейку, на которую раскладывают предметы. Контейнер — это сама рейка, а flex-элементы — предметы на ней. Ты можешь прижать все предметы к левому краю, к правому, собрать в центр или равномерно расставить с одинаковыми промежутками. А ещё — выровнять их по высоте: прижать к верхней планке, к нижней или по центру. Flexbox — это и есть такая «умная рейка»: ты говоришь, как разложить предметы, а не двигаешь каждый вручную.

Контейнер и элементы: кто за что отвечает

Главное правило Flexbox: одни свойства пишутся на контейнере (родителе), другие — на элементах (детях). Их нельзя путать местами.

  • Свойства контейнера: display: flex, flex-direction, flex-wrap, justify-content, align-items, gap.
  • Свойства элементов: flex-grow, flex-shrink, flex-basis (и краткая запись flex), align-self.

Например, justify-content: center на дочернем блоке просто не сработает — это свойство контейнера. Если правило «не действует», первым делом проверь, на ком оно написано.

Две оси: главная и поперечная

Flexbox раскладывает элементы вдоль двух осей. Главная ось (main axis) — направление, в котором выстраиваются элементы; его задаёт flex-direction. Поперечная ось (cross axis) — перпендикулярна главной. При flex-direction: row главная ось горизонтальна, при column — вертикальна, и оси меняются местами.

main axis (главная) cross axis
При flex-direction: row: главная ось — горизонтальная (вдоль неё работает justify-content), поперечная — вертикальная (вдоль неё работает align-items).

Как это работает на живом контейнере

Ниже — настоящий flex-контейнер (.layout-demo). Достаточно сменить flex-direction, чтобы элементы выстроились в строку или в колонку:

flex-direction: row — в строку (по умолчанию)

1
2
3

flex-direction: column — в колонку

1
2
3

Когда применять

Flexbox — для одномерных раскладок: панель навигации, ряд кнопок, шапка с логотипом и меню, центрирование блока по обеим осям, карточки в ряд. Если нужна полноценная двумерная сетка (строки И колонки одновременно) — это задача для CSS Grid (следующие уроки).

Базовый синтаксис

📄 lesson-22/main.css
.cards {
  display: flex;          /* родитель → flex-контейнер */
  flex-direction: row;    /* главная ось — горизонталь */
  justify-content: center;/* вдоль главной оси */
  align-items: center;    /* вдоль поперечной оси */
  gap: 1rem;              /* промежутки между элементами */
}
Частая ошибка: при flex-direction: column главная и поперечная оси меняются местами. Теперь justify-content управляет выравниванием по вертикали, а align-itemsпо горизонтали.
Проверка: откройте DevTools, выделите flex-контейнер и включите Flexbox overlay — браузер подсветит оси и промежутки.

Навигация