HTML & CSS

CSS Grid. Двовимірний макет. Частина 2

Продовження: grid-template-areas (named areas), place-items, place-content, place-self, grid-auto-flow, Flexbox vs Grid, class page layout, masonry-сітка та практичні завдання.

CSS Grid. Частина 2: Named Areas, вирівнювання та практика

Це продовження статті CSS Grid. Частина 1, де ми розглянули основи: display grid, одиниця fr, repeat(), minmax(), gap та розміщення елементів.


grid-template-areas — говоримо іменами, не числами

Уявіть, що ви описуєте макет сторінки колезі по телефону. Як би ви це зробили? "Шапка зверху на всю ширину, зліва сайдбар, справа — контент, знизу підвал." Ось саме так і працює grid-template-areas — ви описуєте макет словами.

Замість:

.header {
    grid-column: 1 / 4;
    grid-row: 1;
}
.sidebar {
    grid-column: 1;
    grid-row: 2;
}

Пишемо:

.container {
    grid-template-areas:
        'header  header  header'
        'sidebar content content'
        'footer  footer  footer';
}
.header {
    grid-area: header;
}
.sidebar {
    grid-area: sidebar;
}
.footer {
    grid-area: footer;
}

Це самодокументований код — ви бачите макет прямо у CSS.

Синтаксис grid-template-areas

Кожен рядок у лапках описує один рядок сітки. Кожне слово — це клітинка, яка належить до відповідної named area. Однакові слова у сусідніх клітинках об'єднують їх в одну область. Крапка (.) означає порожню клітинку:

.container {
    display: grid;
    grid-template-columns: 150px 1fr 1fr;
    grid-template-rows: 70px 1fr 60px;
    grid-template-areas:
        'header  header  header' /* Рядок 1: шапка на 3 колонки */
        'sidebar main    main' /* Рядок 2: сайдбар + основний контент на 2 колонки */
        'footer  footer  footer'; /* Рядок 3: підвал на 3 колонки */
}

Правила grid-template-areas

Є кілька обмежень на синтаксис:

  1. Область (area) має бути прямокутною. Grid не підтримує L-подібних або Г-подібних форм.
  2. Кілька рядків рядка сітки, що містять одне й те саме ім'я, мають цю назву в суміжних колонках — не через одну.
  3. Якщо кількість слів у рядках різна — синтаксис буде некоректним.
Поширена помилка: написати "header header" у рядку з 3 колонками. Grid-браузери прийматимуть такий код, але header займе лише 2 клітинки, а третя залишиться без явно визначеної назви. Завжди перевіряйте відповідність кількості слів кількості колонок.

grid-area для елементів

Кожен елемент прив'язується до named area через grid-area: ім'я:

.header {
    grid-area: header;
}
.sidebar {
    grid-area: sidebar;
}
.main {
    grid-area: main;
}
.footer {
    grid-area: footer;
}

Після цього браузер автоматично розміщує елементи у вказаних областях — незалежно від їх порядку в HTML.

Повний приклад: класичний page layout

Preview
×
🔒localhost:3000

Зверніть увагу, наскільки CSS-код тепер читабельний: grid-template-areas — це ASCII-арт майбутнього макету прямо у коді.

Адаптивність через grid-template-areas

Перевизначення grid-template-areas у media query дозволяє повністю змінити макет для мобільних пристроїв одним блоком CSS:

/* Десктоп: стандартний макет */
.container {
    grid-template-columns: 200px 1fr;
    grid-template-areas:
        'header  header'
        'sidebar main'
        'footer  footer';
}

/* Мобільний: одна колонка, сайдбар переміщується вниз */
@media (max-width: 768px) {
    .container {
        grid-template-columns: 1fr;
        grid-template-areas:
            'header'
            'main'
            'sidebar' /* Сайдбар тепер між контентом і підвалом */
            'footer';
    }
}

