HTML & CSS

CSS Flexbox. Гнучкий макет

Глибоке занурення у Flexbox: display: flex, осі, justify-content, align-items, flex-wrap, flex-grow/shrink/basis, order, gap та практичні макети — навігація, картки, sticky footer, центрування.

CSS Flexbox. Гнучкий макет

Як відцентрувати елемент — задача, що роками вимагала хаків

Горизонтальне та вертикальне центрування елемента — одна з найпоширеніших задач верстки. До Flexbox розробники мусили використовувати float, inline-block, table-cell, від'ємні margin, position: absolute з transform — купу хаків, кожен із своїми обмеженнями. У 2024 році ця задача вирішується двома рядками CSS:

.container {
    display: flex;
    justify-content: center;
    align-items: center;
}

Flexbox (Flexible Box Layout) — це система компонування, спеціально створена для одновимірних макетів: розміщення елементів у рядок або стовпець із гнучким контролем розмірів, порядку та вирівнювання.

У попередній статті ми навчились працювати з кольорами та фонами. Тепер прийшов час розміщувати елементи на сторінці — і Flexbox стане вашим головним інструментом.


Проблеми до Flexbox

Щоб оцінити силу Flexbox, подивимось, як виглядала горизонтальна розкладка раніше:

/* Старий підхід — float */
.card {
    float: left;
    width: 33.33%;
}
.container::after {
    content: '';
    display: table;
    clear: both; /* «Clearfix» — інакше батько схлопнеться */
}

Проблеми: батько втрачає висоту, потрібен clearfix, складно центрувати, складно зробити рівну висоту колонок.


Основи Flexbox: контейнер та елементи

Flexbox працює за принципом контейнер → елементи:

Loading diagram...
graph TD
    A["display: flex\n(Flex-контейнер)"] --> B["Flex-елемент 1"]
    A --> C["Flex-елемент 2"]
    A --> D["Flex-елемент 3"]
    A --> E["Flex-елемент 4"]
    style A fill:#3b82f6,color:#fff
    style B fill:#f59e0b,color:#fff
    style C fill:#f59e0b,color:#fff
    style D fill:#f59e0b,color:#fff
    style E fill:#f59e0b,color:#fff
.container {
    display: flex; /* Робить усіх прямих дочірніх — flex-елементами */
}
<div class="flex-demo">
    <div class="item">1</div>
    <div class="item">2</div>
    <div class="item">3</div>
    <div class="item">4</div>
</div>
<p class="caption">↑ Без flex: елементи стояли б вертикально (block). З flex — горизонтально.</p>
.flex-demo {
    display: flex;
    background-color: #f1f5f9;
    padding: 1rem;
    border-radius: 8px;
    gap: 0.5rem;
}

.item {
    padding: 1rem 1.5rem;
    background-color: #3b82f6;
    color: white;
    border-radius: 6px;
    font-family: system-ui, sans-serif;
    font-weight: 600;
    font-size: 1rem;
}

.caption {
    font-family: system-ui, sans-serif;
    font-size: 0.8rem;
    color: #64748b;
    margin-top: 0.5rem;
}
Preview
Flex-контейнер
element
Елемент з display: flex. Він керує розміщенням своїх прямих дочірніх елементів. Вкладені елементи (внуки, правнуки) — не є flex-елементами.
Flex-елемент
element
Кожен прямий дочірній елемент flex-контейнера. Автоматично стає гнучким — реагує на властивості flex-grow, flex-shrink, flex-basis.

Осі Flexbox

Flexbox має дві осі. Вся логіка вирівнювання побудована навколо них:

Loading diagram...
graph LR
    subgraph ROW["flex-direction: row (за замовчуванням)"]
        direction LR
        A["Main Axis →\n(Головна вісь)"] -.-> B["Cross Axis ↓\n(Поперечна вісь)"]
    end
    subgraph COL["flex-direction: column"]
        direction TB
        C["Main Axis ↓\n(Головна вісь)"] -.-> D["Cross Axis →\n(Поперечна вісь)"]
    end
    style A fill:#3b82f6,color:#fff
    style B fill:#f59e0b,color:#fff
    style C fill:#3b82f6,color:#fff
    style D fill:#f59e0b,color:#fff
  • Головна вісь (Main Axis) — напрямок розміщення flex-елементів
  • Поперечна вісь (Cross Axis) — перпендикулярна до головної

Напрямок головної осі визначається flex-direction.


flex-direction — напрямок осі

