Tailwind

Layout: Flexbox та Grid через Tailwind

Майстерня Layout в Tailwind CSS: повний Flexbox та Grid через utility-класи. Типові layout-патерни: Holy Grail, Card Grid, Sidebar, Sticky Footer. Subgrid та практичні приклади.

Layout: Flexbox та Grid через Tailwind

Чому Layout — серце будь-якого UI

Перш ніж кнопки, кольори, анімації — є Layout. Де розташовані елементи? Як вони адаптуються до розміру екрану? Як вирівняні заголовок, контент і футер?

У чистому CSS Layout вимагає розуміння bagатьох концепцій: display, position, flex, grid, float (вже ні), clearfix (вже ні). Tailwind перетворює ці концепції на передбачуваний набір класів. Але автоматизує лише синтаксис — розуміти Flexbox і Grid все одно потрібно.

Ця стаття — не "як вивчити Flexbox". Ця стаття — "як Flexbox і Grid виглядають у Tailwind і як вирішити типові задачі Layout".

Якщо ви не знайомі з Flexbox та Grid — спочатку прочитайте відповідні статті в розділі про CSS. Tailwind — це синтаксис поверх CSS-концепцій, а не їх заміна.

Flexbox у Tailwind

Активація Flexbox

<div class="flex">
    <!-- display: flex -->
    <div class="inline-flex"> <!-- display: inline-flex (не займає всю ширину) --></div>
</div>

Одним класом ви перетворюєте контейнер на flex-контейнер. Усі прямі дочірні елементи стають flex-items.

Основна вісь: flex-direction

<div class="flex flex-row">
    <!-- Рядок ліворуч→праворуч (за замовчуванням) -->
    <div class="flex flex-row-reverse">
        <!-- Рядок праворуч→ліворуч -->
        <div class="flex flex-col">
            <!-- Колонка зверху→вниз -->
            <div class="flex flex-col-reverse"><!-- Колонка знизу→вгору --></div>
        </div>
    </div>
</div>

flex-col — один з найуживаніших класів: картки, форми, sidebar — все будується у стовпець.

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

При flex-row головна вісь — горизонтальна. При flex-col — вертикальна.

<div class="flex justify-start">
    <!-- На початку (default) -->
    <div class="flex justify-center">
        <!-- По центру -->
        <div class="flex justify-end">
            <!-- В кінці -->
            <div class="flex justify-between">
                <!-- Рівномірно, крайні впритул до меж -->
                <div class="flex justify-around">
                    <!-- Рівномірно, crайні з відступом = ½ від між-елементних -->
                    <div class="flex justify-evenly"><!-- Однаковий відступ між усіма та краями --></div>
                </div>
            </div>
        </div>
    </div>
</div>

Вирівнювання по перехресній осі: align-items

<div class="flex items-start">
    <!-- Вершина контейнера -->
    <div class="flex items-center">
        <!-- Центр → найуживаніший! -->
        <div class="flex items-end">
            <!-- Дно -->
            <div class="flex items-stretch">
                <!-- Розтягнути до висоти контейнера (default) -->
                <div class="flex items-baseline"><!-- По базовій лінії тексту --></div>
            </div>
        </div>
    </div>
</div>

items-center → вирівняти вертикально по центру — мабуть, найчастіший Flexbox-запит.

Перенесення: flex-wrap

<div class="flex flex-nowrap">
    <!-- Не переносити (default) — може виїжджати за межі -->
    <div class="flex flex-wrap">
        <!-- Переносити на новий рядок -->
        <div class="flex flex-wrap-reverse"><!-- Переносити в зворотному порядку --></div>
    </div>
</div>

Gap між елементами

<div class="flex gap-4">
    <!-- gap: 1rem між усіма -->
    <div class="flex gap-x-6 gap-y-3"><!-- різний horizontal/vertical gap --></div>
</div>

Flex-items: поведінка дочірніх

