Layout з CSS Grid

З поверненням.
У попередньому уроці ти вивчив Flexbox.
Flexbox чудово підходить для організації елементів в одному напрямку.
Rows.
Columns.
Centered things.
Життя стало трохи менш хаотичним.
Тепер ми знайомимося з CSS Grid.
Grid потрібен для two-dimensional layouts.
Тобто для rows і columns одночасно.
Flexbox — це ніби розставити стільці в одну лінію.
Grid — це ніби спланувати всю кімнату.
Стіни.
Столи.
Вікна.
І той один стілець, який ніхто не знає куди поставити.
Grid дає тобі серйозний контроль над layout.
І так, спочатку він може виглядати трохи страшно.
Але без паніки.
Grid — не монстр.
Це просто дуже організована таблиця з кращим почуттям стилю.
Що Ти Вивчиш
У цьому уроці ти дізнаєшся:
- що таке CSS Grid;
- коли використовувати Grid замість Flexbox;
- як створити grid container;
- як визначати columns;
- як визначати rows;
- як використовувати
gap; - як використовувати
frunits; - як створювати cards за допомогою Grid;
- як використовувати
repeat; - як побудувати responsive grid layout.
Що Таке CSS Grid?
CSS Grid — це layout system для організації елементів у rows і columns.
Він допомагає створювати:
- galleries;
- dashboards;
- card grids;
- product lists;
- page sections;
- blog layouts;
- portfolio grids.
Flexbox найкращий для одного напрямку.
Grid найкращий для двох напрямків.
Приклад:
.cards {
display: grid;
grid-template-columns: 1fr 1fr 1fr;
}
Це створює три рівні columns.
Кожен 1fr означає одну частину доступного простору.
CSS сам робить математику.
І цього разу тобі не потрібно рахувати все вручну, як втомлений бухгалтер з клавіатурою.
Grid vs Flexbox
Використовуй Flexbox, коли потрібен один напрямок:
- navbar links в одному row;
- buttons в одному row;
- items centered всередині box;
- просте horizontal або vertical alignment.
Використовуй Grid, коли потрібні rows і columns:
- три cards в одному row;
- image galleries;
- dashboard sections;
- page layouts;
- responsive card systems.
Flexbox каже:
“Дай мені розставити ці елементи в одну лінію.”
Grid каже:
“Дай мені весь план кімнати.”
Обидва корисні.
Жоден не є магією.
Але Grid іноді виглядає як магія, коли layout нарешті перестає з тобою битися.
Створи Проєкт
Створи папку для цього уроку:
mkdir css-lesson6
cd css-lesson6
touch index.html
touch style.css
Ти маєш отримати:
css-lesson6/
index.html
style.css
Відкрий папку у своєму editor.
Ми побудуємо сторінку з course cards.
Вона матиме:
- header;
- introduction;
- grid з cards;
- footer.
Проста ідея.
Дуже корисний pattern.
Ти будеш використовувати такий layout всюди.
Courses.
Blog posts.
Services.
Portfolio projects.
Навіть pizza menu, якщо піца серйозно ставиться до frontend architecture.
Напиши HTML
Відкрий index.html і додай це:
<!DOCTYPE html>
<html lang="uk">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Layout з CSS Grid</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<header class="site-header">
<h1>Layout з CSS Grid</h1>
<p>Будуй чисті rows і columns без втрати душевного спокою.</p>
</header>
<main class="page">
<section class="intro">
<h2>Теми Курсу</h2>
<p>
CSS Grid допомагає створювати потужні two-dimensional layouts за допомогою rows і columns.
</p>
</section>
<section class="course-grid">
<article class="course-card">
<h2>HTML Basics</h2>
<p>Вивчи структуру веб-сторінок.</p>
</article>
<article class="course-card">
<h2>CSS Styling</h2>
<p>Зроби сторінки читабельними, чистими і красивими.</p>
</article>
<article class="course-card">
<h2>Flexbox</h2>
<p>Вирівнюй елементи в rows або columns.</p>
</article>
<article class="course-card">
<h2>CSS Grid</h2>
<p>Будуй layouts з rows і columns одночасно.</p>
</article>
<article class="course-card">
<h2>Responsive Design</h2>
<p>Зроби сайти зручними на різних screen sizes.</p>
</article>
<article class="course-card">
<h2>Animations</h2>
<p>Додай плавний рух і interactive effects.</p>
</article>
</section>
</main>
<footer class="site-footer">
<p>Створено під час вивчення CSS Grid.</p>
</footer>
</body>
</html>
Це дає нам шість cards.
Без CSS вони будуть одна під одною.
Це нормально.
HTML робить свою роботу.
Тепер CSS Grid заходить з планшетом і каже:
“Давайте це організуємо.”
Почни з Базових Стилів
Відкрий style.css і додай:
* {
box-sizing: border-box;
}
body {
margin: 0;
font-family: Arial, sans-serif;
background-color: #f3f4f6;
color: #111827;
}
.site-header {
background-color: #111827;
color: white;
text-align: center;
padding: 56px 24px;
}
.site-header h1 {
margin: 0 0 12px;
font-size: 48px;
}
.site-header p {
margin: 0;
color: #d1d5db;
font-size: 20px;
}
Це створює простий header.
Тепер додай page container:
.page {
max-width: 1100px;
margin: 40px auto;
padding: 0 24px;
}
Це центрує main content і обмежує його ширину.
Layout без max width може стати занадто широким.
А дуже широкий текст боляче читати.
Ніби речення біжить марафон через увесь monitor.
Створи Grid Container
Щоб створити grid, використовуй:
display: grid;
Додай це:
.course-grid {
display: grid;
}
Тепер .course-grid стає grid container.
Direct children стають grid items.
У нашому випадку кожен .course-card стає grid item.
Але поки що нічого дуже драматичного не сталося.
Ми створили grid container.
Тепер треба визначити columns.
CSS чекає інструкцій.
Як дуже строгий assistant без фантазії.
Визнач Columns
Для визначення columns використовуй grid-template-columns.
Додай це:
.course-grid {
display: grid;
grid-template-columns: 1fr 1fr 1fr;
}
Це створює три columns.
Кожна column отримує однакову частину доступного простору.
fr означає fraction.
Тобто це:
grid-template-columns: 1fr 1fr 1fr;
означає:
Поділи доступний простір на три рівні частини.
Тепер у тебе є three-column grid.
CSS не поскаржився.
Рідкісний і красивий момент.
Unit fr
fr unit означає частину доступного простору.
Приклад:
grid-template-columns: 1fr 2fr;
Це створює дві columns.
Друга column удвічі ширша за першу.
Приклад:
grid-template-columns: 1fr 1fr 1fr;
Це створює три рівні columns.
fr дуже корисний, бо адаптується до доступного простору.
Тобі не потрібно писати:
width: 33.333333%;
Це число виглядає так, ніби spreadsheet отримав головний біль.
Використовуй fr.
Чистіше.
Дружніше.
Менш підозріло.
Додай Gap Між Grid Items
Зараз cards можуть бути занадто близько.
Додай gap:
.course-grid {
display: grid;
grid-template-columns: 1fr 1fr 1fr;
gap: 24px;
}
gap створює простір між rows і columns.
Це чистіше, ніж вручну додавати margins кожній card.
Хороший spacing робить layout читабельним.
Поганий spacing робить сторінку схожою на людей, які стоять занадто близько в elevator.
Ніхто цього не хоче.
Навіть твої cards.
Стилізуй Cards
Додай це:
.course-card {
background-color: white;
padding: 28px;
border: 2px solid #e5e7eb;
border-radius: 18px;
}
.course-card h2 {
margin-top: 0;
font-size: 24px;
}
.course-card p {
color: #4b5563;
font-size: 18px;
line-height: 1.6;
}
Тепер cards виглядають як справжні cards.
White background.
Padding.
Border.
Rounded corners.
Спокійний організований layout.
Без криків.
Без хаосу.
Тільки organized boxes, чого CSS таємно хотів від самого початку.
Стилізуй Intro Section
Додай це:
.intro {
background-color: white;
padding: 32px;
border-radius: 18px;
margin-bottom: 24px;
border-left: 6px solid #2563eb;
}
.intro h2 {
margin-top: 0;
font-size: 32px;
}
.intro p {
color: #4b5563;
font-size: 18px;
line-height: 1.7;
}
Intro section тепер має:
- white background;
- internal spacing;
- rounded corners;
- blue left border;
- margin below.
Це common pattern.
Highlighted intro box.
Просто.
Зрозуміло.
Не намагається стати цирком.
Добре.
Використовуй repeat
Писати так нормально:
grid-template-columns: 1fr 1fr 1fr;
Але CSS дає нам чистішу версію:
grid-template-columns: repeat(3, 1fr);
Це означає:
Створи 3 columns, кожна шириною 1fr.
Онови .course-grid:
.course-grid {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 24px;
}
Так легше читати.
Особливо коли columns більше.
Наприклад:
grid-template-columns: repeat(4, 1fr);
Чотири рівні columns.
Просто.
Елегантно.
CSS на мить одягнув костюм.
Fixed і Flexible Columns
Можна комбінувати fixed і flexible columns.
Приклад:
grid-template-columns: 250px 1fr;
Це створює:
- first column: 250px;
- second column: remaining space.
Приклад:
grid-template-columns: 200px 1fr 1fr;
Це створює:
- first column fixed;
- second і third columns flexible.
Це корисно для dashboards або layouts з sidebar.
Але для simple cards repeat(3, 1fr) ідеально.
Не ускладнюй без потреби.
CSS і так має достатньо місць, де може сховати trouble.
Grid Rows
Grid також може визначати rows.
Приклад:
grid-template-rows: auto auto;
Але часто rows створюються автоматично.
У нашому card grid ми визначаємо columns.
Browser створює rows, коли потрібно.
Six cards.
Three columns.
Result:
- first row: three cards;
- second row: three cards.
Дуже зручно.
Browser робить нудну частину.
Ми дозволяємо.
Cards з Однаковою Висотою
Grid items в одному row за замовчуванням природно розтягуються до однакової висоти.
Це означає: якщо одна card має більше тексту, row все одно може виглядати рівно.
Це одна з причин, чому Grid чудово підходить для cards.
Пізніше можна організувати content всередині кожної card за допомогою Flexbox.
Так, Flexbox і Grid можуть працювати разом.
Вони не вороги.
Вони coworkers.
Іноді дивні coworkers.
Але все одно coworkers.
Responsive Grid Problem
Наш grid має три columns:
grid-template-columns: repeat(3, 1fr);
На desktop це виглядає добре.
Але на маленькому phone screen три columns можуть стати занадто вузькими.
Cards страждають.
Text страждає.
Users страждають.
А потім усі звинувачують CSS.
Тому нам потрібен responsive design.
Ми нормально вивчимо responsive design у наступному уроці, але вже зараз можемо зробити просте покращення.
Простий Responsive Grid
Додай це в кінець CSS:
@media (max-width: 800px) {
.course-grid {
grid-template-columns: repeat(2, 1fr);
}
}
@media (max-width: 520px) {
.course-grid {
grid-template-columns: 1fr;
}
}
Це означає:
- desktop: 3 columns;
- tablets або менші screens: 2 columns;
- phones: 1 column.
Тепер layout адаптується.
Cards можуть дихати.
Phone не плаче.
Good responsive behavior.
Дуже важливо.
Повний CSS
Твій style.css має виглядати так:
* {
box-sizing: border-box;
}
body {
margin: 0;
font-family: Arial, sans-serif;
background-color: #f3f4f6;
color: #111827;
}
.site-header {
background-color: #111827;
color: white;
text-align: center;
padding: 56px 24px;
}
.site-header h1 {
margin: 0 0 12px;
font-size: 48px;
}
.site-header p {
margin: 0;
color: #d1d5db;
font-size: 20px;
}
.page {
max-width: 1100px;
margin: 40px auto;
padding: 0 24px;
}
.intro {
background-color: white;
padding: 32px;
border-radius: 18px;
margin-bottom: 24px;
border-left: 6px solid #2563eb;
}
.intro h2 {
margin-top: 0;
font-size: 32px;
}
.intro p {
color: #4b5563;
font-size: 18px;
line-height: 1.7;
}
.course-grid {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 24px;
}
.course-card {
background-color: white;
padding: 28px;
border: 2px solid #e5e7eb;
border-radius: 18px;
}
.course-card h2 {
margin-top: 0;
font-size: 24px;
}
.course-card p {
color: #4b5563;
font-size: 18px;
line-height: 1.6;
}
.site-footer {
text-align: center;
padding: 32px 24px;
color: #6b7280;
}
@media (max-width: 800px) {
.course-grid {
grid-template-columns: repeat(2, 1fr);
}
}
@media (max-width: 520px) {
.course-grid {
grid-template-columns: 1fr;
}
}
Збережи.
Онови.
Зміни розмір browser.
Подивись, як grid змінюється.
Three columns.
Two columns.
One column.
Це CSS Grid робить серйозну роботу.
Тихо.
Як professional, якому не потрібні аплодисменти, але точно потрібна кава.
Типові Помилки
Забути display grid
Неправильно:
.course-grid {
grid-template-columns: repeat(3, 1fr);
}
Правильно:
.course-grid {
display: grid;
grid-template-columns: repeat(3, 1fr);
}
Без display: grid grid properties нічого не роблять.
CSS просто проігнорує твої прекрасні плани.
Холодно.
Але передбачувано.
Робити Занадто Багато Columns
Це може виглядати нормально на величезному screen:
grid-template-columns: repeat(6, 1fr);
Але на менших screens стає нечитабельно.
Не змушуй layout мати занадто багато columns.
Layout має служити content.
А не стискати його, як валізу перед дешевим рейсом.
Забути gap
Grid без gap може виглядати переповнено.
Краще:
.course-grid {
display: grid;
gap: 24px;
}
Spacing має значення.
Твоєму content потрібен простір.
Твоєму мозку теж.
Практика
Створи сторінку з:
- одним header;
- однією intro section;
- шістьма cards;
- одним footer.
Використай CSS Grid, щоб створити:
- 3 columns на desktop;
- 2 columns на tablets;
- 1 column на phones.
Використай:
display: grid;grid-template-columns;repeat;fr;gap;- media queries.
Зміни кількість cards.
Спробуй 4.
Спробуй 8.
Спробуй 10.
Подивись, як Grid автоматично створює rows.
Browser робить layout work за тебе.
Дозволь йому.
Саме для цього й існують tools.
Міні-Завдання
Створи project gallery.
Кожна card має мати:
- project title;
- short description;
- category;
- link.
Використай Grid, щоб показати projects у трьох columns.
Зроби одну card special через class:
<article class="project-card featured">
Потім стилізуй її інакше:
.featured {
border-color: #2563eb;
}
Спробуй зробити grid responsive.
Це реальний portfolio pattern.
Ти можеш використати його для своїх projects.
І так, тепер твої projects можуть стояти в rows, як дисципліновані маленькі soldiers.
Frontend soldiers.
With border radius.
Підсумок
Сьогодні ти дізнався, що:
- CSS Grid використовується для two-dimensional layouts;
- Grid працює з rows і columns;
display: gridстворює grid container;- direct children стають grid items;
grid-template-columnsвизначає columns;frозначає fraction of available space;repeatробить column definitions коротшими;gapстворює spacing між grid items;- Grid чудовий для cards, galleries, dashboards і page layouts;
- media queries можуть робити grids responsive.
Grid потужний.
Flexbox усе ще корисний.
Вони працюють разом.
Використовуй Flexbox для одного напрямку.
Використовуй Grid для rows і columns.
Використовуй обидва, коли потрібно.
Це не cheating.
Це frontend wisdom.
Наступний Урок
У наступному уроці ми вивчимо responsive design.
Бо сторінка, яка виглядає добре тільки на твоєму laptop, ще не завершена.
Вона просто впевнена в собі в одній кімнаті.