Вивчай
CSS

CSS Flexbox шпаргалка українською

Кольорові книги різної висоти рівномірно розставлені на полиці — як елементи у Flexbox контейнеріКольорові книги різної висоти рівномірно розставлені на полиці — як елементи у Flexbox контейнері

Все, що потрібно знати про Flexbox — на одній сторінці. Тримай під рукою як довідник, коли треба швидко згадати, як працює justify-content чи flex-grow.

Якщо вивчаєш Flexbox з нуля — почни з уроку Flexbox частина 1, а потім переходь до Flexbox частина 2. Якщо потрібні паралельні рядки і колонки — дивись Grid шпаргалку.

Трохи історії

До 2012 року CSS-макети робили на float і table — технологіях, які для цього не призначені. "Як відцентрувати div?" — і досі один з найчастіших запитів в Google.

23 липня 2009 року W3C опублікували перший чорновик Flexbox. Ідея прийшла з XUL — технології, якою Firefox рендерить свій інтерфейс. Специфікацію переписували тричі з трьома різними синтаксисами (display: boxdisplay: flexboxdisplay: flex). З 2019 по 2022 рік Flexbox з'явився на 41% → 74% всіх вебсайтів у світі.

Коли використовувати Flexbox?

СценарійЧому Flexbox
Горизонтальна навігаціяодновимірне розташування
Кнопки в рядвирівнювання + gap
Центрування одного елементатри рядки коду
Sticky footerбез хаків і JavaScript
Карткова галерея в один рядокflex-wrap і flex-grow

Просте правило: один напрямок (рядок або колонка) — це Flexbox. Якщо потрібні і рядки, і колонки одночасно — це вже Grid.

Коли НЕ варто використовувати Flexbox

  • Складна сітка з рядками І колонками — використовуй CSS Grid
  • Текстова розкладка — для тексту достатньо звичайного block flow
  • Один елемент без вирівнювання — якщо просто <div> під <div>, flex нічого не дає
  • Таблиці даних — для табличних даних використовуй <table>, а не flex-хаки

Властивості контейнера

.container {
  display: flex; /* або inline-flex */
}
ВластивістьЗначенняОпис
flex-directionrow | row-reverse | column | column-reverseНапрямок головної осі
flex-wrapnowrap | wrap | wrap-reverseПеренос елементів на новий рядок
flex-flowrow wrapСкорочення для direction + wrap
gap10px | 1rem 2remВідстань між елементами
justify-contentдив. нижчеВирівнювання по головній осі
align-itemsдив. нижчеВирівнювання по поперечній осі
align-contentflex-start | center | space-betweenВирівнювання рядків (коли є wrap)

justify-content — вирівнювання по головній осі

justify-content — всі значенняjustify-content — всі значення

ЗначенняЩо робить
flex-startПритискає до початку (за замовчуванням)
flex-endПритискає до кінця
centerЦентрує
space-betweenРозподіляє рівномірно, без відступів по краях
space-aroundРозподіляє з рівними відступами навколо кожного
space-evenlyРозподіляє з рівними відступами між усіма (включно з краями)

align-items — вирівнювання по поперечній осі

align-items — всі значенняalign-items — всі значення

ЗначенняЩо робить
stretchРозтягує на всю висоту контейнера (за замовчуванням)
flex-startПритискає до верху (або лівого краю при column)
flex-endПритискає до низу
centerЦентрує по вертикалі
baselineВирівнює по базовій лінії тексту

Властивості елементів

ВластивістьЗа замовч.Опис
order0Порядок відображення (можна змінити без перестановки в HTML)
flex-grow0Здатність розширюватись
flex-shrink1Здатність стискатись
flex-basisautoПочатковий розмір до grow/shrink
flex0 1 autoСкорочення: grow shrink basis
align-selfautoВирівнювання окремого елемента (перебиває align-items)

Фракції — як flex-grow ділить простір

Уяви піцу. Троє друзів замовили піцу і кожен хоче 1 частку — піцу ріжуть на 3 рівні шматки. Але якщо один каже "я хочу 2 частки" — піцу ріжуть на 4 шматки (2+1+1), і він отримує половину.

Саме так працює flex-grow:

/* Піца на 3 рівні шматки */
.item-a { flex-grow: 1; } /* 1/3 вільного простору */
.item-b { flex-grow: 1; } /* 1/3 вільного простору */
.item-c { flex-grow: 1; } /* 1/3 вільного простору */

/* Один хоче більше */
.item-a { flex-grow: 2; } /* 2/4 = половина вільного простору */
.item-b { flex-grow: 1; } /* 1/4 вільного простору */
.item-c { flex-grow: 1; } /* 1/4 вільного простору */

Фракції адаптуються під будь-який розмір екрана. Ця ж концепція використовується в CSS Grid (1fr, 2fr).

flex-grow — як елементи розширюються

flex-grow — візуалізаціяflex-grow — візуалізація