Без grid-template-areas вам довелося б писати окремі grid-column та grid-row для кожного елемента в media query. З іменованими областями — лише одна зміна в grid-template-areas.


grid-area як скорочення позиціонування

grid-area може також використовуватися як ультра-коротке скорочення для grid-row-start / grid-column-start / grid-row-end / grid-column-end:

.element {
    /* grid-area: row-start / col-start / row-end / col-end */
    grid-area: 2 / 1 / 4 / 3;
    /* Еквівалентно: */
    grid-row-start: 2;
    grid-column-start: 1;
    grid-row-end: 4;
    grid-column-end: 3;
}
Порядок значень у grid-area: r-start / c-start / r-end / c-endрядок / колонка (не колонка / рядок, як можна очікувати). Це часто плутає. Для ясності в командній роботі краще використовувати явні grid-row та grid-column або named areas.

Вирівнювання в Grid: place-items, place-content, place-self

На відміну від Flexbox, де вирівнювання лише по двох осях, Grid дає повний контроль над вирівнюванням як клітинок у контейнері, так і вмісту всередині кожної клітинки.

Концептуальна різниця

Grid має два рівні вирівнювання:

  1. Вирівнювання Grid-елементів у клітинках — як елемент розміщується всередині своєї клітинки (якщо клітинка більша за елемент).
  2. Вирівнювання доріжок у контейнері — як вся сітка розміщується всередині контейнера (якщо сітка менша за контейнер).

Для першого рівня — align-items і justify-items. Для другого рівня — align-content і justify-content.

Loading diagram...
graph TB
    subgraph Container["Grid-контейнер"]
        subgraph Grid["Сітка (доріжки)"]
            subgraph Cell1["Клітинка (більша за елемент)"]
                Item1["Grid-елемент"]
            end
        end
    end
    A["align-content / justify-content\n↔ вирівнює сітку в контейнері"] --> Grid
    B["align-items / justify-items\n↔ вирівнює елементи в клітинках"] --> Item1
    style Container fill:#f1f5f9
    style Grid fill:#dde9ff
    style Cell1 fill:#c7d9ff
    style Item1 fill:#6366f1,color:#fff

justify-items та align-items

Ці властивості задаються на контейнері і застосовуються до всіх grid-елементів:

  • justify-items — вирівнює елементи горизонтально у клітинках (по осі inline/рядка)
  • align-items — вирівнює елементи вертикально у клітинках (по осі block/стовпця)

Можливі значення: start, end, center, stretch (за замовчуванням).

.container {
    display: grid;
    grid-template-columns: repeat(3, 200px);
    grid-template-rows: repeat(2, 150px);
    justify-items: center; /* Елементи по центру горизонтально */
    align-items: end; /* Елементи знизу вертикально */
}
Preview
×
🔒localhost:3000

justify-content та align-content

Ці властивості вирівнюють усю сітку всередині контейнера, якщо сітка менша за контейнер (тобто якщо сума ширин колонок + gap < ширина контейнера):

.container {
    display: grid;
    grid-template-columns: 100px 100px 100px; /* Явний фіксований розмір */
    width: 600px; /* Контейнер ширший за сітку */
    justify-content: center; /* Центрує всі 3 колонки відносно 600px */
    align-content: start; /* Сітка притиснута до верху */
}

Значення ті самі, що для justify-content у Flexbox: start, end, center, stretch, space-between, space-around, space-evenly.

justify-self та align-self

Дозволяють одному елементу перевизначити вирівнювання з justify-items/align-items:

.special-item {
    justify-self: end; /* Тільки цей елемент — справа в клітинці */
    align-self: start; /* Тільки цей елемент — зверху в клітинці */
}

Скорочення place-*

CSS Grid надає зручні скорочення, що об'єднують вертикальну та горизонтальну властивості:

/* place-items: align-items justify-items */
.container {
    place-items: center;
} /* Те саме, що: align-items: center; justify-items: center; */

/* place-content: align-content justify-content */
.container {
    place-content: center space-between;
}

