До появи сучасних систем компонування (layout), розробники веб-інтерфейсів були змушені використовувати інструменти, які для цього не призначалися. Таблиці (<table>), ефекти обтікання (float), і властивості position та display: inline-block — все це були лише спроби обійти обмеження CSS. Вони супроводжувалися безліччю “хаків” та складнощами з підтримкою коду.
Особливо складно було вирішувати базові задачі: вертикальне центрування елемента невідомої висоти, рівномірний розподіл вільного простору між елементами, або зміна порядку візуального відображення елементів незалежно від їхнього порядку в HTML-коді.
Ситуація докорінно змінилася зі стандартизацією модуля Flexible Box Layout (Flexbox). Flexbox забезпечив ефективніший спосіб компонування, вирівнювання і розподілу простору між елементами в контейнері, навіть якщо їхній розмір невідомий або динамічний. Flexbox є одновимірною системою макетування (працює або з рядком, або з колонкою), і на сьогодні це базовий, обов’язковий інструмент кожного фронтенд-розробника.
Історично склалося так, що HTML створювався для відображення текстових документів, а не складних застосунків. Основні проблеми “класичного” макетування (до Flexbox/Grid):

Складність вертикального вирівнювання. До появи Flexbox надійного способу центрувати елемент по вертикалі (без використання таблиць або точного позиціювання з transform) майже не існувало.
float-блоки знаходилися поруч, а контенту в одному було більше, інший блок був коротшим, що ламало фонове оформлення.float-елементи часто “випадали” з батьківських контейнерів, що вимагало використання хаків на кшталт clearfix.Flexbox вирішив ці проблеми елегантно і суто на рівні CSS.
Flexbox — це не одна властивість, а цілий набір властивостей CSS (модуль). Деякі з них застосовуються до батьківського елемента (який стає Flex-контейнером), а інші — до його дочірніх елементів (Flex-елементів).
Основна ідея Flexbox полягає в тому, що контейнер може змінювати ширину/висоту та порядок своїх нащадків для найкращого заповнення доступного простору. Як випливає з назви, гнучкий макет дозволяє елементам розтягуватися, щоб заповнити вільне місце, або стискатися, щоб уникнути переповнення.
Flexbox побудований навколо концепції двох осей:

Всі властивості Flexbox працюють відносно цих двох осей. Якщо змінити напрямок головної осі на вертикальний, всі правила вирівнювання повернуться на 90 градусів.
Щоб почати використовувати Flexbox, необхідно задати батьківському елементу властивість display: flex (або inline-flex). Це ініціалізує гнучкий контекст для всіх його безпосередніх дітей.
.container {
display: flex; /* Створює flex-контейнер */
}
Ця властивість визначає, як елементи розташовуватимуться всередині контейнера.
row (за замовчуванням): елементи розташовуються зліва направо (для ltr мов).row-reverse: елементи розташовуються справа наліво.column: елементи розташовуються зверху вниз (головна вісь стає вертикальною).column-reverse: елементи розташовуються знизу вгору.За замовчуванням flex-елементи будуть намагатися вміститися в один рядок, навіть якщо для цього їх доведеться стиснути.
nowrap (за замовчуванням): всі елементи в одному рядку.wrap: якщо елементи не поміщаються, вони переносяться на новий рядок (вниз).wrap-reverse: перенесення на новий рядок відбувається догори.Скорочення flex-flow: об’єднує flex-direction та flex-wrap. Приклад: flex-flow: row wrap;
Ця властивість дуже важлива — вона визначає, як розподіляється вільний простір вздовж головної осі (за замовчуванням — по горизонталі).
flex-start (за замовчуванням): елементи притискаються до початку осі.flex-end: елементи притискаються до кінця осі.center: елементи центруються.space-between: перший елемент на початку, останній в кінці, а решта вільного простору розподіляється рівномірно між елементами.space-around: рівномірний простір навколо кожного елемента (відстань між елементами буде вдвічі більшою, ніж відстань від країв контейнера).space-evenly: простір рівномірно розподіляється так, щоб відстань між будь-якими двома елементами і краями була абсолютно однаковою.Визначає поведінку вирівнювання елементів вздовж поперечної осі (за замовчуванням — по вертикалі).
stretch (за замовчуванням): елементи розтягуються, щоб заповнити контейнер по висоті (створює колонки однакової висоти!).flex-start: притискаються до початку поперечної осі (догори).flex-end: притискаються до кінця поперечної осі (донизу).center: центруються по поперечній осі (ідеальне вертикальне центрування!).baseline: вирівнюються по базовій лінії тексту.Працює тільки якщо є кілька рядків flex-елементів (тобто задано flex-wrap: wrap). Вирівнює цілі рядки вздовж поперечної осі (аналогічно як justify-content працює для окремих елементів).
Значення: flex-start, flex-end, center, space-between, space-around, stretch.
Сучасна властивість, яка задає проміжок між елементами без використання margin.
gap: 20px; — задає однакову відстань у 20px між усіма елементами. (Можна використовувати row-gap та column-gap).

