Grid: двумерная сетка

Зачем:Когда нужны и строки, и столбцы, flexbox становится неудобным, а grid решает задачу одним правилом. После урока вы описываете макет страницы областями и делаете сетку карточек, которая сама подбирает число столбцов.

30 минут

Озвучено синтезом речи (Qwen3-TTS), голос не принадлежит человеку.

CSS Grid — двумерная раскладка: на контейнере описывают строки и столбцы, а дочерние элементы сами встают в ячейки и именованные области.

Строки и столбцы вместе

Flexbox выстраивает элементы в одну линию: ряд или столбец. А макет страницы и сетка карточек состоят из строк и столбцов сразу. Для них есть grid (сетка). Он появился в браузерах позже flexbox, в 2017 году, поэтому для нашей машины времени 2014–2019 это одна эпоха адаптивной вёрстки, и пользоваться мы будем самым современным.

В grid вы описываете сетку на контейнере, а дети сами встают в ячейки:

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

Три равные колонки с промежутком. Основные слова:

  • трек: одна колонка или строка;
  • линия: граница между треками (линии нумеруются с единицы);
  • ячейка: пересечение строки и столбца;
  • область: прямоугольник из нескольких ячеек.

Единица fr и функции

  • fr (fraction, доля): доля свободного места. 2fr 1fr даёт две колонки, первая вдвое шире второй;
  • repeat(3, 1fr): «три раза по 1fr»;
  • minmax(14rem, 1fr): «не уже 14rem, но растяни на свободное место»;
  • auto-fit в repeat(): «столько колонок, сколько помещается».

Вместе: repeat(auto-fit, minmax(14rem, 1fr)) даёт сетку, которая сама решает, сколько колонок: на широком экране четыре, на узком одна, и ни одного медиазапроса. Подвигайте ползунок на схеме и посмотрите.

Колонки: фиксированные и подбираемые
1
2
3
4
5
6

Число колонок подбирается само: на широком экране их несколько, на узком одна, и ни одного медиазапроса. minmax(9rem, 1fr) значит «не уже 9rem, но растянись на свободное место».

Макет страницы по областям
.page {
  display: grid;
  grid-template-columns: 2fr 1fr;
  grid-template-areas:
    "header header"
    "main aside"
    "footer footer";
  gap: 12px;
}
header
main
aside
footer

Обратите внимание на запись minmax(0, 2fr) в макете: у колонки с 1fr есть скрытая беда, она не сжимается меньше своего содержимого, и длинное слово выталкивает колонку за край. minmax(0, …) разрешает ей сжаться.

Проверьте себя: что значит repeat(auto-fit, minmax(14rem, 1fr))?

Столько колонок, сколько помещается при минимальной ширине 14rem, растянутые на свободное место. Число колонок подбирается само.

Макет словами: области

Самый наглядный приём grid: описать макет текстом.

.page {
  display: grid;
  grid-template-columns: 2fr 1fr;
  grid-template-areas:
    "header header"
    "main   aside"
    "footer footer";
}

.page > header { grid-area: header; }
.page > main   { grid-area: main; }

Макет читается как рисунок, в котором слова служат названиями областей. А чтобы перестроить его для телефона, достаточно переписать grid-template-areas (по одному слову в строке), не трогая HTML. Для нашей страницы мы нарисуем только основной блок и боковой.

Предупреждение про порядок. Grid позволяет поставить блок куда угодно независимо от места в HTML, но порядок с клавиатуры и в программе чтения идёт по разметке. Если вид сильно расходится с порядком в HTML, пользователь клавиатуры будет прыгать по странице. Держите порядок в HTML таким, каким его должен читать человек.

Flexbox или grid

Простое правило: один ряд или одна колонка: flexbox, строки и колонки вместе: grid. Меню, шапка, значок с подписью: flexbox. Макет страницы, сетка карточек, галерея: grid. Их можно вкладывать друг в друга: grid для каркаса страницы, flexbox внутри карточки. Если сомневаетесь, спросите себя: важно ли мне, чтобы элементы разных рядов выстраивались в общие колонки? Да: grid.

Проверьте себя: что выбрать для ряда из пяти пунктов меню и что для сетки карточек?

Для меню flexbox, это один ряд. Для сетки карточек grid: строки и колонки вместе.

Практика

Вы продолжаете сайт 2014 года. Раскладка на flexbox работает, но теперь вы замените её на grid. Для макета нужны колонки и области, а для карточек одна строка с auto-fit. Проверка смотрит и на свойства контейнеров, и на то, что у основного блока есть своя область.

Потяните ширину окна: карточки сами меняют число колонок. А потом сравните: сколько строк вы написали для макета на flexbox, и сколько на grid? Что стало понятнее?

Что было не так с 2014 годом

До grid колонки считали руками: «эта колонка 31,5 процента, а эта 65,5, потому что остальное зазор». Фреймворки вроде Bootstrap предлагали готовую сетку из двенадцати колонок и толпу классов col-md-4, и разметка превращалась в слои «обёрток». Сегодня сетка в CSS, а HTML остаётся смысловым.

Практика

Готовлю вашу страницу…

Тест

Вопрос 1 из 6

Соедините задачу с инструментом, который для неё лучше

Подберите пару к каждому пункту.

Карточки

Эти карточки попадут в повторение, когда вы завершите урок.

  • Когда grid, а когда flexbox?

    Ответ

    Grid для строк и столбцов одновременно (макет страницы, сетка карточек). Flexbox для одной линии (меню, шапка, значок с подписью).

  • Что такое fr?

    Ответ

    Доля свободного места: колонки 2fr 1fr делят остаток в пропорции два к одному.

  • Как сделать сетку, которая сама меняет число колонок?

    Ответ

    grid-template-columns: repeat(auto-fit, minmax(14rem, 1fr)): сколько помещается при минимуме 14rem, растянутые на свободное место.

  • Что такое grid-template-areas?

    Ответ

    Макет, нарисованный именами областей в кавычках, и grid-area у элементов. Чтобы перестроить макет для узкого экрана, переписывают только areas.

Источники

Дальше

Теперь вы знаете: Grid.