flex-grow: 1 означає «забери увесь вільний простір». Якщо у двох елементів flex-grow: 1, вони ділять простір порівну. Якщо в одного flex-grow: 2, а в другого flex-grow: 1 — перший забере вдвічі більше зайвого простору.

flex-shrink — як елементи стискаються

flex-shrink — візуалізаціяflex-shrink — візуалізація

За замовчуванням всі елементи можуть стискатися (flex-shrink: 1). Поставиш flex-shrink: 0 — елемент збереже свій розмір, навіть якщо контейнер занадто малий. Корисно для іконок і логотипів.

Типові значення flex

ЗначенняРозшифруванняКоли використовувати
flex: 11 1 0%Елемент займає весь вільний простір
flex: auto1 1 autoРосте і стискається від розміру вмісту
flex: none0 0 autoФіксований розмір, не змінюється (для іконок)
flex: 0 1 300pxБазис 300px, стискається, не росте

order — візуальний порядок

order — візуальний порядок елементівorder — візуальний порядок елементів

.item { order: -1; } /* перемістити на початок */
.item { order: 1; }  /* перемістити в кінець */

Готові рецепти

Центрування одного елемента

.center {
  display: flex;
  justify-content: center;
  align-items: center;
  min-height: 100vh;
}

Найвідоміший трюк CSS — три рядки замість 10 років болю з position: absolute.

Навігація: логотип зліва, меню справа

.nav {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 2rem;
}

Рівні колонки

.columns {
  display: flex;
  gap: 1rem;
}
.columns > * {
  flex: 1;
}

Скільки б елементів не було — поділять простір порівну.

Картки з переносом (responsive)

.cards {
  display: flex;
  flex-wrap: wrap;
  gap: 1rem;
}
.card {
  flex: 1 1 280px;
}

Кожна картка хоче бути 280px, але якщо є місце — росте. Якщо ні — переноситься на новий рядок.

Sticky footer

body {
  display: flex;
  flex-direction: column;
  min-height: 100vh;
}
main {
  flex: 1;
}

main забере всю вільну висоту, footer завжди притиснеться до низу.

Прижати один елемент до краю

.toolbar {
  display: flex;
  gap: 1rem;
}
.logout-btn {
  margin-left: auto;
}

Всі кнопки ліворуч, але одна (наприклад, «Logout») — праворуч. margin-left: auto поглинає весь вільний простір зліва.


Часті помилки

  • Вертикальне центрування не працює? Перевір, що align-items: center стоїть на контейнері з display: flex, а у контейнера є висота (min-height: 100vh для повного екрана).
  • Елементи не переносяться на новий рядок? За замовчуванням flex-wrap: nowrap — додай flex-wrap: wrap.
  • Картинка стиснулась? За замовчуванням flex-shrink: 1. Постав flex-shrink: 0 на елементи, які мають зберігати розмір.
  • justify-content: center не центрує по вертикалі? Бо justify-content — це головна вісь. При flex-direction: row головна вісь — горизонтальна. Для вертикалі при row потрібен align-items: center.
  • gap не працює? Браузер занадто старий. Підтримка з 2021 року, але якщо потрібно для legacy — використовуй margin.
Як відцентрувати елемент по вертикалі та горизонталі в CSS?+
Три рядки з Flexbox: display: flex; justify-content: center; align-items: center на батьківському елементі. Батько повинен мати висоту (наприклад, min-height: 100vh для повного екрана). Це працює для будь-якого вмісту — тексту, картинок, блоків.
Яка різниця між justify-content і align-items?+
justify-content вирівнює по головній осі (горизонтально при flex-direction: row). align-items — по поперечній осі (вертикально при row). Якщо flex-direction: column — осі міняються місцями: justify-content стає вертикальним, align-items — горизонтальним.
Що таке flex: 1 і як працює flex-grow?+
flex: 1 — це скорочення для flex-grow: 1, flex-shrink: 1, flex-basis: 0%. Елемент із flex-grow: 1 забере весь вільний простір контейнера. Якщо кілька елементів мають flex-grow — простір ділиться пропорційно (2:1 означає перший отримає вдвічі більше).
Коли використовувати Flexbox, а коли Grid?+
Flexbox — для одновимірних макетів (рядок або колонка): навігація, кнопки, центрування, sticky footer. Grid — для двовимірних (рядки І колонки одночасно): макет сторінки, галерея, dashboard. Їх можна комбінувати: Grid для загального layout, Flexbox для елементів всередині.
Інфо

Ігри для вивчення Flexbox:

  • Flexbox Froggy — допоможи жабкам дістатися до лілій. 24 рівні, є українська версія!
  • Flexbox Defense — tower defense, де вежі ставляться через Flexbox
  • Flexbox Zombies — стріляй по зомбі, вирівнюючи приціл flex-властивостями
  • Flexbox Adventure — RPG-гра з CSS Flexbox

Відео та ресурси: