Layout: Flexbox та Grid через Tailwind
Layout: Flexbox та Grid через Tailwind
Чому Layout — фундамент будь-якого UI
Перш ніж кольори, типографіка чи анімації — існує Layout. Layout відповідає на фундаментальні питання: де розташовуються елементи? як вони групуються? як адаптуються до різних розмірів екрану? Без чіткого розуміння layout навіть найкращий дизайн перетворюється на хаос.
У чистому CSS layout вимагає глибокого знання display, position, float, flex і grid — кожне з власними правилами та взаємодіями. Tailwind не вивчає ці концепції замість вас — він перетворює їх на передбачуваний набір класів, що дозволяє зосередитися на вирішенні layout-задачі, а не на синтаксисі CSS.
Ця стаття розбирає два фундаментальних layout-механізми: Flexbox — для одновимірних layout (рядок або колонка), та CSS Grid — для двовимірних сіток. Для кожного ми розглянемо всі ключові властивості через Tailwind і завершимо реальними layout-патернами.
Flexbox у Tailwind: одновимірний layout
Flexbox вирішує задачу одновимірного розподілу: елементи в рядку або колонці з гнучким управлінням вирівнюванням та розподілом простору. Якщо вам потрібно вирівняти елементи по горизонталі або вертикалі, розподілити простір між ними, або побудувати navbar, картку, форму — Flexbox є природним вибором.
Активація: flex та inline-flex
<!-- display: flex — контейнер займає повну ширину рядка -->
<div class="flex">
<!-- Всі прямі дочірні елементи стають flex-items -->
<div>Item 1</div>
<div>Item 2</div>
</div>
<!-- display: inline-flex — контейнер лише за шириною вмісту -->
<span class="inline-flex items-center gap-2 px-3 py-1 bg-indigo-100 rounded-full">
<span class="size-2 rounded-full bg-indigo-500"></span>
Активний
</span>
<!DOCTYPE html>
<html lang="uk">
<head>
<meta charset="UTF-8" />
<script src="https://cdn.tailwindcss.com"></script>
<link
href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap"
rel="stylesheet"
/>
</head>
<body class="p-6 bg-slate-50 flex flex-col gap-6" style="font-family: 'Inter', system-ui, sans-serif;">
<div>
<p class="text-xs font-semibold text-slate-400 uppercase tracking-wider mb-2">
display: flex (контейнер займає повну ширину)
</p>
<div class="flex gap-3 bg-white p-4 rounded-xl border border-slate-200 shadow-sm">
<div class="px-4 py-2 bg-indigo-600 text-white rounded-lg font-medium text-sm">Item 1</div>
<div class="px-4 py-2 bg-indigo-600 text-white rounded-lg font-medium text-sm">Item 2</div>
</div>
</div>
<div>
<p class="text-xs font-semibold text-slate-400 uppercase tracking-wider mb-2">
display: inline-flex (контейнер за шириною вмісту)
</p>
<div class="bg-white p-4 rounded-xl border border-slate-200 shadow-sm">
<span
class="inline-flex items-center gap-2 px-3 py-1 bg-indigo-100 rounded-full text-indigo-800 text-sm font-medium"
>
<span class="size-2 rounded-full bg-indigo-500 animate-ping"></span>
Активний
</span>
</div>
</div>
</body>
</html>
Різниця між flex та inline-flex аналогічна різниці між block та inline-block: перший займає всю ширину батьківського контейнера, другий — лише стільки, скільки потрібно вмісту.
Напрямок: flex-direction
Визначає основну вісь — напрямок, уздовж якого розміщуються flex-items:
<!-- flex-row: зліва направо (за замовчуванням) -->
<div class="flex flex-row gap-4">
<div>Ліворуч</div>
<div>Центр</div>
<div>Праворуч</div>
</div>
<!-- flex-row-reverse: справа наліво -->
<div class="flex flex-row-reverse gap-4">
<div>Показується останнім в DOM — але першим візуально</div>
</div>
<!-- flex-col: зверху вниз — для вертикальних layout -->
<div class="flex flex-col gap-4">
<h2>Заголовок</h2>
<p>Текст</p>
<button>CTA</button>
</div>
<!-- flex-col-reverse: знизу вгору -->
<div class="flex flex-col-reverse gap-4">
<footer>Показується першим в DOM — але внизу</footer>
<main>Основний контент</main>
</div>
<!DOCTYPE html>
<html lang="uk">
<head>
<meta charset="UTF-8" />
<script src="https://cdn.tailwindcss.com"></script>
<link
href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap"
rel="stylesheet"
/>
</head>
<body class="p-6 bg-slate-50 flex flex-col gap-8" style="font-family: 'Inter', system-ui, sans-serif;">
<!-- flex-row -->
<div>
<p class="text-xs font-semibold text-slate-400 uppercase tracking-wider mb-2">flex-row (зліва направо)</p>
<div class="flex flex-row gap-4 bg-white p-4 rounded-xl border border-slate-200 shadow-sm">
<div class="px-4 py-2 bg-indigo-600 text-white rounded-lg font-medium text-sm">Ліворуч</div>
<div class="px-4 py-2 bg-indigo-600 text-white rounded-lg font-medium text-sm">Центр</div>
<div class="px-4 py-2 bg-indigo-600 text-white rounded-lg font-medium text-sm">Праворуч</div>
</div>
</div>
<!-- flex-row-reverse -->
<div>
<p class="text-xs font-semibold text-slate-400 uppercase tracking-wider mb-2">
flex-row-reverse (справа наліво)
</p>
<div class="flex flex-row-reverse gap-4 bg-white p-4 rounded-xl border border-slate-200 shadow-sm">
<div class="px-4 py-2 bg-indigo-600 text-white rounded-lg font-medium text-sm">Перший в DOM</div>
<div class="px-4 py-2 bg-slate-400 text-white rounded-lg font-medium text-sm">Другий</div>
<div class="px-4 py-2 bg-slate-400 text-white rounded-lg font-medium text-sm">
Останній в DOM (але перший візуально)
</div>
</div>
</div>
<!-- flex-col -->
<div>
<p class="text-xs font-semibold text-slate-400 uppercase tracking-wider mb-2">flex-col (зверху вниз)</p>
<div class="flex flex-col gap-3 bg-white p-4 rounded-xl border border-slate-200 shadow-sm max-w-xs">
<h2 class="font-bold text-slate-900 text-base">Заголовок</h2>
<p class="text-sm text-slate-500">Описовий текст елемента.</p>
<button class="px-4 py-2 bg-indigo-600 hover:bg-indigo-700 text-white text-xs font-semibold rounded-lg">
CTA Кнопка
</button>
</div>
</div>
<!-- flex-col-reverse -->
<div>
<p class="text-xs font-semibold text-slate-400 uppercase tracking-wider mb-2">
flex-col-reverse (знизу вгору)
</p>
<div class="flex flex-col-reverse gap-3 bg-white p-4 rounded-xl border border-slate-200 shadow-sm max-w-xs">
<footer class="text-xs text-slate-400 pt-2 border-t">Показується першим в DOM — але внизу</footer>
<main class="text-sm text-slate-700">Основний контент</main>
</div>
</div>
</body>
</html>
flex-col — один із найуживаніших класів у Tailwind: картки, форми, sidebar, модальні вікна — все будується у стовпець із потрібними відступами.
Вирівнювання по головній осі: justify-content
Контролює розподіл простору вздовж основної осі (горизонтально при flex-row, вертикально при flex-col):
| Клас | CSS | Ефект |
|---|---|---|
justify-start | justify-content: flex-start | На початку (default) |
justify-center | justify-content: center | По центру |
justify-end | justify-content: flex-end | В кінці |
justify-between | justify-content: space-between | Крайні впритул, простір між |
justify-around | justify-content: space-around | Рівний простір навколо кожного |
justify-evenly | justify-content: space-evenly | Однаковий простір між усіма та краями |
justify-stretch | justify-content: stretch | Розтягнути items |
<!-- justify-between: класичний navbar або pagination -->
<div class="flex justify-between items-center px-6 py-4">
<span class="font-bold">Лого</span>
<nav class="flex gap-4">...</nav>
<button>CTA</button>
</div>
<!-- justify-center: центрований контент -->
<div class="flex justify-center gap-4 py-8">
<button>Так</button>
<button>Ні</button>
</div>
<!-- justify-end: кнопки вирівняні по правому краю -->
<div class="flex justify-end gap-3 pt-4 border-t">
<button class="btn-ghost">Скасувати</button>
<button class="btn-primary">Зберегти</button>
</div>
<!DOCTYPE html>
<html lang="uk">
<head>
<meta charset="UTF-8" />
<script src="https://cdn.tailwindcss.com"></script>
<link
href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap"
rel="stylesheet"
/>
</head>
<body class="p-6 bg-slate-50 flex flex-col gap-6" style="font-family: 'Inter', system-ui, sans-serif;">
<!-- justify-between -->
<div>
<p class="text-xs font-semibold text-slate-400 uppercase tracking-wider mb-2">
justify-between (навігаційна панель)
</p>
<div
class="flex justify-between items-center px-6 py-3 bg-white rounded-xl border border-slate-200 shadow-sm"
>
<span class="font-bold text-slate-900">Лого</span>
<nav class="flex gap-4 text-xs font-medium text-slate-500">
<span class="cursor-pointer hover:text-indigo-600">Головна</span>
<span class="cursor-pointer hover:text-indigo-600">Про нас</span>
</nav>
<button
class="px-3 py-1.5 bg-indigo-600 hover:bg-indigo-700 text-white text-xs font-semibold rounded-lg"
>
CTA
</button>
</div>
</div>
<!-- justify-center -->
<div>
<p class="text-xs font-semibold text-slate-400 uppercase tracking-wider mb-2">
justify-center (діалогові кнопки)
</p>
<div class="flex justify-center gap-3 py-4 bg-white rounded-xl border border-slate-200 shadow-sm">
<button class="px-4 py-2 bg-indigo-600 hover:bg-indigo-700 text-white text-xs font-semibold rounded-lg">
Так
</button>
<button
class="px-4 py-2 bg-slate-100 hover:bg-slate-200 text-slate-700 text-xs font-semibold rounded-lg"
>
Ні
</button>
</div>
</div>
<!-- justify-end -->
<div>
<p class="text-xs font-semibold text-slate-400 uppercase tracking-wider mb-2">
justify-end (кнопки дій у формі)
</p>
<div class="flex justify-end gap-3 p-4 bg-white rounded-xl border border-slate-200 shadow-sm">
<button
class="px-4 py-2 border border-slate-200 text-slate-700 text-xs font-semibold rounded-lg hover:bg-slate-50"
>
Скасувати
</button>
<button class="px-4 py-2 bg-indigo-600 hover:bg-indigo-700 text-white text-xs font-semibold rounded-lg">
Зберегти
</button>
</div>
</div>
</body>
</html>
Вирівнювання по перехресній осі: align-items
Контролює вирівнювання перпендикулярно основній осі (вертикально при flex-row):
| Клас | CSS | Ефект |
|---|---|---|
items-start | align-items: flex-start | Верх контейнера |
items-center | align-items: center | Центр (найуживаніший!) |
items-end | align-items: flex-end | Дно |
items-stretch | align-items: stretch | Розтягнути по висоті (default) |
items-baseline | align-items: baseline | По базовій лінії тексту |
items-center — мабуть, найчастіший Flexbox-запит: вертикальне вирівнювання іконки та тексту, кнопки та label, лого та навігації.
<!-- Іконка + текст вирівняні по центру -->
<div class="flex items-center gap-2">
<svg class="size-5 text-indigo-600">...</svg>
<span class="text-sm font-medium">Збережено</span>
</div>
<!-- Елементи різної висоти — вирівняні по baseline тексту -->
<div class="flex items-baseline gap-4">
<h1 class="text-4xl font-black">$99</h1>
<span class="text-slate-500">/місяць</span>
</div>
<!DOCTYPE html>
<html lang="uk">
<head>
<meta charset="UTF-8" />
<script src="https://cdn.tailwindcss.com"></script>
<link
href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800;900&display=swap"
rel="stylesheet"
/>
</head>
<body class="p-6 bg-slate-50 flex flex-col gap-6" style="font-family: 'Inter', system-ui, sans-serif;">
<!-- items-center -->
<div>
<p class="text-xs font-semibold text-slate-400 uppercase tracking-wider mb-2">
items-center (вирівнювання іконки та тексту)
</p>
<div class="flex items-center gap-2 p-4 bg-white rounded-xl border border-slate-200 shadow-sm max-w-xs">
<svg
class="size-5 text-indigo-600 shrink-0"
fill="none"
viewBox="0 0 24 24"
stroke="currentColor"
stroke-width="2"
>
<path stroke-linecap="round" stroke-linejoin="round" d="M5 13l4 4L19 7" />
</svg>
<span class="text-sm font-semibold text-slate-700">Збережено в хмару</span>
</div>
</div>
<!-- items-baseline -->
<div>
<p class="text-xs font-semibold text-slate-400 uppercase tracking-wider mb-2">
items-baseline (вирівнювання за базовою лінією тексту)
</p>
<div class="flex items-baseline gap-1.5 p-4 bg-white rounded-xl border border-slate-200 shadow-sm max-w-xs">
<h1 class="text-4xl font-black text-slate-900">$99</h1>
<span class="text-slate-500 text-xs font-medium">/місяць</span>
</div>
</div>
</body>
</html>
Перенесення: flex-wrap
Визначає, чи переносяться flex-items на новий рядок при переповненні:
<!-- flex-nowrap: не переносити (default) — може виходити за межі -->
<div class="flex flex-nowrap gap-2 overflow-x-auto">
<!-- горизонтальний скрол при переповненні -->
</div>
<!-- flex-wrap: переносити на новий рядок -->
<div class="flex flex-wrap gap-3">
<!-- tags, chips, badges — природньо переносяться -->
<span class="badge">HTML</span>
<span class="badge">CSS</span>
<span class="badge">JavaScript</span>
<span class="badge">React</span>
<span class="badge">Tailwind</span>
<span class="badge">Node.js</span>
</div>
<!DOCTYPE html>
<html lang="uk">
<head>
<meta charset="UTF-8" />
<script src="https://cdn.tailwindcss.com"></script>
<link
href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap"
rel="stylesheet"
/>
</head>
<body class="p-6 bg-slate-50 flex flex-col gap-6" style="font-family: 'Inter', system-ui, sans-serif;">
<!-- flex-nowrap з overflow-x-auto -->
<div>
<p class="text-xs font-semibold text-slate-400 uppercase tracking-wider mb-2">
flex-nowrap з overflow-x-auto (горизонтальний скрол)
</p>
<div
class="flex flex-nowrap gap-3 bg-white p-4 rounded-xl border border-slate-200 shadow-sm overflow-x-auto max-w-sm"
>
<span class="shrink-0 px-3 py-1.5 bg-indigo-50 text-indigo-700 text-xs font-semibold rounded-lg"
>Категорія 1</span
>
<span class="shrink-0 px-3 py-1.5 bg-indigo-50 text-indigo-700 text-xs font-semibold rounded-lg"
>Категорія 2</span
>
<span class="shrink-0 px-3 py-1.5 bg-indigo-50 text-indigo-700 text-xs font-semibold rounded-lg"
>Категорія 3</span
>
<span class="shrink-0 px-3 py-1.5 bg-indigo-50 text-indigo-700 text-xs font-semibold rounded-lg"
>Категорія 4</span
>
<span class="shrink-0 px-3 py-1.5 bg-indigo-50 text-indigo-700 text-xs font-semibold rounded-lg"
>Категорія 5</span
>
<span class="shrink-0 px-3 py-1.5 bg-indigo-50 text-indigo-700 text-xs font-semibold rounded-lg"
>Категорія 6</span
>
</div>
</div>
<!-- flex-wrap -->
<div>
<p class="text-xs font-semibold text-slate-400 uppercase tracking-wider mb-2">
flex-wrap (автоматичний перенос badges)
</p>
<div class="flex flex-wrap gap-2 bg-white p-4 rounded-xl border border-slate-200 shadow-sm max-w-sm">
<span
class="px-3 py-1.5 bg-slate-100 hover:bg-slate-200 text-slate-700 text-xs font-semibold rounded-full cursor-pointer transition-colors"
>HTML</span
>
<span
class="px-3 py-1.5 bg-slate-100 hover:bg-slate-200 text-slate-700 text-xs font-semibold rounded-full cursor-pointer transition-colors"
>CSS</span
>
<span
class="px-3 py-1.5 bg-slate-100 hover:bg-slate-200 text-slate-700 text-xs font-semibold rounded-full cursor-pointer transition-colors"
>JavaScript</span
>
<span
class="px-3 py-1.5 bg-slate-100 hover:bg-slate-200 text-slate-700 text-xs font-semibold rounded-full cursor-pointer transition-colors"
>React</span
>
<span
class="px-3 py-1.5 bg-slate-100 hover:bg-slate-200 text-slate-700 text-xs font-semibold rounded-full cursor-pointer transition-colors"
>Tailwind</span
>
<span
class="px-3 py-1.5 bg-slate-100 hover:bg-slate-200 text-slate-700 text-xs font-semibold rounded-full cursor-pointer transition-colors"
>Node.js</span
>
<span
class="px-3 py-1.5 bg-slate-100 hover:bg-slate-200 text-slate-700 text-xs font-semibold rounded-full cursor-pointer transition-colors"
>TypeScript</span
>
</div>
</div>
</body>
</html>
Gap між елементами
gap у Flexbox та Grid працює однаково — задає відступи між flex-items без margin:
<!-- Jednakowy gap між усіма елементами -->
<div class="flex gap-4">...</div>
<!-- 1rem між всіма -->
<div class="flex gap-2">...</div>
<!-- 0.5rem -->
<div class="flex gap-6">...</div>
<!-- 1.5rem -->
<!-- Різний горизонтальний та вертикальний gap -->
<div class="flex flex-wrap gap-x-6 gap-y-3">
<!-- gap-x: між колонками, gap-y: між рядками при wrap -->
</div>
<!DOCTYPE html>
<html lang="uk">
<head>
<meta charset="UTF-8" />
<script src="https://cdn.tailwindcss.com"></script>
<link
href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap"
rel="stylesheet"
/>
</head>
<body class="p-6 bg-slate-50 flex flex-col gap-6" style="font-family: 'Inter', system-ui, sans-serif;">
<!-- gap-4 -->
<div>
<p class="text-xs font-semibold text-slate-400 uppercase tracking-wider mb-2">
gap-4 (1rem / 16px відступи)
</p>
<div class="flex gap-4 bg-white p-4 rounded-xl border border-slate-200 shadow-sm">
<div
class="size-10 bg-indigo-600 text-white rounded-lg flex items-center justify-center font-bold text-sm"
>
1
</div>
<div
class="size-10 bg-indigo-600 text-white rounded-lg flex items-center justify-center font-bold text-sm"
>
2
</div>
<div
class="size-10 bg-indigo-600 text-white rounded-lg flex items-center justify-center font-bold text-sm"
>
3
</div>
</div>
</div>
<!-- gap-x-6 gap-y-3 -->
<div>
<p class="text-xs font-semibold text-slate-400 uppercase tracking-wider mb-2">
gap-x-6 gap-y-3 (горизонтальні 24px, вертикальні 12px)
</p>
<div
class="flex flex-wrap gap-x-6 gap-y-3 bg-white p-4 rounded-xl border border-slate-200 shadow-sm max-w-xs"
>
<div class="px-3 py-1.5 bg-emerald-600 text-white rounded-lg font-semibold text-xs">Item A</div>
<div class="px-3 py-1.5 bg-emerald-600 text-white rounded-lg font-semibold text-xs">Item B</div>
<div class="px-3 py-1.5 bg-emerald-600 text-white rounded-lg font-semibold text-xs">Item C</div>
<div class="px-3 py-1.5 bg-emerald-600 text-white rounded-lg font-semibold text-xs">Item D</div>
<div class="px-3 py-1.5 bg-emerald-600 text-white rounded-lg font-semibold text-xs">Item E</div>
</div>
</div>
</body>
</html>
Flex-items: властивості дочірніх елементів
Flex-items мають власні властивості, що контролюють їхню поведінку в контейнері:
flex-grow — ріст:
<!-- flex-1: flex: 1 1 0% — рівний розподіл вільного простору -->
<div class="flex">
<div class="w-48 shrink-0">Фіксований sidebar (shrink-0 — не стискається)</div>
<div class="flex-1">Основний контент (займає весь залишок)</div>
</div>
<!-- grow: flex-grow: 1 — росте, але не скорочується нижче мінімуму -->
<div class="flex gap-4">
<div class="grow">Розтягується</div>
<div class="grow-0">Не розтягується</div>
</div>
<!DOCTYPE html>
<html lang="uk">
<head>
<meta charset="UTF-8" />
<script src="https://cdn.tailwindcss.com"></script>
<link
href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap"
rel="stylesheet"
/>
</head>
<body class="p-6 bg-slate-50 flex flex-col gap-6" style="font-family: 'Inter', system-ui, sans-serif;">
<!-- flex-1 (sidebar + content) -->
<div>
<p class="text-xs font-semibold text-slate-400 uppercase tracking-wider mb-2">flex-1 (розподіл простору)</p>
<div class="flex bg-white rounded-xl border border-slate-200 shadow-sm overflow-hidden text-sm">
<div class="w-32 shrink-0 bg-slate-100 p-4 border-r border-slate-200 text-slate-700 font-medium">
Sidebar
</div>
<div class="flex-1 p-4 bg-white text-slate-900">
Основний контент, який займає весь вільний простір.
</div>
</div>
</div>
<!-- grow vs grow-0 -->
<div>
<p class="text-xs font-semibold text-slate-400 uppercase tracking-wider mb-2">grow vs grow-0</p>
<div
class="flex gap-4 bg-white p-4 rounded-xl border border-slate-200 shadow-sm text-center text-xs font-semibold"
>
<div class="grow bg-indigo-600 text-white p-3 rounded-lg">grow (Розтягується)</div>
<div class="grow-0 bg-slate-200 text-slate-700 p-3 rounded-lg">grow-0</div>
</div>
</div>
</body>
</html>
flex-shrink — стиснення:
<!-- shrink: flex-shrink: 1 (default) — стискається при нестачі місця -->
<!-- shrink-0: flex-shrink: 0 — НЕ стискається → для фіксованих елементів -->
<div class="flex">
<div class="shrink-0 w-64">Sidebar (завжди 256px)</div>
<div class="min-w-0 flex-1">Контент (стискається при потребі)</div>
</div>
<!DOCTYPE html>
<html lang="uk">
<head>
<meta charset="UTF-8" />
<script src="https://cdn.tailwindcss.com"></script>
<link
href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap"
rel="stylesheet"
/>
</head>
<body class="p-6 bg-slate-50 flex flex-col gap-4" style="font-family: 'Inter', system-ui, sans-serif;">
<p class="text-xs font-semibold text-slate-400 uppercase tracking-wider mb-1">
shrink-0 (не стискається) vs flex-1
</p>
<div class="flex bg-white rounded-xl border border-slate-200 shadow-sm overflow-hidden text-sm max-w-sm">
<div class="shrink-0 w-32 bg-indigo-600 text-white p-4 font-semibold text-center">
shrink-0 (Завжди 128px)
</div>
<div class="min-w-0 flex-1 p-4 text-slate-700 bg-slate-50">
Контент стискається за потреби, щоб вписатись у контейнер.
</div>
</div>
</body>
</html>
flex-basis — початковий розмір:
<div class="basis-1/3">33.333% ширини</div>
<div class="basis-64">16rem (256px)</div>
<div class="basis-auto">Розмір за контентом</div>
<div class="basis-0">Нульовий початковий розмір</div>
<!DOCTYPE html>
<html lang="uk">
<head>
<meta charset="UTF-8" />
<script src="https://cdn.tailwindcss.com"></script>
<link
href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap"
rel="stylesheet"
/>
</head>
<body class="p-6 bg-slate-50 flex flex-col gap-6" style="font-family: 'Inter', system-ui, sans-serif;">
<div>
<p class="text-xs font-semibold text-slate-400 uppercase tracking-wider mb-2">flex-basis приклад</p>
<div
class="flex gap-3 bg-white p-4 rounded-xl border border-slate-200 shadow-sm text-center text-xs font-bold text-white"
>
<div class="basis-1/3 bg-indigo-600 p-3 rounded-lg">basis-1/3</div>
<div class="basis-32 bg-emerald-600 p-3 rounded-lg">basis-32 (128px)</div>
<div class="basis-auto grow bg-slate-600 p-3 rounded-lg">basis-auto (grow)</div>
</div>
</div>
</body>
</html>
Скорочення:
<div class="flex-1">
<!-- flex: 1 1 0% — рівний розподіл -->
<div class="flex-auto">
<!-- flex: 1 1 auto — росте та скорочується -->
<div class="flex-none"><!-- flex: none — фіксований, не grow/shrink --></div>
</div>
</div>
Order та Align Self
<!-- order: зміна візуального порядку без зміни DOM -->
<div class="flex">
<div class="order-2">Другий</div>
<!-- показується другим -->
<div class="order-first">Перший</div>
<!-- order: -9999 → завжди перший -->
<div class="order-last">Останній</div>
<!-- order: 9999 → завжди останній -->
<div class="order-1">Перший числовий</div>
</div>
<!-- self-*: перевизначає align-items для конкретного item -->
<div class="flex items-start h-24">
<div class="self-start">Вгорі</div>
<div class="self-center">По центру</div>
<div class="self-end">Внизу</div>
<div class="self-stretch">На всю висоту</div>
</div>
<!DOCTYPE html>
<html lang="uk">
<head>
<meta charset="UTF-8" />
<script src="https://cdn.tailwindcss.com"></script>
<link
href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap"
rel="stylesheet"
/>
</head>
<body class="p-6 bg-slate-50 flex flex-col gap-6" style="font-family: 'Inter', system-ui, sans-serif;">
<!-- order -->
<div>
<p class="text-xs font-semibold text-slate-400 uppercase tracking-wider mb-2">
order (візуальний порядок items)
</p>
<div
class="flex gap-3 bg-white p-4 rounded-xl border border-slate-200 shadow-sm text-xs font-bold text-white"
>
<div class="order-2 bg-indigo-600 p-3 rounded-lg">1 (Показується другим)</div>
<div class="order-first bg-emerald-600 p-3 rounded-lg">2 (order-first)</div>
<div class="order-last bg-amber-600 p-3 rounded-lg">3 (order-last)</div>
<div class="order-1 bg-indigo-600 p-3 rounded-lg">4 (Показується першим серед числових)</div>
</div>
</div>
<!-- self-* -->
<div>
<p class="text-xs font-semibold text-slate-400 uppercase tracking-wider mb-2">
self-* (перевизначення align-items для конкретного item)
</p>
<div
class="flex items-start h-32 gap-3 bg-white p-4 rounded-xl border border-slate-200 shadow-sm text-xs font-bold text-white"
>
<div class="self-start bg-indigo-600 p-3 rounded-lg">self-start (Вгорі)</div>
<div class="self-center bg-indigo-600 p-3 rounded-lg">self-center (По центру)</div>
<div class="self-end bg-indigo-600 p-3 rounded-lg">self-end (Внизу)</div>
<div class="self-stretch bg-indigo-600 p-3 rounded-lg flex items-center justify-center">
self-stretch (На всю висоту)
</div>
</div>
</div>
</body>
</html>
🧪 Практика: Flexbox вирівнювання
Реалізуйте profile-card компонент: аватар size-16 rounded-full ліворуч (shrink-0), праворуч flex-1 flex flex-col gap-1: ім'я (font-bold text-slate-900), посада (text-sm text-slate-500), у footer картки flex justify-between items-center: кількість публікацій та кнопки «Підписатись / Повідомлення». Усе без жодного margin — тільки gap і flex.
Типові Flexbox-патерни
Патерн 1: Navbar — justify-between + items-center
Класичний навбар: лого ліворуч, навігація по центру, CTA-кнопки праворуч. Основа — flex justify-between items-center:
<!DOCTYPE html>
<html lang="uk">
<head>
<meta charset="UTF-8" />
<script src="https://cdn.tailwindcss.com"></script>
<link
href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap"
rel="stylesheet"
/>
</head>
<body style="font-family: 'Inter', system-ui, sans-serif;">
<nav class="flex items-center justify-between px-6 py-4 bg-white border-b border-slate-200 shadow-sm">
<!-- Лого -->
<a href="#" class="flex items-center gap-2 font-black text-slate-900 text-lg">
<span
class="size-8 bg-indigo-600 rounded-lg flex items-center justify-center text-white text-sm font-bold"
>T</span
>
Tailwind
</a>
<!-- Навігація -->
<ul class="flex items-center gap-1 list-none m-0 p-0">
<li>
<a
href="#"
class="px-3 py-2 text-sm font-medium text-slate-600 hover:text-slate-900 hover:bg-slate-100 rounded-lg transition-colors"
>Документація</a
>
</li>
<li>
<a
href="#"
class="px-3 py-2 text-sm font-medium text-slate-600 hover:text-slate-900 hover:bg-slate-100 rounded-lg transition-colors"
>Компоненти</a
>
</li>
<li>
<a href="#" class="px-3 py-2 text-sm font-medium text-indigo-600 bg-indigo-50 rounded-lg"
>Активна</a
>
</li>
<li>
<a
href="#"
class="px-3 py-2 text-sm font-medium text-slate-600 hover:text-slate-900 hover:bg-slate-100 rounded-lg transition-colors"
>Блог</a
>
</li>
</ul>
<!-- CTA -->
<div class="flex items-center gap-3">
<button class="text-sm font-medium text-slate-600 hover:text-slate-900 transition-colors">
Увійти
</button>
<button
class="px-4 py-2 bg-indigo-600 hover:bg-indigo-700 text-white text-sm font-semibold rounded-lg transition-colors"
>
Почати безкоштовно
</button>
</div>
</nav>
<div class="p-6 text-center text-slate-400 text-sm">
justify-between → лого + nav + CTA розподілені по ширині<br />
items-center → усі елементи вирівняні по центральній осі
</div>
</body>
</html>
Патерн 2: Картка з кнопкою завжди внизу — flex-col + grow
Класична задача: сітка карток із різним обсягом тексту, але кнопки на одному рівні. Рішення — flex flex-col на картці та grow на текстовому блоці:
<!DOCTYPE html>
<html lang="uk">
<head>
<meta charset="UTF-8" />
<script src="https://cdn.tailwindcss.com"></script>
<link
href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap"
rel="stylesheet"
/>
</head>
<body class="p-8 bg-slate-100" style="font-family: 'Inter', system-ui, sans-serif;">
<p class="text-xs font-bold text-slate-400 uppercase tracking-widest mb-5 text-center">
flex flex-col + grow → кнопки завжди на одному рівні
</p>
<div class="grid grid-cols-3 gap-4">
<!-- Картка 1: короткий текст -->
<div class="bg-white rounded-2xl border border-indigo-200 ring-1 ring-indigo-200 p-5 flex flex-col">
<div class="w-10 h-10 bg-indigo-100 rounded-xl flex items-center justify-center text-xl mb-4">🎨</div>
<h3 class="font-bold text-slate-900 text-sm">Дизайн</h3>
<p class="text-xs text-slate-500 mt-2 leading-relaxed grow">Компоненти та дизайн-системи.</p>
<!-- mt-auto або grow на тексті → кнопка завжди внизу -->
<button
class="mt-4 w-full py-2 bg-indigo-600 hover:bg-indigo-700 text-white text-xs font-semibold rounded-xl transition-colors"
>
Дізнатись →
</button>
</div>
<!-- Картка 2: довгий текст -->
<div class="bg-white rounded-2xl border border-indigo-200 ring-1 ring-indigo-200 p-5 flex flex-col">
<div class="w-10 h-10 bg-emerald-100 rounded-xl flex items-center justify-center text-xl mb-4">⚡</div>
<h3 class="font-bold text-slate-900 text-sm">Продуктивність</h3>
<p class="text-xs text-slate-500 mt-2 leading-relaxed grow">
Оптимізація та швидкість веб-застосунків. Lightning CSS engine забезпечує компіляцію в 10 разів
швидше. Менше конфігурації, більше результату.
</p>
<button
class="mt-4 w-full py-2 bg-indigo-600 hover:bg-indigo-700 text-white text-xs font-semibold rounded-xl transition-colors"
>
Дізнатись →
</button>
</div>
<!-- Картка 3: середній текст -->
<div class="bg-white rounded-2xl border border-indigo-200 ring-1 ring-indigo-200 p-5 flex flex-col">
<div class="w-10 h-10 bg-violet-100 rounded-xl flex items-center justify-center text-xl mb-4">🔒</div>
<h3 class="font-bold text-slate-900 text-sm">Безпека</h3>
<p class="text-xs text-slate-500 mt-2 leading-relaxed grow">
Захист даних та автентифікація. Вбудована підтримка CORS та CSP заголовків.
</p>
<button
class="mt-4 w-full py-2 bg-indigo-600 hover:bg-indigo-700 text-white text-xs font-semibold rounded-xl transition-colors"
>
Дізнатись →
</button>
</div>
</div>
<p class="text-center text-xs text-slate-400 mt-4">
Без <code class="bg-slate-200 px-1 rounded">flex flex-col + grow</code> — кнопки «плавають» залежно від
тексту
</p>
</body>
</html>
flex flex-col на картці + grow на секції контенту — класичне рішення «sticky footer всередині картки». Альтернатива: mt-auto на кнопці замість grow на тексті.
🧪 Практика: Flexbox-патерни
Реалізуйте три Flexbox-патерни: (1) Breadcrumb — горизонтальний список посилань із роздільником · між ними через before:content-['·'] before:text-slate-400 або просто між <li>, flex items-center gap-2, активний елемент text-slate-900 font-medium, інші — text-slate-500 hover:text-slate-700; (2) Inline form — input та кнопка в flex flex-row gap-0, input має rounded-r-none, кнопка — rounded-l-none shrink-0; (3) Toast notification — flex items-start gap-3, іконка shrink-0 mt-0.5, текстовий блок flex-1, кнопка закрити shrink-0 self-start.
CSS Grid у Tailwind: двовимірний layout
CSS Grid вирішує задачу двовимірного розміщення: колонки та рядки одночасно. Якщо Flexbox — це «один вимір», то Grid — це «таблиця», де ви повністю контролюєте розміщення елементів у просторі.
Активація та базова структура
<!-- display: grid — займає повну ширину -->
<div class="grid">
<div>Item 1</div>
<div>Item 2</div>
</div>
<!-- display: inline-grid — за шириною вмісту -->
<div class="inline-grid grid-cols-2 gap-2">...</div>
Колонки: grid-cols-{n}
grid-cols-{n} задає grid-template-columns: repeat(n, minmax(0, 1fr)) — рівномірний розподіл:
<div class="grid grid-cols-1 gap-4"><!-- 1 колонка (mobile default) --></div>
<div class="grid grid-cols-2 gap-4"><!-- 2 рівних колонки --></div>
<div class="grid grid-cols-3 gap-4"><!-- 3 рівних колонки --></div>
<div class="grid grid-cols-4 gap-4"><!-- 4 рівних колонки --></div>
<div class="grid grid-cols-12 gap-4"><!-- 12-колонна сітка (класика) --></div>
<!-- Адаптивна сітка: mobile-first -->
<div class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-6">
<!-- 1 колонка → 2 → 4 залежно від ширини екрана -->
</div>
<!DOCTYPE html>
<html lang="uk">
<head>
<meta charset="UTF-8" />
<script src="https://cdn.tailwindcss.com"></script>
<link
href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap"
rel="stylesheet"
/>
</head>
<body class="p-6 bg-slate-50 flex flex-col gap-6" style="font-family: 'Inter', system-ui, sans-serif;">
<!-- grid-cols-3 -->
<div>
<p class="text-xs font-semibold text-slate-400 uppercase tracking-wider mb-2">
grid-cols-3 (3 рівні колонки)
</p>
<div
class="grid grid-cols-3 gap-4 bg-white p-4 rounded-xl border border-slate-200 shadow-sm text-center text-xs font-semibold text-white"
>
<div class="bg-indigo-600 p-3 rounded-lg">Колонка 1</div>
<div class="bg-indigo-600 p-3 rounded-lg">Колонка 2</div>
<div class="bg-indigo-600 p-3 rounded-lg">Колонка 3</div>
</div>
</div>
<!-- Адаптивна сітка: mobile-first -->
<div>
<p class="text-xs font-semibold text-slate-400 uppercase tracking-wider mb-2">
Адаптивна сітка (1 колонка на мобільних, 2 на планшетах, 4 на десктопах)
</p>
<div
class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-4 bg-white p-4 rounded-xl border border-slate-200 shadow-sm text-center text-xs font-semibold text-white"
>
<div class="bg-emerald-600 p-3 rounded-lg">Елемент 1</div>
<div class="bg-emerald-600 p-3 rounded-lg">Елемент 2</div>
<div class="bg-emerald-600 p-3 rounded-lg">Елемент 3</div>
<div class="bg-emerald-600 p-3 rounded-lg">Елемент 4</div>
</div>
</div>
</body>
</html>
Span — розтягнення елементів
col-span-{n} та row-span-{n} дозволяють елементу займати кілька клітинок:
<!-- Колонки -->
<div class="grid grid-cols-4 gap-4">
<div class="col-span-2">Займає 2 колонки з 4</div>
<div class="col-span-1">1 колонка</div>
<div class="col-span-1">1 колонка</div>
<div class="col-span-full">Займає всю ширину сітки</div>
</div>
<!-- Рядки -->
<div class="grid grid-cols-3 grid-rows-3 gap-4">
<div class="row-span-2 col-span-2">Велика карта 2×2</div>
<div class="row-span-2">Висока карта 1×2</div>
<div>Маленька 1×1</div>
<div>Маленька 1×1</div>
</div>
<!DOCTYPE html>
<html lang="uk">
<head>
<meta charset="UTF-8" />
<script src="https://cdn.tailwindcss.com"></script>
<link
href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap"
rel="stylesheet"
/>
</head>
<body class="p-6 bg-slate-50 flex flex-col gap-6" style="font-family: 'Inter', system-ui, sans-serif;">
<!-- col-span -->
<div>
<p class="text-xs font-semibold text-slate-400 uppercase tracking-wider mb-2">
col-span (розтягнення по колонках)
</p>
<div
class="grid grid-cols-4 gap-3 bg-white p-4 rounded-xl border border-slate-200 shadow-sm text-center text-xs font-semibold text-white"
>
<div class="col-span-2 bg-indigo-600 p-3 rounded-lg">col-span-2 (Займає 2 з 4)</div>
<div class="bg-indigo-400 p-3 rounded-lg">1 кол</div>
<div class="bg-indigo-400 p-3 rounded-lg">1 кол</div>
<div class="col-span-full bg-indigo-800 p-3 rounded-lg">col-span-full (Займає всю ширину)</div>
</div>
</div>
<!-- row-span -->
<div>
<p class="text-xs font-semibold text-slate-400 uppercase tracking-wider mb-2">
row-span та col-span (2D розміщення)
</p>
<div
class="grid grid-cols-3 grid-rows-3 gap-3 bg-white p-4 rounded-xl border border-slate-200 shadow-sm text-center text-xs font-semibold text-white h-64"
>
<div class="row-span-2 col-span-2 bg-emerald-600 rounded-lg flex items-center justify-center">
Велика карта 2×2
</div>
<div class="row-span-2 bg-emerald-500 rounded-lg flex items-center justify-center">
Висока карта 1×2
</div>
<div class="bg-slate-400 rounded-lg flex items-center justify-center">Маленька 1×1</div>
<div class="bg-slate-400 rounded-lg flex items-center justify-center">Маленька 1×1</div>
</div>
</div>
</body>
</html>
Явне позиціонування: col-start, col-end
<!-- Поставити конкретний елемент у конкретну позицію -->
<div class="grid grid-cols-6 gap-4">
<div class="col-start-2 col-span-3">
<!-- Починається з 2-ї колонки, займає 3 колонки (2,3,4) -->
</div>
<div class="col-start-5 col-end-7">
<!-- Від 5-ї до 7-ї лінії (5,6 колонки) -->
</div>
</div>
<!-- Рядки -->
<div class="grid grid-rows-4">
<div class="row-start-2 row-span-2">
<!-- Починається з 2-го рядка, займає 2 рядки -->
</div>
</div>
<!DOCTYPE html>
<html lang="uk">
<head>
<meta charset="UTF-8" />
<script src="https://cdn.tailwindcss.com"></script>
<link
href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap"
rel="stylesheet"
/>
</head>
<body class="p-6 bg-slate-50 flex flex-col gap-6" style="font-family: 'Inter', system-ui, sans-serif;">
<!-- col-start / col-end -->
<div>
<p class="text-xs font-semibold text-slate-400 uppercase tracking-wider mb-2">
col-start & col-end позиціонування
</p>
<div
class="grid grid-cols-6 gap-3 bg-white p-4 rounded-xl border border-slate-200 shadow-sm text-center text-xs font-semibold text-white"
>
<div class="col-start-2 col-span-3 bg-indigo-600 p-3 rounded-lg">
Починається з 2-ї, займає 3 (колонки 2,3,4)
</div>
<div class="col-start-5 col-end-7 bg-emerald-600 p-3 rounded-lg">
Від 5-ї до 7-ї лінії (колонки 5,6)
</div>
</div>
</div>
<!-- row-start / row-span -->
<div>
<p class="text-xs font-semibold text-slate-400 uppercase tracking-wider mb-2">
row-start & row-span позиціонування
</p>
<div
class="grid grid-rows-4 gap-3 bg-white p-4 rounded-xl border border-slate-200 shadow-sm text-center text-xs font-semibold text-white h-48"
>
<div class="bg-slate-300 rounded-lg p-2 text-slate-700">Рядок 1 (авто)</div>
<div class="row-start-2 row-span-2 bg-indigo-600 rounded-lg flex items-center justify-center">
Починається з 2-го рядка, займає 2 рядки
</div>
<div class="bg-slate-300 rounded-lg p-2 text-slate-700">Рядок 4 (авто)</div>
</div>
</div>
</body>
</html>
Auto-fit та auto-fill через довільні значення
Для справді адаптивних сіток, де кількість колонок визначається доступним простором — repeat(auto-fill, ...):
<!-- Мінімум 200px на колонку — стільки колонок, скільки влізе -->
<div class="grid grid-cols-[repeat(auto-fill,minmax(200px,1fr))] gap-4">
<!-- При 640px: 3 колонки. При 320px: 1 колонка. Автоматично! -->
</div>
<!-- auto-fit: приховані порожні колонки (замість auto-fill) -->
<div class="grid grid-cols-[repeat(auto-fit,minmax(250px,1fr))] gap-6">
<!-- auto-fit: колонки стискаються до нуля якщо порожні -->
</div>
<!DOCTYPE html>
<html lang="uk">
<head>
<meta charset="UTF-8" />
<script src="https://cdn.tailwindcss.com"></script>
<link
href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap"
rel="stylesheet"
/>
</head>
<body class="p-6 bg-slate-50 flex flex-col gap-6" style="font-family: 'Inter', system-ui, sans-serif;">
<!-- auto-fill -->
<div>
<p class="text-xs font-semibold text-slate-400 uppercase tracking-wider mb-2">
auto-fill (заповнює сітку порожніми треками, якщо елементів мало)
</p>
<div
class="grid grid-cols-[repeat(auto-fill,minmax(100px,1fr))] gap-3 bg-white p-4 rounded-xl border border-slate-200 shadow-sm text-center text-xs font-semibold text-white"
>
<div class="bg-indigo-600 p-3 rounded-lg">A</div>
<div class="bg-indigo-600 p-3 rounded-lg">B</div>
</div>
</div>
<!-- auto-fit -->
<div>
<p class="text-xs font-semibold text-slate-400 uppercase tracking-wider mb-2">
auto-fit (розтягує наявні елементи на всю ширину)
</p>
<div
class="grid grid-cols-[repeat(auto-fit,minmax(100px,1fr))] gap-3 bg-white p-4 rounded-xl border border-slate-200 shadow-sm text-center text-xs font-semibold text-white"
>
<div class="bg-emerald-600 p-3 rounded-lg">A</div>
<div class="bg-emerald-600 p-3 rounded-lg">B</div>
</div>
</div>
</body>
</html>
Рядки: grid-rows-{n} та auto-rows
<!-- Фіксована кількість рядків -->
<div class="grid grid-rows-3 grid-flow-col gap-4">
<!-- 3 рядки, items заповнюються по колонках -->
</div>
<!-- auto-rows: висота кожного рядка -->
<div class="grid grid-cols-3 auto-rows-fr gap-4">
<!-- fr: рівна частка доступної висоти -->
</div>
<div class="grid grid-cols-3 auto-rows-min gap-4">
<!-- min: мінімальна висота за вмістом -->
</div>
<!-- Явна висота рядка через довільне значення -->
<div class="grid grid-cols-3 auto-rows-[180px] gap-4">
<!-- Кожен рядок = 180px -->
</div>
<!DOCTYPE html>
<html lang="uk">
<head>
<meta charset="UTF-8" />
<script src="https://cdn.tailwindcss.com"></script>
<link
href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap"
rel="stylesheet"
/>
</head>
<body class="p-6 bg-slate-50 flex flex-col gap-6" style="font-family: 'Inter', system-ui, sans-serif;">
<!-- grid-flow-col -->
<div>
<p class="text-xs font-semibold text-slate-400 uppercase tracking-wider mb-2">
grid-rows-3 + grid-flow-col (заповнення по колонках зверху вниз)
</p>
<div
class="grid grid-rows-3 grid-flow-col gap-3 bg-white p-4 rounded-xl border border-slate-200 shadow-sm text-center text-xs font-semibold text-white h-36"
>
<div class="bg-indigo-600 p-2 rounded-lg flex items-center justify-center">1</div>
<div class="bg-indigo-600 p-2 rounded-lg flex items-center justify-center">2</div>
<div class="bg-indigo-600 p-2 rounded-lg flex items-center justify-center">3</div>
<div class="bg-emerald-600 p-2 rounded-lg flex items-center justify-center">4</div>
<div class="bg-emerald-600 p-2 rounded-lg flex items-center justify-center">5</div>
</div>
</div>
<!-- auto-rows-fr -->
<div>
<p class="text-xs font-semibold text-slate-400 uppercase tracking-wider mb-2">
auto-rows-fr (кожен рядок однакової висоти)
</p>
<div
class="grid grid-cols-2 auto-rows-fr gap-3 bg-white p-4 rounded-xl border border-slate-200 shadow-sm text-center text-xs font-semibold text-white h-48"
>
<div class="bg-indigo-600 p-3 rounded-lg flex items-center justify-center">
Елемент 1 з коротким вмістом
</div>
<div class="bg-indigo-600 p-3 rounded-lg flex items-center justify-center">
Елемент 2 з дуже довгим описом, який змушує цей рядок рости по висоті.
</div>
<div class="bg-slate-400 p-3 rounded-lg flex items-center justify-center">Елемент 3 (fr висота)</div>
<div class="bg-slate-400 p-3 rounded-lg flex items-center justify-center">Елемент 4 (fr висота)</div>
</div>
</div>
</body>
</html>
CSS Subgrid у Tailwind v4
Subgrid дозволяє вкладеному Grid-елементу успадковувати треки батьківської сітки. Це вирішує класичну проблему: вирівнювання внутрішніх елементів між різними картками:
<!-- Без subgrid: заголовки, контент, кнопки "плавають" по висоті -->
<div class="grid grid-cols-3 gap-4">
<div class="flex flex-col bg-white rounded-xl p-5">
<h3>Короткий заголовок</h3>
<p class="grow text-sm mt-2">Довгий опис...</p>
<button class="mt-4">Дія</button>
</div>
<!-- При різному тексті — кнопки на різному рівні -->
</div>
<!-- З subgrid v4: grid-cols-subgrid → успадкування колонок -->
<div class="grid grid-cols-3 gap-4">
<!-- Кожна картка успадковує рядки батька -->
<div class="grid row-span-3 [grid-template-rows:subgrid] bg-white rounded-xl p-5 gap-2">
<h3>Будь-який заголовок</h3>
<p class="text-sm">Будь-яка довжина тексту</p>
<button>Кнопка завжди на одному рівні!</button>
</div>
</div>
<!-- Tailwind v4: grid-cols-subgrid та grid-rows-subgrid як утиліти -->
<div class="grid grid-cols-3">
<div class="grid grid-cols-subgrid col-span-3">
<!-- Успадковує 3 колонки батька -->
<div>1</div>
<div>2</div>
<div>3</div>
</div>
</div>
<!DOCTYPE html>
<html lang="uk">
<head>
<meta charset="UTF-8" />
<script src="https://cdn.tailwindcss.com"></script>
<link
href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap"
rel="stylesheet"
/>
</head>
<body class="p-6 bg-slate-50 flex flex-col gap-8" style="font-family: 'Inter', system-ui, sans-serif;">
<!-- Без subgrid -->
<div>
<p class="text-xs font-semibold text-slate-400 uppercase tracking-wider mb-2">
Без subgrid (кнопки та тексти на різному рівні)
</p>
<div class="grid grid-cols-3 gap-4 bg-white p-4 rounded-xl border border-slate-200 shadow-sm">
<div class="flex flex-col bg-slate-100 p-4 rounded-lg">
<h3 class="font-bold text-slate-900 text-sm">Короткий заголовок</h3>
<p class="grow text-xs text-slate-500 mt-1 leading-relaxed">Опис.</p>
<button class="mt-4 px-3 py-1.5 bg-indigo-600 text-white rounded text-xs font-semibold">Дія</button>
</div>
<div class="flex flex-col bg-slate-100 p-4 rounded-lg">
<h3 class="font-bold text-slate-900 text-sm">Довший заголовок картки</h3>
<p class="grow text-xs text-slate-500 mt-1 leading-relaxed">
Цей опис трохи довший за інші, щоб показати проблему вирівнювання.
</p>
<button class="mt-4 px-3 py-1.5 bg-indigo-600 text-white rounded text-xs font-semibold">Дія</button>
</div>
<div class="flex flex-col bg-slate-100 p-4 rounded-lg">
<h3 class="font-bold text-slate-900 text-sm">Картка 3</h3>
<p class="grow text-xs text-slate-500 mt-1 leading-relaxed">Опис 3.</p>
<button class="mt-4 px-3 py-1.5 bg-indigo-600 text-white rounded text-xs font-semibold">Дія</button>
</div>
</div>
</div>
<!-- З subgrid -->
<div>
<p class="text-xs font-semibold text-slate-400 uppercase tracking-wider mb-2">
З subgrid (елементи карток вирівняні по спільній сітці батька)
</p>
<!-- Батьківська сітка має 3 колонки та 3 рядки для вмісту карток -->
<div
class="grid grid-cols-3 grid-rows-[auto_1fr_auto] gap-4 bg-white p-4 rounded-xl border border-slate-200 shadow-sm"
>
<!-- Картка 1 -->
<div class="grid grid-rows-subgrid row-span-3 bg-slate-100 p-4 rounded-lg gap-2">
<h3 class="font-bold text-slate-900 text-sm">Короткий заголовок</h3>
<p class="text-xs text-slate-500 leading-relaxed">Опис.</p>
<button class="px-3 py-1.5 bg-indigo-600 text-white rounded text-xs font-semibold">Дія</button>
</div>
<!-- Картка 2 -->
<div class="grid grid-rows-subgrid row-span-3 bg-slate-100 p-4 rounded-lg gap-2">
<h3 class="font-bold text-slate-900 text-sm">Довший заголовок картки</h3>
<p class="text-xs text-slate-500 leading-relaxed">
Цей опис трохи довший за інші, щоб показати проблему вирівнювання.
</p>
<button class="px-3 py-1.5 bg-indigo-600 text-white rounded text-xs font-semibold">Дія</button>
</div>
<!-- Картка 3 -->
<div class="grid grid-rows-subgrid row-span-3 bg-slate-100 p-4 rounded-lg gap-2">
<h3 class="font-bold text-slate-900 text-sm">Картка 3</h3>
<p class="text-xs text-slate-500 leading-relaxed">Опис 3.</p>
<button class="px-3 py-1.5 bg-indigo-600 text-white rounded text-xs font-semibold">Дія</button>
</div>
</div>
</div>
</body>
</html>
🧪 Практика: Grid span та позиціонування
Реалізуйте Bento Grid — популярний layout для features-секцій. Сітка grid-cols-4 auto-rows-[160px] gap-4. Елементи: (1) велика картка col-span-2 row-span-2 з градієнтом і заголовком внизу через flex flex-col justify-end; (2) три маленькі 1×1 картки; (3) широка картка col-span-3 row-span-1 з горизонтальним розміщенням іконки та тексту. Усі картки — rounded-2xl із hover-ефектом.
Типові Grid-патерни
Патерн 1: Card Grid з адаптивністю
<!DOCTYPE html>
<html lang="uk">
<head>
<meta charset="UTF-8" />
<script src="https://cdn.tailwindcss.com"></script>
<link
href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap"
rel="stylesheet"
/>
</head>
<body class="p-6 bg-slate-50" style="font-family: 'Inter', system-ui, sans-serif;">
<p class="text-xs font-bold text-slate-400 uppercase tracking-widest mb-5 text-center">
grid-cols-1 → sm:grid-cols-2 → lg:grid-cols-3 + featured col-span-full
</p>
<div class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-4">
<!-- Звичайна картка -->
<div
class="bg-white rounded-2xl p-5 border border-slate-200 hover:shadow-lg hover:-translate-y-1 transition-all flex flex-col"
>
<div class="text-2xl mb-3">🎨</div>
<h3 class="font-bold text-slate-800">Дизайн</h3>
<p class="text-sm text-slate-500 mt-2 leading-relaxed grow">
Компоненти та дизайн-системи для сучасного UI.
</p>
<a
href="#"
class="inline-flex items-center gap-1 text-indigo-600 text-sm font-semibold mt-4 hover:gap-2 transition-all"
>Детальніше →</a
>
</div>
<div
class="bg-white rounded-2xl p-5 border border-slate-200 hover:shadow-lg hover:-translate-y-1 transition-all flex flex-col"
>
<div class="text-2xl mb-3">⚡</div>
<h3 class="font-bold text-slate-800">Продуктивність</h3>
<p class="text-sm text-slate-500 mt-2 leading-relaxed grow">
Оптимізація та швидкість веб-застосунків.
</p>
<a
href="#"
class="inline-flex items-center gap-1 text-indigo-600 text-sm font-semibold mt-4 hover:gap-2 transition-all"
>Детальніше →</a
>
</div>
<div
class="bg-white rounded-2xl p-5 border border-slate-200 hover:shadow-lg hover:-translate-y-1 transition-all flex flex-col"
>
<div class="text-2xl mb-3">🔒</div>
<h3 class="font-bold text-slate-800">Безпека</h3>
<p class="text-sm text-slate-500 mt-2 leading-relaxed grow">Захист даних та автентифікація.</p>
<a
href="#"
class="inline-flex items-center gap-1 text-indigo-600 text-sm font-semibold mt-4 hover:gap-2 transition-all"
>Детальніше →</a
>
</div>
<div
class="bg-white rounded-2xl p-5 border border-slate-200 hover:shadow-lg hover:-translate-y-1 transition-all flex flex-col"
>
<div class="text-2xl mb-3">📊</div>
<h3 class="font-bold text-slate-800">Аналітика</h3>
<p class="text-sm text-slate-500 mt-2 leading-relaxed grow">Метрики та звітність у реальному часі.</p>
<a
href="#"
class="inline-flex items-center gap-1 text-indigo-600 text-sm font-semibold mt-4 hover:gap-2 transition-all"
>Детальніше →</a
>
</div>
<!-- Featured: col-span-full або sm:col-span-2 -->
<div
class="sm:col-span-2 lg:col-span-2 bg-gradient-to-br from-indigo-600 to-violet-700 rounded-2xl p-6 text-white hover:shadow-xl hover:-translate-y-1 transition-all flex flex-col"
>
<div class="text-2xl mb-3">🚀</div>
<h3 class="font-bold text-xl">Featured: Tailwind CSS v4</h3>
<p class="text-indigo-200 text-sm mt-2 leading-relaxed grow">
CSS-first конфігурація, OKLCH кольори та Lightning CSS engine. Менше конфігурації, більше
можливостей.
</p>
<a
href="#"
class="inline-flex items-center gap-1 text-white text-sm font-semibold mt-4 underline underline-offset-4 hover:gap-2 transition-all"
>Дізнатись більше →</a
>
</div>
</div>
</body>
</html>
Патерн 2: Holy Grail Layout (Header + Sidebar + Main + Footer)
Класичний «Holy Grail» — три секції по вертикалі (header, middle, footer) та дві по горизонталі (sidebar, main) у middle. Рішення — вкладені Grid:
<!DOCTYPE html>
<html lang="uk">
<head>
<meta charset="UTF-8" />
<script src="https://cdn.tailwindcss.com"></script>
<link
href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap"
rel="stylesheet"
/>
</head>
<body style="font-family: 'Inter', system-ui, sans-serif;">
<div
class="min-h-[450px] grid grid-rows-[auto_1fr_auto] rounded-2xl overflow-hidden border border-slate-200 shadow-lg"
>
<!-- Header: повна ширина, auto висота -->
<header class="bg-indigo-700 text-white px-6 py-4 flex items-center justify-between">
<span class="font-bold text-lg">🌐 My App</span>
<nav class="flex gap-6 text-sm">
<a href="#" class="hover:text-indigo-200 transition-colors">Головна</a>
<a href="#" class="hover:text-indigo-200 transition-colors">Про нас</a>
<a href="#" class="hover:text-indigo-200 transition-colors">Контакти</a>
</nav>
</header>
<!-- Middle: sidebar + main → 1fr висота (розтягується) -->
<div class="grid grid-cols-[220px_1fr] bg-slate-50">
<!-- Sidebar: фіксована ширина 220px -->
<aside class="bg-white border-r border-slate-200 p-4">
<p class="text-xs font-bold text-slate-400 uppercase tracking-widest mb-3">Навігація</p>
<nav class="flex flex-col gap-1">
<a
href="#"
class="flex items-center gap-2 px-3 py-2 text-sm font-medium text-indigo-600 bg-indigo-50 rounded-lg"
>📊 Дашборд</a
>
<a
href="#"
class="flex items-center gap-2 px-3 py-2 text-sm font-medium text-slate-600 hover:bg-slate-100 rounded-lg transition-colors"
>👥 Користувачі</a
>
<a
href="#"
class="flex items-center gap-2 px-3 py-2 text-sm font-medium text-slate-600 hover:bg-slate-100 rounded-lg transition-colors"
>📁 Проєкти</a
>
<a
href="#"
class="flex items-center gap-2 px-3 py-2 text-sm font-medium text-slate-600 hover:bg-slate-100 rounded-lg transition-colors"
>⚙️ Налаштування</a
>
</nav>
</aside>
<!-- Main: 1fr → займає залишок -->
<main class="p-6">
<h1 class="text-xl font-bold text-slate-900 mb-4">Дашборд</h1>
<div class="grid grid-cols-3 gap-4 mb-6">
<div class="bg-white rounded-xl p-4 border border-slate-200 text-center shadow-sm">
<p class="text-2xl font-black text-indigo-600">1,247</p>
<p class="text-xs text-slate-500 mt-1 font-medium">Користувачів</p>
</div>
<div class="bg-white rounded-xl p-4 border border-slate-200 text-center shadow-sm">
<p class="text-2xl font-black text-emerald-600">$24.5k</p>
<p class="text-xs text-slate-500 mt-1 font-medium">Дохід</p>
</div>
<div class="bg-white rounded-xl p-4 border border-slate-200 text-center shadow-sm">
<p class="text-2xl font-black text-amber-600">98.2%</p>
<p class="text-xs text-slate-500 mt-1 font-medium">Uptime</p>
</div>
</div>
<div
class="bg-white rounded-xl border border-slate-200 p-4 h-24 flex items-center justify-center text-slate-400 text-sm"
>
Область для графіків або контенту
</div>
</main>
</div>
<!-- Footer: повна ширина, auto висота -->
<footer
class="bg-white border-t border-slate-200 px-6 py-3 flex items-center justify-between text-xs text-slate-400"
>
<span>© 2025 My App</span>
<span>Зроблено з ❤️ на Tailwind CSS</span>
</footer>
</div>
</body>
</html>
Ключ до Holy Grail: вкладені Grid. Зовнішній — grid-rows-[auto_1fr_auto] (header rosте не, middle розтягується до залишку висоти, footer не росте). Внутрішній — grid-cols-[220px_1fr] (фіксований sidebar + гнучкий main).
Патерн 3: Bento Grid — Feature Section
<!DOCTYPE html>
<html lang="uk">
<head>
<meta charset="UTF-8" />
<script src="https://cdn.tailwindcss.com"></script>
<link
href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap"
rel="stylesheet"
/>
</head>
<body class="p-6 bg-white" style="font-family: 'Inter', system-ui, sans-serif;">
<p class="text-xs font-bold text-slate-400 uppercase tracking-widest mb-5 text-center">
Bento Grid: col-span + row-span
</p>
<div class="grid grid-cols-3 gap-4 auto-rows-[160px]">
<!-- Featured: 2 колонки × 2 рядки -->
<div
class="col-span-2 row-span-2 bg-gradient-to-br from-indigo-600 to-violet-700 rounded-2xl p-7 flex flex-col justify-end text-white hover:shadow-xl transition-shadow"
>
<span class="text-xs font-bold uppercase tracking-widest text-indigo-300 mb-2">Featured</span>
<h2 class="text-2xl font-black leading-tight">Tailwind CSS v4.0</h2>
<p class="text-indigo-200 text-sm mt-2 leading-relaxed">
CSS-first конфігурація. OKLCH кольори. Lightning CSS engine.
</p>
<a
href="#"
class="inline-flex items-center gap-1 text-white text-sm font-semibold mt-4 underline underline-offset-4 hover:gap-2 transition-all"
>Дізнатись →</a
>
</div>
<!-- Маленька 1 -->
<div
class="bg-slate-100 rounded-2xl p-5 flex flex-col justify-between hover:bg-slate-200 transition-colors"
>
<span class="text-2xl">⚡</span>
<div>
<h3 class="font-bold text-slate-800 text-sm">Lightning CSS</h3>
<p class="text-xs text-slate-500 mt-1">10× швидша збірка</p>
</div>
</div>
<!-- Маленька 2 -->
<div
class="bg-amber-50 border border-amber-100 rounded-2xl p-5 flex flex-col justify-between hover:shadow-md transition-shadow"
>
<span class="text-2xl">🎨</span>
<div>
<h3 class="font-bold text-amber-800 text-sm">OKLCH кольори</h3>
<p class="text-xs text-amber-600 mt-1">Перцептивна рівномірність</p>
</div>
</div>
<!-- Широка горизонтальна -->
<div class="col-span-3 bg-emerald-50 border border-emerald-100 rounded-2xl p-5 flex items-center gap-5">
<div class="w-12 h-12 bg-emerald-200 rounded-2xl flex items-center justify-center text-2xl shrink-0">
🔧
</div>
<div class="flex-1">
<h3 class="font-bold text-emerald-900">CSS-first конфігурація</h3>
<p class="text-sm text-emerald-700 mt-1">
Замість JavaScript-конфігу — директива
<code class="bg-emerald-200 px-1 rounded text-xs">@theme</code> у CSS. Дизайн-токени живуть у
CSS Custom Properties.
</p>
</div>
<a
href="#"
class="text-emerald-700 text-sm font-semibold hover:text-emerald-800 transition-colors shrink-0"
>Приклад →</a
>
</div>
</div>
</body>
</html>
🧪 Практика: Holy Grail з адаптивністю
Реалізуйте повноцінний Holy Grail Layout: (1) sticky header — sticky top-0 z-10 flex justify-between items-center px-6 py-4 bg-white border-b shadow-sm; (2) sidebar w-64 hidden lg:flex flex-col gap-1 p-4 bg-white border-r; (3) main flex-1 p-6 min-w-0 overflow-y-auto; (4) footer border-t px-6 py-4 flex justify-between text-sm text-slate-400. На мобільному sidebar прихований (hidden lg:flex), на desktop — видимий. Весь layout через flex flex-col h-screen на <body> та flex flex-1 overflow-hidden для middle секції.
Адаптивний Layout: breakpoint-варіанти
Tailwind будує адаптивність за принципом mobile-first: клас без префіксу діє на всіх розмірах, а prefix перевизначає від вказаного breakpoint і більше:
| Варіант | min-width | Типовий пристрій |
|---|---|---|
| (базовий) | 0px | Мобільний |
sm: | 640px | Великий мобільний / малий планшет |
md: | 768px | Планшет |
lg: | 1024px | Ноутбук |
xl: | 1280px | Desktop |
2xl: | 1536px | Великий монітор |
<!-- Mobile-first підхід -->
<div
class="
grid grid-cols-1 /* Mobile: 1 колонка */
sm:grid-cols-2 /* Tablet: 2 колонки */
lg:grid-cols-4 /* Desktop: 4 колонки */
gap-4
"
>
<!-- Flex-напрямок за breakpoint -->
<div
class="
flex flex-col /* Mobile: вертикально */
md:flex-row /* Tablet+: горизонтально */
gap-4
"
>
<!-- Показ/приховання -->
<aside class="hidden lg:block w-64"><!-- Sidebar: тільки desktop --></aside>
<button class="block lg:hidden"><!-- Hamburger: тільки mobile --></button>
<!-- Ширина кнопки -->
<button
class="
w-full /* Mobile: на всю ширину */
sm:w-auto /* Tablet+: по вмісту */
px-6 py-2 bg-indigo-600 text-white rounded-lg
"
></button>
</div>
</div>
Tailwind v4: max-* breakpoint-варіанти
Tailwind v4 додав верхні обмеження breakpoint — тепер можна таргетувати конкретний діапазон:
<!-- Тільки на мобільному (до sm) -->
<p class="max-sm:text-center">Центрований тільки на мобільному</p>
<!-- Тільки між md та lg -->
<div class="md:max-lg:flex-col">Колонка тільки на tablet</div>
<!-- Тільки на мобільному: max-md (до md) -->
<nav class="max-md:hidden">Приховано на мобільному</nav>
/* Таблиця max-* breakpoint */
/* max-sm → @media (max-width: 639px) */
/* max-md → @media (max-width: 767px) */
/* max-lg → @media (max-width: 1023px) */
/* max-xl → @media (max-width: 1279px) */
/* max-2xl → @media (max-width: 1535px) */
🧪 Практика: адаптивний pricing table
Реалізуйте таблицю тарифів із трьома планами (Starter, Pro, Enterprise). На мобільному — flex flex-col gap-4, на md: — grid grid-cols-3 gap-6. Середній тариф (Pro) — виділений: border-2 border-indigo-500 shadow-xl scale-105, badge «Найпопулярніший» через absolute -top-4 left-1/2 -translate-x-1/2. Кожен тариф — flex flex-col, список переваг через divide-y divide-slate-100, кнопка — mt-auto.
Position та Z-Index у Tailwind
Абсолютне позиціонування в relative контейнері
Найпоширеніший патерн: елемент з absolute позиціонуванням прив'язується до relative предка:
<!-- relative = точка відліку для всіх absolute дочірніх -->
<div class="relative">
<!-- Кутовий badge -->
<span class="absolute top-2 right-2 px-2 py-0.5 bg-red-500 text-white text-xs rounded-full"> New </span>
<!-- Hover overlay через inset-0 (= top+right+bottom+left = 0) -->
<div
class="absolute inset-0 bg-black/50 rounded-xl
flex items-center justify-center text-white
opacity-0 hover:opacity-100 transition-opacity"
>
Переглянути
</div>
<!-- Контент картки -->
<img src="..." class="w-full h-48 object-cover rounded-xl" />
</div>
<!DOCTYPE html>
<html lang="uk">
<head>
<meta charset="UTF-8" />
<script src="https://cdn.tailwindcss.com"></script>
<link
href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap"
rel="stylesheet"
/>
</head>
<body
class="p-6 bg-slate-50 flex flex-col items-center justify-center min-h-[300px]"
style="font-family: 'Inter', system-ui, sans-serif;"
>
<div class="relative w-64 h-48 rounded-xl overflow-hidden shadow-lg group cursor-pointer">
<!-- Badge -->
<span
class="absolute top-3 right-3 z-10 px-2.5 py-1 bg-red-500 text-white text-[10px] font-bold uppercase tracking-wider rounded-full shadow-sm"
>
New
</span>
<!-- Hover overlay (inset-0) -->
<div
class="absolute inset-0 bg-indigo-900/60 flex items-center justify-center text-white font-semibold text-sm opacity-0 group-hover:opacity-100 transition-opacity duration-300 z-20"
>
Переглянути
</div>
<!-- Gradient simulating card image/content -->
<div
class="w-full h-full bg-gradient-to-tr from-indigo-600 via-indigo-700 to-violet-800 flex items-center justify-center p-6 text-white text-center"
>
<div class="space-y-1">
<h4 class="font-bold text-base leading-tight">Tailwind Position</h4>
<p class="text-[11px] text-indigo-200">Абсолютне позиціонування</p>
</div>
</div>
</div>
</body>
</html>
Корисні inset-* комбінації:
<div class="absolute inset-0">
<!-- top + right + bottom + left = 0 (повне накриття) -->
<div class="absolute inset-x-0 top-0">
<!-- ширина 100%, прикріплена до верху -->
<div class="absolute inset-x-0 bottom-0"><!-- ширина 100%, прикріплена до низу --></div>
</div>
</div>
Sticky елементи
<!-- Sticky navbar: залишається вгорі при scroll -->
<nav class="sticky top-0 z-50 bg-white border-b border-slate-200 shadow-sm">
<!-- z-50: поверх усього вмісту -->
</nav>
<!-- Sticky sidebar в межах батька -->
<aside class="sticky top-24 h-fit">
<!-- top-24 = 6rem = відступ нижче navbar (60px + padding) -->
<!-- h-fit = висота за вмістом, не розтягується -->
</aside>
<!DOCTYPE html>
<html lang="uk">
<head>
<meta charset="UTF-8" />
<script src="https://cdn.tailwindcss.com"></script>
<link
href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap"
rel="stylesheet"
/>
</head>
<body
class="p-6 bg-slate-100 flex items-center justify-center"
style="font-family: 'Inter', system-ui, sans-serif;"
>
<!-- Скрол-бокс для демонстрації sticky -->
<div
class="w-full max-w-md h-80 overflow-y-auto border border-slate-200 bg-white rounded-2xl shadow-md relative"
>
<!-- Sticky Navbar -->
<nav
class="sticky top-0 z-50 bg-white/95 backdrop-blur px-4 py-3 border-b border-slate-100 flex items-center justify-between shadow-sm"
>
<span class="font-bold text-slate-800 text-sm">sticky top-0</span>
<span class="text-xs text-indigo-600 font-semibold">Навігація</span>
</nav>
<div class="p-4 space-y-4">
<p class="text-xs text-slate-400">Скрольте вниз, щоб побачити поведінку sticky-елементів.</p>
<div
class="h-24 bg-slate-50 border border-dashed border-slate-200 rounded-xl flex items-center justify-center text-xs text-slate-400"
>
Контент блоку 1
</div>
<!-- Sticky Sidebar (or widget) -->
<div
class="sticky top-14 bg-indigo-50 border border-indigo-100 p-3 rounded-xl flex items-center justify-between text-xs font-semibold text-indigo-700"
>
<span>sticky top-14 (прикріплений віджет)</span>
<span>📌</span>
</div>
<div
class="h-48 bg-slate-50 border border-dashed border-slate-200 rounded-xl flex items-center justify-center text-xs text-slate-400"
>
Контент блоку 2 (великий опис)
</div>
<div
class="h-48 bg-slate-50 border border-dashed border-slate-200 rounded-xl flex items-center justify-center text-xs text-slate-400"
>
Контент блоку 3 (завершальний блок)
</div>
</div>
</div>
</body>
</html>
Z-Index шкала
<div class="z-0">/* z-index: 0 — базовий рівень */</div>
<div class="z-10">/* z-index: 10 — трохи вище */</div>
<div class="z-20">/* z-index: 20 */</div>
<div class="z-30">/* z-index: 30 */</div>
<div class="z-40">/* z-index: 40 */</div>
<div class="z-50">/* z-index: 50 — dropdown, tooltip */</div>
<div class="z-[999]">/* Довільне значення через [] */</div>
<!-- Від'ємний z-index -->
<div class="-z-10">/* z-index: -10 — під всіма */</div>
Завдання для самоперевірки
Завдання 1.1. Декодування класів.
Поясніть словами, що робить кожен набір класів:
<div class="flex items-center justify-between gap-4 px-6 py-3 sticky top-0 z-50 bg-white">
<a class="flex items-center gap-2 font-black text-slate-900">Лого</a>
<div class="flex gap-1">
<a class="px-3 py-2 text-sm rounded-lg">Посилання</a>
</div>
<button class="shrink-0 px-4 py-2 bg-indigo-600 text-white rounded-lg">CTA</button>
</div>
<div class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-6">
<div class="lg:col-span-2 flex flex-col gap-2">...</div>
<div class="sm:col-span-2 lg:col-span-1 row-span-2">...</div>
</div>
Завдання 1.2. Соціальні іконки у footer.
Реалізуйте рядок соціальних іконок: кожна — size-9 rounded-full bg-slate-100 hover:bg-indigo-100 hover:text-indigo-600 flex items-center justify-center transition-all, відступи між ними через gap-2, підпис «Ми у соцмережах» — text-xs text-slate-400 uppercase tracking-widest mb-3.
Завдання 1.3. Profile card.
Реалізуйте картку профілю: аватар size-16 rounded-full shrink-0 ліворуч, праворуч flex-1 flex flex-col gap-0.5: ім'я font-bold text-slate-900, посада text-sm text-slate-500, кількість підписників text-xs text-slate-400. Footer картки: flex justify-between items-center border-t pt-3 mt-3, кнопки «Підписатись» (primary) та «Повідомлення» (ghost).
Завдання 2.1. Dashboard Layout.
Реалізуйте layout адмін-панелі:
┌──────────────────────────────────────────┐
│ Sticky Header: flex justify-between │
├──────────┬───────────────────────────────┤
│ Sidebar │ Main Content │
│ 240px │ flex-1, scrollable │
│ flex-col │ grid grid-cols-3 stats │
│ hidden │ │
│ lg:flex │ │
└──────────┴───────────────────────────────┘
Вимоги: sticky header (висота h-16), sidebar w-60 hidden lg:flex flex-col, main із статистичними картками та таблицею. Mobile: sidebar прихований.
Завдання 2.2. Blog Card Grid.
3-колонна сітка статей (grid-cols-1 sm:grid-cols-2 lg:grid-cols-3):
- Перша картка:
col-span-full— горизонтальна (flex-row), зображення ліворуч, контент праворуч - Решта: вертикальні картки з
flex flex-col+growна тексті - Заголовок:
line-clamp-2, excerpt:line-clamp-3 - Метадані: категорія (label-стиль) + дата + час читання
- Кнопка:
mt-auto— завжди внизу
Завдання 2.3. Pricing Table.
3 тарифних плани (grid-cols-1 md:grid-cols-3):
- Стартовий, Pro (виділений:
border-2 border-indigo-500 shadow-xl relative), Enterprise - Pro має badge
absolute -top-3 left-1/2 -translate-x-1/2 - Список переваг через
space-y-3абоdivide-y - Checkmark ✓ через
flex items-center gap-2 - Кнопка —
mt-auto
Завдання 3.1. Повна лендінг-сторінка продукту.
Структура без жодного рядка власного CSS:
<Navbar> sticky top-0, flex justify-between, transparent→white при scroll
<Hero> grid grid-cols-1 lg:grid-cols-2, текст + ілюстрація/макет
<Features> grid grid-cols-1 md:grid-cols-3, Bento Grid variation
<Testimonials> flex gap-4, горизонтальний скрол на мобільному (overflow-x-auto)
<Pricing> grid grid-cols-1 md:grid-cols-3, featured виділений
<FAQ> flex flex-col, акордеон через <details>/<summary>
<Footer> grid grid-cols-2 md:grid-cols-4, колонки посилань + copyright
Вимоги до адаптивності:
- Mobile: всі секції в одну колонку, navbar із hamburger
md:: 2 колонки там де є 4, горизонтальний scroll для Testimonialslg+: повна багатоколонна сітка
Додатково: sticky top-0 z-50 для navbar, плавний transition між transparent і white при скролі через JS class toggle.
Попередня стаття: Utility-класи: основи та системаНаступна стаття: Кастомізація теми через @theme
Utility-класи: основи та система Tailwind
Детальний огляд ключових категорій utility-класів Tailwind: spacing, sizing, кольори, типографіка, тіні, borders. Система дизайн-токенів та логіка іменування. Найуживаніші класи на практиці.
Кастомізація теми через @theme у Tailwind v4
Повний академічний розбір CSS-first конфігурації Tailwind v4: директива @theme, дизайн-токени, OKLCH, шрифти, breakpoints, spacing, тіні та анімації. Побудова власної дизайн-системи з нуля — крок за кроком.