/* place-self: align-self justify-self */
.item {
    place-self: end center;
}

Якщо вказати одне значення, воно застосовується до обох осей:

.container {
    place-items: center; /* ≡ align-items: center; justify-items: center; */
}
place-items: center — найшвидший спосіб відцентрувати вміст у кожній клітинці сітки. Це двоосьовий аналог display: flex; justify-content: center; align-items: center; але для Grid.

grid-auto-flow: dense — оптимізація заповнення

Коли у сітці є елементи різних розмірів (span 2, span 3 тощо), автоматичне розміщення може залишати порожні клітинки (holes). Алгоритм dense намагається заповнити ці прогалини наступними меншими елементами:

.masonry-grid {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));
    grid-auto-flow: row dense; /* dense = заповнюй прогалини */
}
dense змінює візуальний порядок елементів, але не HTML-порядок. Це може погано вплинути на доступність (accessibility) і поведінку клавіатурної навігації. Використовуйте dense лише для чисто візуальних галерей без семантично важливого порядку.
Preview
×
🔒localhost:3000

Flexbox vs Grid: коли що обирати

Одне з найпоширеніших питань на співбесідах і в розробці: "Коли Flexbox, коли Grid?" Відповідь не в тому, що один кращий за інший — вони вирішують різні задачі.

Flexbox — ідеальний вибір для:

  • Компонентів з вирівнюванням по одній осі (рядок або стовпець).
  • Навігаційних панелей, тулбарів.
  • Вирівнювання іконки і тексту в кнопці.
  • Спискових компонентів: списки карток, де контент "плине" природнім чином.
  • Центрування (вертикального, горизонтального) невеликих елементів.
/* ✅ Flexbox: кнопка з іконкою та текстом */
.btn {
    display: flex;
    align-items: center;
    gap: 0.5rem;
}

/* ✅ Flexbox: навіг-бар */
.navbar {
    display: flex;
    justify-content: space-between;
    align-items: center;
}

Порівняльна таблиця

КритерійFlexboxGrid
Виміри1D (рядок або колонка)2D (рядок і колонка)
ПідхідКонтент диктує розмірКонтейнер диктує структуру
Named areas❌ Немаєgrid-template-areas
Явне позиціонуванняЧасткове (order)Повне (grid-column/row)
Адаптивність без media queryflex-wrapauto-fit/auto-fill + minmax
Ідеальний дляКомпонентів, рядківМакетів, сіток
Підтримка браузерівВідміннаВідмінна (>97%)
Практичне правило: якщо ви думаєте в напрямку "рядок" — беріть Flexbox. Якщо ви думаєте в напрямках "рядок і стовпець" одночасно — беріть Grid. Багато реальних проєктів використовують обидва: Grid для загального макету і Flexbox для дрібних компонентів всередині.

Практика: Повноцінний page layout

Зберемо разом усе вивчене в обох частинах і побудуємо справжній макет веб-сторінки — зі шапкою, навігаційним меню, основним контентом, сайдбаром, підвалом:

Визначити HTML-структуру

<div class="page-wrapper">
    <header class="page-header">Шапка</header>
    <nav class="page-nav">Навігація</nav>
    <main class="page-main">Основний контент</main>
    <aside class="page-aside">Сайдбар</aside>
    <footer class="page-footer">Підвал</footer>
</div>

Описати розкладку через named areas

.page-wrapper {
    display: grid;
    grid-template-columns: 200px 1fr 260px;
    grid-template-rows: auto auto 1fr auto;
    grid-template-areas:
        'header header  header'
        'nav    nav     nav'
        'aside  main    .'
        'footer footer  footer';
    gap: 16px;
    min-height: 100vh;
    padding: 16px;
}

Зверніть на крапку (.) в рядку aside/main — це порожня третя колонка в основній зоні.

Прив'язати елементи до областей