<div class="dir-demos">
    <div>
        <p class="label">row (за замовчуванням)</p>
        <div class="dir-box" style="flex-direction: row;">
            <div class="item">1</div>
            <div class="item">2</div>
            <div class="item">3</div>
        </div>
    </div>
    <div>
        <p class="label">row-reverse</p>
        <div class="dir-box" style="flex-direction: row-reverse;">
            <div class="item">1</div>
            <div class="item">2</div>
            <div class="item">3</div>
        </div>
    </div>
    <div>
        <p class="label">column</p>
        <div class="dir-box col" style="flex-direction: column;">
            <div class="item">1</div>
            <div class="item">2</div>
            <div class="item">3</div>
        </div>
    </div>
    <div>
        <p class="label">column-reverse</p>
        <div class="dir-box col" style="flex-direction: column-reverse;">
            <div class="item">1</div>
            <div class="item">2</div>
            <div class="item">3</div>
        </div>
    </div>
</div>
.dir-demos {
    display: flex;
    gap: 1rem;
    flex-wrap: wrap;
    font-family: system-ui, sans-serif;
}

.dir-demos > div {
    flex: 1;
    min-width: 140px;
}

.label {
    font-size: 0.8rem;
    font-weight: 600;
    color: #475569;
    margin: 0 0 0.25rem;
}

.dir-box {
    display: flex;
    gap: 0.3rem;
    padding: 0.5rem;
    background-color: #f1f5f9;
    border-radius: 6px;
    min-height: 50px;
}

.dir-box.col {
    min-height: 130px;
}

.item {
    padding: 0.4rem 0.75rem;
    background-color: #3b82f6;
    color: white;
    border-radius: 4px;
    font-size: 0.85rem;
    font-weight: 600;
    text-align: center;
}
Preview
ЗначенняГоловна вісьЕлементи
row→ горизонтальноЗліва направо
row-reverse← горизонтальноСправа наліво
column↓ вертикальноЗверху вниз
column-reverse↑ вертикальноЗнизу вгору

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

Визначає, як розподілити вільний простір уздовж головної осі:

<div class="jc-demos">
    <p class="label">flex-start</p>
    <div class="jc-box" style="justify-content: flex-start;">
        <div class="item">1</div>
        <div class="item">2</div>
        <div class="item">3</div>
    </div>

    <p class="label">center</p>
    <div class="jc-box" style="justify-content: center;">
        <div class="item">1</div>
        <div class="item">2</div>
        <div class="item">3</div>
    </div>

    <p class="label">flex-end</p>
    <div class="jc-box" style="justify-content: flex-end;">
        <div class="item">1</div>
        <div class="item">2</div>
        <div class="item">3</div>
    </div>

    <p class="label">space-between</p>
    <div class="jc-box" style="justify-content: space-between;">
        <div class="item">1</div>
        <div class="item">2</div>
        <div class="item">3</div>
    </div>

    <p class="label">space-around</p>
    <div class="jc-box" style="justify-content: space-around;">
        <div class="item">1</div>
        <div class="item">2</div>
        <div class="item">3</div>
    </div>

    <p class="label">space-evenly</p>
    <div class="jc-box" style="justify-content: space-evenly;">
        <div class="item">1</div>
        <div class="item">2</div>
        <div class="item">3</div>
    </div>
</div>
.jc-demos {
    font-family: system-ui, sans-serif;
}

.label {
    font-size: 0.8rem;
    font-weight: 600;
    color: #475569;
    margin: 0.5rem 0 0.2rem;
}

.jc-box {
    display: flex;
    padding: 0.5rem;
    background-color: #f1f5f9;
    border-radius: 6px;
    gap: 0.3rem;
}

.item {
    padding: 0.5rem 1rem;
    background-color: #3b82f6;
    color: white;
    border-radius: 4px;
    font-size: 0.85rem;
    font-weight: 600;
}
Preview
ЗначенняПоведінка
flex-startЕлементи притиснуті до початку осі
centerЕлементи по центру
flex-endЕлементи притиснуті до кінця осі
space-betweenПерший і останній — по краях, решта — рівномірно між ними
space-aroundРівні проміжки навколо кожного елемента (крайній проміжок = половина)
space-evenlyАбсолютно рівні проміжки скрізь

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

Визначає, як елементи вирівнюються перпендикулярно до головної осі:

