- Создавать сетку с помощью
grid-template-columns, единицыfrиrepeat() - Растягивать элементы на несколько столбцов и строить макет страницы через
grid-template-areas - Выбирать между Grid и Flexbox
- Писать адаптивную страницу по принципу «сначала мобильные» с медиазапросами и относительными единицами
Ты открываешь один и тот же сайт на телефоне, планшете и широком мониторе: на компьютере товары стоят в три столбца, на телефоне — в один, и ничего не вылезает за край экрана. Это адаптивный дизайн. Его главные инструменты — CSS Grid (сетка из строк и столбцов) и медиазапросы; в этом уроке ты освоишь и то и другое.
CSS Grid: строки и столбцы
display: grid превращает контейнер в сетку. grid-template-columns задаёт число столбцов и их ширину. Здесь используется особая единица **fr** (fraction — доля): 1fr 2fr делит свободное место на три доли, первый столбец получает одну, второй — две. repeat(3, 1fr) — сокращение для 1fr 1fr 1fr. Как и во Flexbox, gap задаёт промежутки между ячейками.
<style>
body { font-family: system-ui, sans-serif; padding: 12px; }
.grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 10px; }
.grid div { padding: 16px; text-align: center; background: #fbcfe8; border-radius: 8px; }
.grid .wide { grid-column: span 2; background: #f9a8d4; }
.grid .tall { grid-row: span 2; background: #c4b5fd; }
</style>
<div class="grid">
<div class="wide">1 (span 2 columns)</div>
<div class="tall">2 (span 2 rows)</div>
<div>3</div>
<div>4</div>
<div>5</div>
<div>6</div>
</div>repeat(3, 1fr) на 1fr 2fr 1fr и посмотри, как средний столбец станет вдвое шире. Элементы сами заполняют свободные ячейки: 3 и 4 встают под первым элементом.grid-column: span 2 растягивает элемент на два столбца, а grid-row: span 2 — на две строки. А весь макет страницы можно буквально «нарисовать» с помощью grid-template-areas: дай областям имена и расставь их по строкам в кавычках. Каждый элемент отправляется в свою область свойством grid-area.
<style>
body { font-family: system-ui, sans-serif; margin: 0; padding: 12px; }
.page {
display: grid;
grid-template-columns: 140px 1fr;
grid-template-areas:
"header header"
"side main"
"footer footer";
gap: 8px;
}
.page > * { padding: 12px; border-radius: 8px; }
header { grid-area: header; background: #fde68a; }
aside { grid-area: side; background: #bfdbfe; }
main { grid-area: main; background: #e2e8f0; min-height: 90px; }
footer { grid-area: footer; background: #d1fae5; }
</style>
<div class="page">
<header>Header</header>
<aside>Sidebar</aside>
<main>Main content</main>
<footer>Footer</footer>
</div>"side main" на "main side" — боковая панель переедет вправо, а HTML останется прежним. Поменяй местами и ширину столбцов (grid-template-columns: 1fr 140px), иначе основной блок окажется в узком столбце шириной 140px. Селектор .page > * выбирает всех прямых потомков .page.| Критерий | Flexbox | Grid |
|---|---|---|
| Измерения | одно направление: строка или столбец | два направления: строки и столбцы вместе |
| Что определяет раскладку | размер содержимого | заранее заданная сетка |
| Типичное применение | меню, ряд кнопок, содержимое карточки | макет страницы, галерея, сетка карточек |
<style>
body { font-family: system-ui, sans-serif; margin: 0; padding: 12px; background: #0f172a; }
.gallery {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(110px, 1fr));
gap: 10px;
}
.tile { aspect-ratio: 1; display: flex; justify-content: center; align-items: center;
font-size: 40px; background: #1e293b; border-radius: 12px; }
</style>
<div class="gallery">
<div class="tile">🌊</div><div class="tile">🏔️</div><div class="tile">🌳</div>
<div class="tile">🌅</div><div class="tile">🏜️</div><div class="tile">🌋</div>
<div class="tile">🏝️</div><div class="tile">❄️</div>
</div>110px на 200px — столбцов станет меньше, а плитки крупнее. aspect-ratio: 1 делает каждую плитку квадратной, а внутри плитки эмодзи центрирует Flexbox.Адаптивный дизайн и медиазапросы
Медиазапрос применяет правила CSS только при выполнении условия, например когда окно шире определённого значения: @media (min-width: 600px) { … }. Современный способ писать адаптивные страницы — подход «сначала мобильные» (mobile-first): базовые стили пишутся для маленьких экранов, а для широких добавляются дополнения через запросы min-width.
<style>
body { font-family: system-ui, sans-serif; margin: 0; padding: 12px; }
h1 { font-size: 1.4rem; color: #7c3aed; }
.cards { display: grid; grid-template-columns: 1fr; gap: 10px; }
.card { padding: 14px; background: #ede9fe; border-radius: 10px; }
@media (min-width: 500px) {
.cards { grid-template-columns: 1fr 1fr; }
}
@media (min-width: 900px) {
.cards { grid-template-columns: repeat(3, 1fr); }
h1 { font-size: 2rem; }
}
</style>
<h1>Mobile first</h1>
<div class="cards">
<div class="card">One</div>
<div class="card">Two</div>
<div class="card">Three</div>
</div>500px на 1500px, чтобы увидеть мобильную раскладку.- В
<head>каждой страницы должен быть<meta name="viewport" content="width=device-width, initial-scale=1">. Без него мобильный браузер рисует страницу как для широкого экрана шириной около 980px и уменьшает её — медиазапросы работают не так, как ожидалось. - Вместо фиксированной
width: 800pxпишиmax-width: 800px: на широком экране блок не станет больше 800px, а на узком сожмётся. - Делай изображения гибкими:
img { max-width: 100%; height: auto; }— картинка никогда не вылезет за контейнер и сохранит пропорции. - Используй относительные единицы:
remдля шрифтов,%,frиvwдля областей.font-size: clamp(1.5rem, 5vw, 3rem)увеличивает заголовок вместе с экраном, но держит его в заданных границах.
Cmd+Option+I)F12Cmd+Shift+M)Ctrl+Shift+MГлавное
display: gridиgrid-template-columnsсоздают сетку;fr— доля свободного места,repeat(3, 1fr)— три равных столбца.spanрастягивает элемент на несколько ячеек;grid-template-areasрисует весь макет именованными областями.- Flexbox — для одного направления, Grid — для двух; использовать их вместе — нормально.
- «Сначала мобильные»: базовые стили — для маленьких экранов,
@media (min-width: …)— дополнения для широких. - Метатег viewport,
max-width, гибкие изображения и относительные единицы — основа адаптивной страницы.
Проверь себя
Вопросов: 10. Каждый правильный ответ приносит XP.
grid-template-columns: 1fr 2fr (без gap). Какова ширина столбцов?