<!-- flex-grow: чи розтягується елемент, щоб зайняти вільний простір -->
<div class="flex-1">
    <!-- flex: 1 1 0% — рівний розподіл простору -->
    <div class="grow">
        <!-- flex-grow: 1 — росте, але не скорочується -->
        <div class="grow-0">
            <!-- flex-grow: 0 — не росте -->

            <!-- flex-shrink: чи скорочується при нестачі місця -->
            <div class="shrink">
                <!-- flex-shrink: 1 (default) -->
                <div class="shrink-0">
                    <!-- flex-shrink: 0 — НЕ скорочується → для фіксованих колонок -->

                    <!-- flex-basis: початковий розмір -->
                    <div class="basis-1/3">
                        <!-- flex-basis: 33.333% -->
                        <div class="basis-64">
                            <!-- flex-basis: 16rem -->
                            <div class="basis-auto">
                                <!-- flex-basis: auto -->

                                <!-- flex shorthand -->
                                <div class="flex-auto">
                                    <!-- flex: 1 1 auto -->
                                    <div class="flex-none"><!-- flex: none (фіксований, не grow/shrink) --></div>
                                </div>
                            </div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

Order та Align Self

<div class="order-first">
    <!-- order: -9999 (першим) -->
    <div class="order-last">
        <!-- order: 9999 (останнім) -->
        <div class="order-2">
            <!-- order: 2 -->

            <div class="self-start">
                <!-- align-self: flex-start -->
                <div class="self-center">
                    <!-- align-self: center -->
                    <div class="self-end">
                        <!-- align-self: flex-end -->
                        <div class="self-stretch"><!-- align-self: stretch --></div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

Типові Flexbox-патерни

Патерн 1: Navbar

Класика — лого ліворуч, навігація по центру або праворуч:

Preview
×
🔒localhost:3000

Ключові класи: justify-between — розсунути лого і CTA по краях; items-center — вирівняти вертикально; gap-3 — відступи між кнопками.

Типова задача — картки різної висоти, але кнопки на одному рівні:

Preview
×
🔒localhost:3000

flex flex-col на картці + grow на секції контенту — класичне рішення для "sticky footer" всередині картки.


Grid у Tailwind

Активація Grid

<div class="grid">
    <!-- display: grid -->
    <div class="inline-grid"> <!-- display: inline-grid --></div>
</div>

Колонки: grid-cols-{n}

<div class="grid grid-cols-1">
    <!-- 1 колонка -->
    <div class="grid grid-cols-2">
        <!-- 2 рівні колонки -->
        <div class="grid grid-cols-3">
            <!-- 3 рівні колонки -->
            <div class="grid grid-cols-4">
                <!-- 4 рівні колонки -->
                <div class="grid grid-cols-12"><!-- 12-колонна сітка (Bootstrap-стиль) --></div>
            </div>
        </div>
    </div>
</div>

Все, що не влізає — переноситься на новий рядок автоматично.

Gap у Grid

<div class="grid grid-cols-3 gap-4">
    <!-- 1rem між усіма комірками -->
    <div class="grid grid-cols-3 gap-x-6 gap-y-4"><!-- різний horizontal/vertical --></div>
</div>

Span — розтягнути елемент на кілька колонок/рядків

<!-- Колонки -->
<div class="col-span-2">
    <!-- займає 2 колонки -->
    <div class="col-span-3">
        <!-- займає 3 колонки  -->
        <div class="col-span-full">
            <!-- займає всю ширину сітки -->

            <!-- Рядки -->
            <div class="row-span-2">
                <!-- займає 2 рядки -->
                <div class="row-span-3"></div>
            </div>
        </div>
    </div>
</div>

Позиціонування в сітці

<!-- Явне розміщення -->
<div class="col-start-2">
    <!-- починається з колонки 2 -->
    <div class="col-start-1 col-end-3">
        <!-- від колонки 1 до 3 -->
        <div class="row-start-2 row-end-4"></div>
    </div>
</div>

Auto-fit та Auto-fill через Arbitrary

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

<!-- Мінімум 200px на колонку — скільки влізе -->
<div class="grid grid-cols-[repeat(auto-fill,minmax(200px,1fr))] gap-4"></div>

Це arbitrary value — про них детально у окремій статті.

Rows: адаптивна висота рядків

<div class="grid grid-rows-3">
    <!-- 3 рядки рівної висоти -->
    <div class="grid auto-rows-fr">
        <!-- кожен рядок займає рівну частку -->
        <div class="grid auto-rows-min"><!-- рядки за мінімальним contento  --></div>
    </div>