<div class="ai-demos">
    <div>
        <p class="label">stretch (default)</p>
        <div class="ai-box" style="align-items: stretch;">
            <div class="item sm">A</div>
            <div class="item md">B</div>
            <div class="item lg">C</div>
        </div>
    </div>
    <div>
        <p class="label">flex-start</p>
        <div class="ai-box" style="align-items: flex-start;">
            <div class="item sm">A</div>
            <div class="item md">B</div>
            <div class="item lg">C</div>
        </div>
    </div>
    <div>
        <p class="label">center</p>
        <div class="ai-box" style="align-items: center;">
            <div class="item sm">A</div>
            <div class="item md">B</div>
            <div class="item lg">C</div>
        </div>
    </div>
    <div>
        <p class="label">flex-end</p>
        <div class="ai-box" style="align-items: flex-end;">
            <div class="item sm">A</div>
            <div class="item md">B</div>
            <div class="item lg">C</div>
        </div>
    </div>
    <div>
        <p class="label">baseline</p>
        <div class="ai-box" style="align-items: baseline;">
            <div class="item" style="font-size:0.8rem;padding:0.3rem 0.5rem;">small</div>
            <div class="item" style="font-size:1.5rem;padding:0.5rem 0.75rem;">BIG</div>
            <div class="item" style="font-size:1rem;padding:0.4rem 0.6rem;">med</div>
        </div>
    </div>
</div>
.ai-demos {
    display: flex;
    gap: 0.75rem;
    flex-wrap: wrap;
    font-family: system-ui, sans-serif;
}

.ai-demos > div {
    flex: 1;
    min-width: 110px;
}

.label {
    font-size: 0.75rem;
    font-weight: 600;
    color: #475569;
    margin: 0 0 0.2rem;
}

.ai-box {
    display: flex;
    gap: 0.3rem;
    padding: 0.5rem;
    background-color: #f1f5f9;
    border-radius: 6px;
    height: 120px;
}

.item {
    padding: 0.4rem 0.6rem;
    background-color: #3b82f6;
    color: white;
    border-radius: 4px;
    font-size: 0.8rem;
    font-weight: 600;
}

.sm {
    height: 30px;
    display: flex;
    align-items: center;
}
.md {
    height: 50px;
    display: flex;
    align-items: center;
}
.lg {
    height: 70px;
    display: flex;
    align-items: center;
}
Preview
ЗначенняПоведінка
stretchЕлементи розтягуються на всю висоту контейнера (за замовч.)
flex-startПритиснуті до верху (початку поперечної осі)
centerПо центру поперечної осі
flex-endПритиснуті до низу (кінця поперечної осі)
baselineВирівнювання тексту по базовій лінії

align-self — індивідуальне вирівнювання

Дозволяє одному елементу перевизначити align-items батька:

<div class="as-box">
    <div class="item">default</div>
    <div class="item self-end">align-self: flex-end</div>
    <div class="item self-center">align-self: center</div>
    <div class="item">default</div>
</div>
.as-box {
    display: flex;
    align-items: flex-start;
    gap: 0.5rem;
    padding: 0.75rem;
    background-color: #f1f5f9;
    border-radius: 8px;
    height: 120px;
    font-family: system-ui, sans-serif;
}

.item {
    padding: 0.5rem 0.75rem;
    background-color: #3b82f6;
    color: white;
    border-radius: 4px;
    font-size: 0.75rem;
    font-weight: 600;
}

.self-end {
    align-self: flex-end;
    background-color: #ef4444;
}
.self-center {
    align-self: center;
    background-color: #10b981;
}
Preview

Ідеальне центрування

Найпотужніший прийом Flexbox — повне центрування (горизонтальне + вертикальне):

<div class="perfect-center">
    <div class="centered-content">
        <h3>🎯 Ідеально відцентровано</h3>
        <p>justify-content: center + align-items: center</p>
    </div>
</div>
.perfect-center {
    display: flex;
    justify-content: center; /* Горизонтально */
    align-items: center; /* Вертикально */
    height: 200px;
    background-color: #f1f5f9;
    border-radius: 12px;
    border: 2px dashed #94a3b8;
}

.centered-content {
    text-align: center;
    font-family: system-ui, sans-serif;
}

.centered-content h3 {
    margin: 0 0 0.25rem;
    font-size: 1.2rem;
    color: #1e293b;
}

.centered-content p {
    margin: 0;
    font-size: 0.85rem;
    color: #64748b;
}
Preview
display: flex; justify-content: center; align-items: center; — ці три рядки центрують будь-що. Запам'ятайте їх раз і назавжди.

