grid-template-columns, grid-template-rows).auto-fill, auto-fit, minmax()).grid-column, grid-row).Flexbox зробив революцію у макетуванні, але він призначений переважно для вирішення одновимірних завдань — розміщення елементів в один рядок або в одну колонку. Коли ж постає необхідність розробити складну загальну розкладку сторінки (наприклад, визначити розташування заголовка, футера, бокових панелей і головного контенту), Flexbox стає недостатньо ефективним, змушуючи розробників вкладати багато контейнерів один в один.
Тут на допомогу приходить CSS Grid Layout (скорочено Grid) — найпотужніша система двовимірного компонування в CSS. Grid дозволяє будувати макети, маніпулюючи одночасно і рядками, і колонками. Це надає безпрецедентний контроль над розташуванням кожного блоку на екрані.
Крім того, сучасний веб вимагає, щоб сайти однаково добре виглядали як на великих моніторах, так і на маленьких екранах смартфонів. Створення таких інтерфейсів є завданням Адаптивного веб-дизайну. У цій лекції ми також розглянемо медіа-запити та сучасні стратегії адаптації контенту.
Головна відмінність між системами компонування:
Практичне правило:
У більшості сучасних проектів ці дві технології використовуються разом, ідеально доповнюючи одна одну.
Як і у Flexbox, Grid базується на взаємодії батьківського елемента (Grid Container) та дочірніх (Grid Items).
Ключові поняття:
Щоб перетворити елемент на сітку, йому призначають:
.container {
display: grid; /* Вмикає Grid */
}
Головні властивості для описання структури:
grid-template-columns — визначає кількість та ширину колонок.grid-template-rows — визначає кількість та висоту рядків.Ключове нововведення — одиниця fr (Fraction):
fr репрезентує долю(фракцію) доступного простору.
.grid {
display: grid;
/* 3 колонки: перша займає 200px, а весь залишок ділиться між
наступними як 1 до 2 */
grid-template-columns: 200px 1fr 2fr;
/* 2 рядки по 100px кожен */
grid-template-rows: 100px 100px;
/* Відступи між клітинками (заміняє margin) */
gap: 20px;
}

repeat()Дозволяє скоротити запис, якщо сітка має багато однакових колонок:
grid-template-columns: repeat(4, 1fr); — створить 4 рівні колонки, кожна по 1fr.
auto-fill, auto-fit, minmax())Особлива магія Grid полягає в здатності створювати адаптивні сітки без використання медіа-запитів. Для цього використовується функція minmax(), що задає діапазон мінімального і максимального розміру (наприклад, minmax(250px, 1fr)).
У комбінації з auto-fit браузер автоматично перенесе елементи, якщо вони не “влазять” у рядок:
.gallery {
display: grid;
/* Розмісти скільки завгодно колонок у рядку.
Мінімальна ширина кожної — 200px.
Якщо у рядку залишиться вільне місце — розтягни колонки порівну (1fr). */
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
gap: 15px;
}
Це найпопулярніший патерн для сітки карток з товарами.
Визначивши сітку на контейнері, ми можемо розташувати в ній елементи, використовуючи властивості: grid-column-start, grid-column-end, grid-row-start, grid-row-end.
Найчастіше використовують їх скорочення: grid-column та grid-row.
Значення задаються у вигляді лінія початку / лінія кінця.
.item-a {
/* Елемент почнеться від 1-ї вертикальної лінії і закінчиться на 3-й
(буде займати 2 колонки) */
grid-column: 1 / 3;
/* Почнеться на 2-му рядку і розтягнеться до самого кінця (-1) */
grid-row: 2 / -1;
}

Також можна вказати, скільки клітинок елемент має зайняти, використовуючи ключове слово span:
grid-column: span 2; — об’єднати дві клітинки по горизонталі.
Це один із найкрутіших візуальних способів побудови макета. Ви можете буквально “намалювати” структуру в CSS.
.layout {
display: grid;
grid-template-areas:
"header header header"
"sidebar main main"
"footer footer footer";
}
.header {
grid-area: header;
}
.sidebar {
grid-area: sidebar;
}
.main {
grid-area: main;
}
.footer {
grid-area: footer;
}
Тепер, для адаптивного дизайну, вам достатньо у медіа-запиті просто змінити “малюнок” у властивості grid-template-areas.
Адаптивний веб-дизайн (RWD) означає, що ваш сайт динамічно підлаштовується під розмір екрану користувача, орієнтацію пристрою та інші фактори.

Основним інструментом RWD є Медіа-запити.
Вони дозволяють застосувати блок CSS-коду лише тоді, коли браузер відповідає певній умові (наприклад, ширина екрану менше 768px).
/* Базові стилі */
.content {
font-size: 16px;
grid-template-columns: 1fr 1fr;
}
/* Правило спрацює лише на екранах ширших або рівних 768px */
@media screen and (min-width: 768px) {
.content {
font-size: 18px; /* Збільшуємо шрифт на великих екранах */
}
}
/* Правило спрацює лише на екранах до 480px включно (телефони) */
@media screen and (max-width: 480px) {
.content {
grid-template-columns: 1fr; /* Робимо 1 колонку замість двох */
}
}
Головне правило адаптивності: Обов’язково додавайте мета-тег Viewport всередину <head>, інакше медіа-запити на телефонах не працюватимуть коректно:
<meta name="viewport" content="width=device-width, initial-scale=1.0">
Існує дві принципові стратегії написання адаптивного CSS:
@media (max-width: ...) для поступового звуження та спрощення макету до мобільної версії.@media (min-width: ...) для поступового розширення та ускладнення макету з ростом екрану.fr) є потужним засобом розподілу доступного простору в Grid, який значно спрощує розрахунки.repeat(), auto-fit та minmax() здатна створювати надзвичайно потужні та гнучкі адаптивні сітки навіть без медіа-запитів.grid-template-areas робить CSS код семантичним та зрозумілим.@media), які дозволяють підміняти стилі залежно від умов (зокрема, ширини вікна).fr (Fraction)? Наведіть приклад.auto-fill та auto-fit.span впливає на розташування елемента по сітці?grid-template-areas) і як з ними працювати? Наведіть приклад синтаксу для 2-колонкового макета з header і footer.min-width чи max-width) використовуються у цьому підході?