</div>

Subgrid: CSS Subgrid у Tailwind v4

Subgrid — вкладений grid успадковує треки батька. Це вирівнює елементи між картками:

<div class="grid grid-cols-3 gap-6">
    <!-- Без subgrid: кожна картка має власну grid -->
    <div class="grid grid-rows-[auto_1fr_auto] gap-0 bg-white rounded-xl p-5">
        <h3>Заголовок</h3>
        <p class="text-sm mt-2">Varied content length</p>
        <button>Дія</button>
    </div>

    <!-- З CSS Subgrid: row: span 3 + grid-template-rows: subgrid -->
    <div class="grid row-span-3 [grid-template-rows:subgrid] bg-white rounded-xl p-5">
        <h3>Заголовок</h3>
        <p class="text-sm">Будь-яка довжина — кнопки вирівняні!</p>
        <button>Дія</button>
    </div>
</div>

У Tailwind v4: grid-cols-subgrid і grid-rows-subgrid — власні утиліти для subgrid:

<div class="grid grid-cols-3">
    <div class="grid grid-cols-subgrid col-span-3">
        <!-- Успадковує колонки батька -->
        <div>1</div>
        <div>2</div>
        <div>3</div>
    </div>
</div>

Типові Grid-патерни

Патерн: Card Grid з адаптивністю

Preview
×
🔒localhost:3000
Preview
×
🔒localhost:3000

Ключ до цього layout: вкладені grid. Зовнішній — grid-rows-[auto_1fr_auto] (header + middle + footer). Внутрішній (middle) — grid-cols-[220px_1fr] (sidebar + main).

Preview
×
🔒localhost:3000

Адаптивний Layout: breakpoint-варіанти

Tailwind має mobile-first підхід: клас без префіксу діє на всіх розмірах, а префіх-варіант перевизначає зі вказаного breakpoint і вище.

ВаріантBreakpointCSS min-width
(нема)Всі розміри
sm:small640px
md:medium768px
lg:large1024px
xl:extra-large1280px
2xl:2x extra-large1536px
<!-- Мобільний: 1 колонка → tablet: 2 → desktop: 4 -->
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-4">
    <!-- Мобільний: flex-col → tablet: flex-row -->
    <div class="flex flex-col md:flex-row gap-4">
        <!-- Схований на мобільному, видимий на lg+ -->
        <aside class="hidden lg:block w-64">
            <!-- Повна ширина на мобільному, авто на md+ -->
            <button class="w-full md:w-auto px-6 py-2 bg-indigo-600 text-white rounded-lg"></button>
        </aside>
    </div>
</div>

Tailwind v4: max-* варіанти

У Tailwind v4 з'явилися max-* варіанти — "тільки до breakpoint":

<!-- Тільки на мобільному (до sm) -->
<div class="max-sm:hidden">Приховано до sm</div>

<!-- Від md до lg -->
<div class="md:max-lg:flex">Flex тільки між md і lg</div>

Placement та Z-Index

Absolute розміщення в relative контейнері

<!-- relative = точка відліку для absolute дочірніх -->
<div class="relative w-48 h-32 bg-indigo-100 rounded-xl">
    <!-- Кут: absolute + top/right -->
    <span class="absolute top-2 right-2 px-2 py-0.5 bg-red-500 text-white text-xs rounded-full"> New </span>
    <!-- Перекриває: absolute + inset-0 (top+right+bottom+left = 0) -->
    <div
        class="absolute inset-0 bg-black/50 rounded-xl flex items-center justify-center text-white text-sm opacity-0 hover:opacity-100 transition-opacity"
    >
        Hover overlay
    </div>
</div>

Sticky елементи

<!-- Sticky navbar -->
<nav class="sticky top-0 z-50 bg-white border-b border-gray-200 shadow-sm">
    <!-- Sticky sidebar в межах контейнера -->
    <aside class="sticky top-24 h-fit"></aside>
</nav>

Детальний розгляд Position — у статті про властивості (03).


Завдання для самоперевірки


Попередня стаття: Utility-класи: основи та системаНаступна стаття: Кастомізація теми через @theme

Copyright © 2026