flex-wrap — перенос на новий рядок

За замовчуванням flex-елементи не переносяться — вони стискаються, щоб вміститися в один рядок. flex-wrap змінює це:

<p class="label">flex-wrap: nowrap (за замовчуванням) — елементи стискаються</p>
<div class="wrap-box" style="flex-wrap: nowrap;">
    <div class="item">1</div>
    <div class="item">2</div>
    <div class="item">3</div>
    <div class="item">4</div>
    <div class="item">5</div>
    <div class="item">6</div>
</div>

<p class="label">flex-wrap: wrap — елементи переносяться</p>
<div class="wrap-box" style="flex-wrap: wrap;">
    <div class="item">1</div>
    <div class="item">2</div>
    <div class="item">3</div>
    <div class="item">4</div>
    <div class="item">5</div>
    <div class="item">6</div>
</div>
.label {
    font-family: system-ui, sans-serif;
    font-size: 0.8rem;
    font-weight: 600;
    color: #475569;
    margin: 0.75rem 0 0.25rem;
}

.wrap-box {
    display: flex;
    gap: 0.5rem;
    padding: 0.75rem;
    background-color: #f1f5f9;
    border-radius: 8px;
    max-width: 350px;
}

.item {
    padding: 0.5rem 1.5rem;
    background-color: #3b82f6;
    color: white;
    border-radius: 4px;
    font-family: system-ui, sans-serif;
    font-size: 0.9rem;
    font-weight: 600;
    min-width: 80px;
    text-align: center;
}
Preview

align-content — вирівнювання рядків при wrap

Коли flex-wrap: wrap утворює кілька рядків, align-content контролює їх розподіл по поперечній осі (аналогічно justify-content, але для рядків):

.container {
    display: flex;
    flex-wrap: wrap;
    align-content: flex-start; /* Рядки притиснуті до верху */
    align-content: center; /* Рядки по центру */
    align-content: space-between; /* Рядки розподілені рівномірно */
}
align-items вирівнює елементи всередині рядка. align-content вирівнює самі рядки відносно контейнера. align-content діє лише коли є кілька рядків (flex-wrap: wrap).

gap — проміжки між елементами

До gap розробники використовували margin на flex-елементах — і мусили оброблювати крайні випадки (перший/останній елемент). gap вирішує це елегантно:

<p class="label">gap: 1rem</p>
<div class="gap-box" style="gap: 1rem;">
    <div class="item">1</div>
    <div class="item">2</div>
    <div class="item">3</div>
    <div class="item">4</div>
</div>

<p class="label">row-gap: 0.5rem; column-gap: 2rem</p>
<div class="gap-box wrap" style="row-gap: 0.5rem; column-gap: 2rem;">
    <div class="item">1</div>
    <div class="item">2</div>
    <div class="item">3</div>
    <div class="item">4</div>
    <div class="item">5</div>
    <div class="item">6</div>
</div>
.label {
    font-family: system-ui, sans-serif;
    font-size: 0.8rem;
    font-weight: 600;
    color: #475569;
    margin: 0.75rem 0 0.2rem;
}

.gap-box {
    display: flex;
    padding: 0.75rem;
    background-color: #f1f5f9;
    border-radius: 8px;
}

.gap-box.wrap {
    flex-wrap: wrap;
    max-width: 350px;
}

.item {
    padding: 0.5rem 1.25rem;
    background-color: #3b82f6;
    color: white;
    border-radius: 4px;
    font-family: system-ui, sans-serif;
    font-size: 0.85rem;
    font-weight: 600;
}
Preview
gap замість margin — сучасний стандарт для проміжків у flex та grid. Він створює простір лише між елементами, без зайвих відступів на краях. Забудьте про margin-right на flex-елементах!

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

flex-grow — здатність зростати

Визначає, як елемент розширюється, заповнюючи вільний простір:

<p class="label">flex-grow: 0 (за замовчуванням) — елементи не ростуть</p>
<div class="grow-box">
    <div class="item">1</div>
    <div class="item">2</div>
    <div class="item">3</div>
</div>

<p class="label">flex-grow: 1 — всі елементи ростуть рівномірно</p>
<div class="grow-box">
    <div class="item" style="flex-grow:1;">1</div>
    <div class="item" style="flex-grow:1;">2</div>
    <div class="item" style="flex-grow:1;">3</div>
</div>

