Урок 28. Теория: grid-area и сложные сетки

📁 Раздел: CSS Grid ⏱️ Время изучения: ~65 мин 🎯 Сложность: Средняя
#grid-template-areas #grid-area #grid-template-columns #grid-template-rows #grid-template #gap

⚡ Кратко

grid-template-areas — это «ASCII-карта» макета: вы рисуете строками-кавычками, где какой блок стоит, а у каждого элемента указываете grid-area: имя.

  • Каждая строка в кавычках = ряд сетки; каждое слово = ячейка-колонка.
  • Одинаковое имя в соседних ячейках растягивает область (как header header на всю ширину).
  • Точка . = пустая ячейка.
  • Переименовал область в карте — и блок переехал, HTML менять не надо.

Главная идея

В уроке 27 вы расставляли элементы по номерам линий (grid-column: 1 / 3). Это работает, но читается плохо: глядя на цифры, трудно понять, что это «шапка на всю ширину». grid-template-areas переворачивает подход: вы рисуете макет словами прямо в CSS. Это главная фишка урока — самый наглядный способ собрать классический макет «шапка / боковое меню / контент / подвал».

Представьте план этажа, который рисует архитектор. Он не пишет «комната начинается на отметке 1.0 м и заканчивается на 4.5 м» — он просто подписывает на чертеже: «спальня», «кухня», «коридор». grid-template-areas — это и есть такой план этажа: вы расставляете «комнаты» (header, sidebar, content, footer) по именам, а браузер сам считает координаты. Хотите поменять планировку — стираете подпись и пишете другую, стены двигать не нужно.

Как это работает

Механизм состоит из двух частей, которые работают в паре:

  • grid-template-areas задаётся на контейнере. Это набор строк в кавычках. Каждая строка — один ряд сетки, каждое слово в строке — одна ячейка-колонка. Повторяя имя по горизонтали или вертикали, вы растягиваете область на несколько ячеек — но область обязана быть прямоугольной.
  • grid-area: имя задаётся на дочернем элементе и говорит: «помести меня в область с этим именем». Имена в CSS — без кавычек.
  • Точка . на месте слова означает пустую ячейку — в неё ничего не попадёт.
  • Ширины колонок и высоты строк по-прежнему задают grid-template-columns и grid-template-rows; areas лишь раскладывают элементы по уже размеченным трекам.

Вот тот же макет в виде схемы — обратите внимание, как header и footer тянутся на обе колонки, потому что их имя повторено:

header header sidebar content footer footer
«Карта» макета: одинаковое имя в двух ячейках одного ряда растягивает область на всю ширину.

Базовый CSS

Эта запись 1-в-1 повторяет схему выше: три строки карты = три ряда, два слова в строке = две колонки.

📄 lesson-28/grid.css
.page {
  display: grid;
  grid-template-areas:
    "header  header"
    "sidebar content"
    "footer  footer";
  grid-template-columns: 16rem 1fr;   /* боковое меню фиксировано, контент тянется */
  grid-template-rows: auto 1fr auto;  /* шапка и подвал по содержимому, контент — остальное */
  gap: 1rem;
}

.site-header { grid-area: header; }
.sidebar     { grid-area: sidebar; }
.content     { grid-area: content; }
.site-footer { grid-area: footer; }

Когда применять

areas незаменимы для каркаса страницы (header/sidebar/main/footer) и любых статичных двумерных макетов, где важна читаемость. Огромный плюс — перестановка без правки HTML: чтобы в мобильной версии убрать sidebar или поставить его снизу, достаточно переписать карту areas внутри медиа-запроса, разметка остаётся прежней. Для одномерных линий (ряд кнопок, меню в строку) проще Flexbox — об этом отдельный урок 29.

Частая ошибка

Карта должна образовывать прямоугольную сетку: во всех строках одинаковое число ячеек, а каждая именованная область — связный прямоугольник. «Лесенка» вроде "a a" "a ." с разорванной областью — невалидна, и весь шаблон молча игнорируется.

Проверить по документации: вложенные сетки (nested grid) и наследование треков через subgrid поддерживаются не везде одинаково — перед production сверяйтесь с MDN / Can I Use.

Навигация