Ці властивості застосовуються не до контейнера, а до його дочірніх блоків.
За замовчуванням елементи відображаються в тому порядку, в якому вони написані в HTML (order: 0). Властивість дозволяє змінювати візуальний порядок елементів без зміни HTML. Може приймати від’ємні значення (наприклад, order: -1 перемістить елемент на початок).
Визначає здатність елемента розростатися за наявності вільного простору. Приймає безрозмірне число (пропорцію).
flex-grow: 0 (за замовчуванням) — елемент не розтягується.flex-grow: 1 — елемент займе весь вільний простір. Якщо всім елементам задати 1, вони розділять спільний простір порівну. Якщо одному задати 2, а іншим 1, то перший спробує зайняти вдвічі більше вільного простору.
Визначає здатність елемента стискатися, якщо місця не вистачає.
flex-shrink: 1 (за замовчуванням) — елемент може стискатися.flex-shrink: 0 — елемент ніколи не стиснеться менше, ніж значення його базису (flex-basis або width), навіть якщо викличе переповнення (overflow).Задає початковий розмір елемента перед тим, як вільний простір буде розподілено. Це як width (або height у колонковій розкладці), але з вищим пріоритетом. Значення за замовчуванням: auto.
Скорочення flex: об’єднує grow, shrink та basis. Рекомендується використовувати його.
Приклади:
flex: 1; (те саме що flex: 1 1 0%;) — розтягнись на все вільне місце.
flex: 0 0 200px; — будь рівно 200px, не стискайся і не розтягуйся.
Дозволяє перевизначити властивість align-items контейнера для одного конкретного елемента.
Значення ті самі: auto, flex-start, flex-end, center, baseline, stretch.
Flexbox дозволяє легко реалізувати макети, які раніше були надзвичайно складними.
Найпростіший спосіб центрувати будь-який об’єкт (наприклад, модальне вікно або іконку) всередині блоку:
.container {
display: flex;
justify-content: center; /* Центрування по горизонталі */
align-items: center; /* Центрування по вертикалі */
height: 100vh; /* На всю висоту екрану */
}
Класична задача: логотип зліва, меню справа.
<header class="header">
<div class="logo">MySite</div>
<nav class="nav">
<a href="#">Головна</a>
<a href="#">Про нас</a>
</nav>
</header>
.header {
display: flex;
justify-content: space-between; /* Лого зліва, меню справа */
align-items: center; /* Центруємо по вертикалі */
padding: 20px;
background: #333;
color: white;
}
.nav {
display: flex;
gap: 15px; /* Замість margin для посилань */
}

.product-list {
display: flex;
flex-wrap: wrap; /* Дозволяємо перенесення */
gap: 20px;
}
.product-card {
flex: 1 1 300px; /* Гнучка картка: росте, стискається, базова ширина 300px */
}

justify-content та align-items — головні інструменти для розташування елементів.grow, shrink, basis) реалізується гнучкість макета — здатність адаптуватися до різних розмірів екрану.float?flex-direction: column?justify-content відрізняється від align-items?flex: 1 0 auto?order на позиціонування елементів? З якого значення починається нумерація?