<p class="label">flex-grow: 1 / 2 / 1 — середній отримує вдвічі більше простору</p>
<div class="grow-box">
    <div class="item" style="flex-grow:1;">1</div>
    <div class="item grow-2" style="flex-grow:2;">2</div>
    <div class="item" style="flex-grow:1;">3</div>
</div>
.label {
    font-family: system-ui, sans-serif;
    font-size: 0.8rem;
    font-weight: 600;
    color: #475569;
    margin: 0.75rem 0 0.2rem;
}

.grow-box {
    display: flex;
    gap: 0.5rem;
    padding: 0.75rem;
    background-color: #f1f5f9;
    border-radius: 8px;
}

.item {
    padding: 0.5rem 1rem;
    background-color: #3b82f6;
    color: white;
    border-radius: 4px;
    font-family: system-ui, sans-serif;
    font-size: 0.85rem;
    font-weight: 600;
    text-align: center;
}

.grow-2 {
    background-color: #f59e0b;
}
Preview

flex-shrink — здатність стискатись

Визначає, як елемент стискається, коли простору недостатньо:

.item-a {
    flex-shrink: 1;
} /* Стискається нормально (default) */
.item-b {
    flex-shrink: 0;
} /* НЕ стискається — зберігає свій розмір */
.item-c {
    flex-shrink: 2;
} /* Стискається вдвічі більше за інших */

flex-basis — початковий розмір

Визначає початковий розмір елемента перед розподілом вільного простору:

.item {
    flex-basis: 200px; /* Початковий розмір 200px */
    flex-basis: 30%; /* 30% від контейнера */
    flex-basis: auto; /* Розмір з width або вмісту (default) */
    flex-basis: 0; /* Ігнорувати вміст — весь простір через flex-grow */
}

Скорочення flex

Рекомендовано завжди використовувати скорочення замість окремих властивостей:

/* flex: grow shrink basis */
.item {
    flex: 0 1 auto;
} /* За замовчуванням */
.item {
    flex: 1;
} /* flex: 1 1 0 — рівномірний розподіл */
.item {
    flex: auto;
} /* flex: 1 1 auto — росте, враховуючи вміст */
.item {
    flex: none;
} /* flex: 0 0 auto — фіксований розмір */
.item {
    flex: 0 0 200px;
} /* Фіксований 200px, не росте, не стискається */

flex: 1

Найчастіший варіант. Усі елементи рівні: кожен отримує однакову частку вільного простору. flex-basis: 0 — ігнорує різницю у вмісті.

flex: auto

Елементи ростуть пропорційно до вмісту: елемент із більшим текстом буде ширшим. flex-basis: auto — враховує width або вміст.

flex: none

Елемент фіксований — не росте і не стискається. Зберігає свій природний або явно заданий розмір.

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

За замовчуванням елементи йдуть у порядку HTML. order змінює це візуально (без зміни DOM):

<div class="order-box">
    <div class="item" style="order: 3;">HTML: 1 → order: 3</div>
    <div class="item special" style="order: 1;">HTML: 2 → order: 1</div>
    <div class="item" style="order: 2;">HTML: 3 → order: 2</div>
</div>
.order-box {
    display: flex;
    gap: 0.5rem;
    padding: 0.75rem;
    background-color: #f1f5f9;
    border-radius: 8px;
    font-family: system-ui, sans-serif;
}

.item {
    flex: 1;
    padding: 0.75rem;
    background-color: #3b82f6;
    color: white;
    border-radius: 6px;
    font-size: 0.8rem;
    font-weight: 600;
    text-align: center;
}

.special {
    background-color: #f59e0b;
}
Preview
order змінює лише візуальний порядок. Для скрін-рідерів та навігації через Tab елементи залишаються у порядку HTML. Не зловживайте order — якщо порядок важливий для логіки, змініть HTML.

Практичні макети

Навігаційна панель

<nav class="navbar">
    <div class="logo">🚀 MySite</div>
    <ul class="nav-links">
        <li><a href="#">Головна</a></li>
        <li><a href="#">Про нас</a></li>
        <li><a href="#">Послуги</a></li>
        <li><a href="#">Контакти</a></li>
    </ul>
    <button class="nav-btn">Увійти</button>
</nav>
.navbar {
    display: flex;
    align-items: center;
    justify-content: space-between;
    padding: 0.75rem 1.5rem;
    background-color: #1e293b;
    border-radius: 10px;
    font-family: system-ui, sans-serif;
}

.logo {
    font-size: 1.2rem;
    font-weight: 700;
    color: white;
}