.page-header {
    grid-area: header;
}
.page-nav {
    grid-area: nav;
}
.page-main {
    grid-area: main;
}
.page-aside {
    grid-area: aside;
}
.page-footer {
    grid-area: footer;
}

Зробити адаптивним для мобільних

@media (max-width: 768px) {
    .page-wrapper {
        grid-template-columns: 1fr;
        grid-template-areas:
            'header'
            'nav'
            'main'
            'aside'
            'footer';
    }
}
Preview
×
🔒localhost:3000

Subgrid — сітка всередині сітки

CSS Subgrid (підсітка) — відносно нова можливість Grid (підтримка з 2023 року у всіх major-браузерах). Вона дозволяє дочірньому Grid-елементу успадкувати доріжки батьківської сітки:

.parent {
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    gap: 1rem;
}

.child {
    display: grid;
    grid-column: 1 / -1; /* Займає всі 3 колонки */
    grid-template-columns: subgrid; /* Успадковує 3 колонки батька */
}

Без subgrid вкладений Grid-елемент утворює свою власну сітку, не пов'язану з батьківською. З subgrid — внуки вирівнюються точно по батьківській сітці. Це вирішує класичну проблему вирівнювання контенту в картках різної висоти.


CSS Grid інспектор у браузері

Chrome DevTools та Firefox DevTools мають вбудований Grid Inspector — незамінний інструмент налагодження:

Відкрити DevTools

Натисніть F12 або Ctrl+Shift+I / Cmd+Option+I (macOS).

Знайти grid-елемент

У вкладці Elements знайдіть елемент з display: grid. Поряд з ним з'явиться значок grid (прямокутна сітка).

Увімкнути візуалізацію

Клікніть на значок або відмітьте checkbox у вкладці Layout → Grid overlays. Браузер намалює лінії сітки прямо на сторінці.

Аналізувати

Ви побачите нумерацію ліній, розміри доріжок і named areas. Це значно спрощує налагодження складних сіток.


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

Паттерн 1: Holy Grail Layout

Класичний "holy grail" (ідеальний макет): шапка + 3 колонки + підвал.

.holy-grail {
    display: grid;
    grid-template: auto 1fr auto / 200px 1fr 200px;
    grid-template-areas:
        'header  header  header'
        'left    main    right'
        'footer  footer  footer';
    min-height: 100vh;
}

Паттерн 2: Responsive Card Grid (без media queries)

.card-grid {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
    gap: 1.5rem;
}

Паттерн 3: Masonry-подібна сітка (з dense)

.masonry {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
    grid-auto-rows: 50px;
    grid-auto-flow: dense;
    gap: 1rem;
}

.masonry-item-tall {
    grid-row: span 4;
}
.masonry-item-wide {
    grid-column: span 2;
}

Паттерн 4: Форма з вирівняними підписами

.form {
    display: grid;
    grid-template-columns: auto 1fr; /* підпис | поле введення */
    align-items: center;
    gap: 0.75rem 1rem;
}
Preview
×
🔒localhost:3000

Резюме. Повна картина CSS Grid

grid-template-areas

Описує макет словами-іменами. Самодокументований, адаптивний. Кращий вибір для page layout.

place-items / place-content

Скорочення вирівнювання по двох осях. place-items: center центрує вміст у кожній клітинці.

grid-auto-flow: dense

Ущільнює сітку, заповнюючи прогалини. Корисно для masonry-галерей, але впливає на порядок DOM.

Subgrid

Дочірній Grid успадковує доріжки батька. Вирішує проблему вирівнювання вмісту в картках.

Flexbox vs Grid

Flex — 1D, для компонентів. Grid — 2D, для макетів. Часто використовуються разом.

Grid Inspector

Вбудований інструмент Chrome/Firefox DevTools для візуалізації та налагодження Grid-сіток.

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


Попередня стаття: CSS Grid. Частина 1 — Основи, fr, repeat, minmax, розміщення

Наступна стаття: Позиціонування в CSS. Z-index. Stacking Context

Copyright © 2026