CSS Grid: руководство от основ до реальных макетов
Практика3 минРедакция Innovialabs
Коротко
CSS Grid раскладывает элементы сразу по строкам и колонкам: вы описываете треки сетки на контейнере, а элементы встают в ячейки или именованные области — это удобнее всего для макетов страниц.
Что такое CSS Grid
CSS Grid — двумерная система раскладки: она управляет строками и колонками одновременно. Flexbox выстраивает элементы в одну линию, Grid — в таблицу из ячеек, которую можно перестраивать без изменения HTML.
.grid {
display: grid;
grid-template-columns: 200px 1fr;
gap: 24px;
}
Здесь две колонки: первая 200px, вторая занимает остаток. Прямые дети контейнера автоматически распределяются по ячейкам.
Основные понятия
| Понятие | Что это |
|---|---|
| Трек | Строка или колонка сетки |
| Линия | Граница между треками, нумеруется с 1 |
| Ячейка | Пересечение строки и колонки |
| Область | Прямоугольник из нескольких ячеек |
gap | Промежуток между треками |
Единица fr
fr — доля свободного места в контейнере. 1fr 2fr делит пространство в пропорции 1:2 после вычета фиксированных размеров и gap.
grid-template-columns: 240px 1fr 1fr;
Первая колонка фиксирована, две другие делят остаток поровну. Повторы удобно записывать через repeat():
grid-template-columns: repeat(4, 1fr);
Размещение элементов по линиям
Элемент можно растянуть на несколько треков, указав линии:
.wide {
grid-column: 1 / 3; /* с 1-й по 3-ю линию: две колонки */
}
.tall {
grid-row: span 2; /* занять две строки */
}
-1 означает последнюю линию явной сетки, поэтому grid-column: 1 / -1 растягивает элемент на всю ширину.
Именованные области
grid-template-areas позволяет нарисовать макет прямо в CSS:
.page {
display: grid;
grid-template-columns: 240px 1fr;
grid-template-areas:
"header header"
"sidebar main"
"footer footer";
}
.page > header { grid-area: header; }
.page > aside { grid-area: sidebar; }
.page > main { grid-area: main; }
.page > footer { grid-area: footer; }
Код читается как схема страницы, а перестроить макет можно, изменив только строки областей.
auto-fit и minmax: адаптивность без медиазапросов
grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
Браузер сам решает, сколько колонок поместится: каждая не уже 240px и растягивается до доли свободного места. На узком экране — одна колонка, на широком — четыре или больше.
auto-fitсхлопывает пустые колонки, и элементы растягиваются на всю ширину.auto-fillсохраняет пустые колонки, и элементы остаются своего размера.
Неявная сетка
Если элементов больше, чем ячеек в описанной сетке, Grid создаёт неявные строки. Их размер задаёт grid-auto-rows:
.grid {
grid-template-columns: repeat(3, 1fr);
grid-auto-rows: minmax(160px, auto);
}
Каждая новая строка будет не ниже 160px и вырастет, если контента больше.
Шаг за шагом: адаптивный макет страницы
- Опишите мобильную версию — всё в одну колонку:
.page {
display: grid;
gap: 16px;
grid-template-areas:
"header"
"main"
"sidebar"
"footer";
}
- На широком экране переставьте области:
@media (min-width: 900px) {
.page {
grid-template-columns: 1fr 280px;
grid-template-areas:
"header header"
"main sidebar"
"footer footer";
}
}
- Назначьте
grid-areaэлементам, как в примере выше. HTML не меняется.
Шаг за шагом: галерея карточек
.gallery {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
gap: 20px;
}
.gallery img {
width: 100%;
aspect-ratio: 4 / 3;
object-fit: cover;
}
Карточки сами перестраиваются под ширину экрана, а aspect-ratio держит изображения одинаковыми.
Частые ошибки
1frс длинным контентом. У1frминимум равенauto, и широкий контент раздувает колонку. Используйтеminmax(0, 1fr).- Несовпадение областей. Каждая строка в
grid-template-areasдолжна иметь одинаковое число колонок, а область — быть прямоугольником. - Grid для всего подряд. Для простого ряда кнопок Flexbox проще.
- Визуальный порядок против порядка в HTML. Перестановка областей не меняет порядок чтения для клавиатуры и скринридеров.
Подробности — в документации на MDN.