.nav-links {
    display: flex;
    list-style: none;
    margin: 0;
    padding: 0;
    gap: 0.25rem;
}

.nav-links a {
    color: #94a3b8;
    text-decoration: none;
    padding: 0.5rem 0.75rem;
    border-radius: 6px;
    font-size: 0.9rem;
    transition: all 0.2s;
}

.nav-links a:hover {
    color: white;
    background-color: #334155;
}

.nav-btn {
    padding: 0.5rem 1.25rem;
    background-color: #3b82f6;
    color: white;
    border: none;
    border-radius: 6px;
    font-size: 0.9rem;
    cursor: pointer;
    font-family: inherit;
    transition: background-color 0.2s;
}

.nav-btn:hover {
    background-color: #2563eb;
}
Preview

Ключ: justify-content: space-between розподіляє лого, посилання та кнопку по краях.

Сітка карток

<div class="card-grid">
    <div class="card">
        <div class="card-icon">🎨</div>
        <h3>Дизайн</h3>
        <p>Створення унікальних інтерфейсів</p>
    </div>
    <div class="card">
        <div class="card-icon"></div>
        <h3>Розробка</h3>
        <p>Швидкі та надійні рішення</p>
    </div>
    <div class="card">
        <div class="card-icon">🚀</div>
        <h3>Деплой</h3>
        <p>Автоматизоване розгортання</p>
    </div>
</div>
.card-grid {
    display: flex;
    gap: 1rem;
    font-family: system-ui, sans-serif;
}

.card {
    flex: 1;
    padding: 1.5rem;
    background-color: #f8fafc;
    border: 1px solid #e2e8f0;
    border-radius: 12px;
    text-align: center;
    transition:
        transform 0.2s,
        box-shadow 0.2s;
}

.card:hover {
    transform: translateY(-4px);
    box-shadow: 0 8px 25px rgba(0, 0, 0, 0.1);
}

.card-icon {
    font-size: 2rem;
    margin-bottom: 0.5rem;
}

.card h3 {
    margin: 0 0 0.5rem;
    font-size: 1.1rem;
    color: #1e293b;
}

.card p {
    margin: 0;
    font-size: 0.85rem;
    color: #64748b;
    line-height: 1.5;
}
Preview

Футер, що завжди внизу сторінки — навіть коли контенту мало:

body {
    display: flex;
    flex-direction: column;
    min-height: 100vh; /* Мінімальна висота = весь екран */
    margin: 0;
}

main {
    flex: 1; /* Розтягується, заповнюючи весь вільний простір */
}

footer {
    /* Футер автоматично притиснутий до низу */
}
min-height: 100vh + flex: 1 на <main> — класичний патерн sticky footer. <main> займає весь вільний простір, виштовхуючи футер донизу, навіть якщо контенту мало.

Зведена таблиця властивостей

Властивості контейнера (display: flex)

ВластивістьЗначенняЩо робить
flex-directionrow, column, row-reverse, column-reverseНапрямок головної осі
justify-contentflex-start, center, flex-end, space-between, space-around, space-evenlyВирівнювання по головній осі
align-itemsstretch, flex-start, center, flex-end, baselineВирівнювання по поперечній осі
flex-wrapnowrap, wrap, wrap-reverseПеренос елементів
align-contentЯк justify-contentВирівнювання рядків при wrap
gaplengthПроміжки між елементами

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

ВластивістьЗначенняЩо робить
flexgrow shrink basisСкорочення для гнучкості
flex-grownumberЗдатність зростати (0 = не росте)
flex-shrinknumberЗдатність стискатися (0 = не стискається)
flex-basislength | autoПочатковий розмір
align-selfЯк align-itemsІндивідуальне вирівнювання
orderintegerВізуальний порядок

Практичні завдання

Рівень 1 — Базовий

Рівень 2 — Логіка та комбінування

Рівень 3 — Створення з нуля


Підсумок

📦 Контейнер

display: flex робить дочірні елементи гнучкими. flex-direction задає напрямок. gap — проміжки між ними.

↔️ justify-content

Вирівнювання по головній осі: center, space-between, space-evenly — найчастіші.

↕️ align-items

Вирівнювання по поперечній осі: center — вертикальне центрування, stretch — рівна висота.

🔀 flex: 1

flex: 1 — рівні частки простору. flex: none — фіксований. flex: 0 0 200px — точний розмір.

Корисні посилання

Copyright © 2026