Глиф Учебники

Урок 9. CSS Grid — сетка страницы

Курс «HTML и CSS» · урок 9 из 10 · 4 минуты чтения

Flexbox раскладывает элементы в одну линию — строку или колонку. Grid (сетка) работает сразу в двух направлениях: вы задаёте столбцы и строки, а элементы занимают ячейки. Это удобно для раскладки страницы целиком (шапка, боковая колонка, текст, подвал) и для ровных рядов карточек.

Первая сетка

HTML
<div class="grid">
  <div>1</div>
  <div>2</div>
  <div>3</div>
  <div>4</div>
  <div>5</div>
  <div>6</div>
</div>
CSS
.grid {
  display: grid;
  grid-template-columns: 200px 200px 200px;
  gap: 16px;
}

grid-template-columns перечисляет ширины столбцов: здесь три столбца по 200 пикселей. Элементы сами заполняют ячейки слева направо и сверху вниз: 1, 2, 3 в первой строке, 4, 5, 6 — во второй. Строки создаются автоматически, сколько нужно, а их высота подстраивается под содержимое. gap — промежуток между ячейками, как во Flexbox.

Как и Flexbox, Grid задаётся родителю и действует на его прямых детей.

Единица fr

Пиксели делают сетку жёсткой. Единица fr (fraction — доля) делит свободное место:

CSS
.grid {
  display: grid;
  grid-template-columns: 1fr 1fr 1fr;
  gap: 16px;
}

Три равных столбца на всю ширину контейнера. 1fr 2fr — второй столбец вдвое шире первого. 250px 1fr — боковая колонка 250 пикселей, а всё остальное отдано второй колонке. gap вычитается заранее, поэтому ничего не вылезает за край.

контейнер 600px, gap: 16px 1fr 1fr 1fr 1fr 1fr 1fr 1fr 2fr 1fr 2fr — вдвое шире 250px 1fr 250px 1fr — остаток 334px
В контейнере 600px с gap 16px запись 1fr 1fr 1fr даёт три равных столбца, 1fr 2fr — второй вдвое шире первого, а 250px 1fr отдаёт второму столбцу остаток 334px.

Чтобы не писать одно и то же, есть repeat(): repeat(3, 1fr) — то же, что 1fr 1fr 1fr; repeat(4, 100px) — четыре столбца по 100 пикселей.

Элемент на несколько ячеек

Линии сетки пронумерованы с 1: у трёх столбцов четыре вертикальные линии. Элементу можно сказать, от какой линии до какой он тянется:

CSS
.wide {
  grid-column: 1 / 3;
}
.tall {
  grid-row: span 2;
}
.full {
  grid-column: 1 / -1;
}
линии 1 2 3 4 .wide grid-column: 1 / 3 .tall grid-row: span 2 .full grid-column: 1 / -1 с конца -1
У трёх столбцов четыре линии: .wide тянется от линии 1 до линии 3 через два столбца, .tall занимает две строки, а .full — от первой линии до последней, -1.

Раскладка страницы областями

Самый наглядный способ — нарисовать сетку словами. grid-template-areas описывает строки сетки, а каждое слово в строке — ячейку, занятую областью с этим именем:

HTML
<body class="layout">
  <header class="head">Шапка</header>
  <nav class="side">Меню</nav>
  <main class="main">Основной текст</main>
  <footer class="foot">Подвал</footer>
</body>
CSS
.layout {
  display: grid;
  grid-template-columns: 220px 1fr;
  grid-template-rows: auto 1fr auto;
  grid-template-areas:
    "head head"
    "side main"
    "foot foot";
  gap: 20px;
  min-height: 100vh;
  margin: 0;
}
.head { grid-area: head; }
.side { grid-area: side; }
.main { grid-area: main; }
.foot { grid-area: foot; }
grid-template-areas: " head head " " side main " " foot foot " auto 1fr auto head Шапка side Меню main Основной текст foot Подвал 220px 1fr
Строки grid-template-areas повторяют раскладку: head и foot записаны дважды и занимают оба столбца, side — столбец 220px, main — столбец 1fr.

Области должны быть прямоугольными: «буква Г» из одного имени не сработает, и браузер проигнорирует всю grid-template-areas.

Карточки без медиазапросов

Сетка может сама решать, сколько столбцов помещается, — без медиазапросов (отдельных правил для узких экранов, о них — в уроке Адаптивная вёрстка):

CSS
.cards {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
  gap: 20px;
}

На широком экране в ряд встанет несколько карточек, на телефоне — одна, и все они одной ширины, в том числе в последнем ряду. Вариант auto-fit отличается, когда карточек мало: auto-fill оставит пустые столбцы справа, а auto-fit растянет имеющиеся карточки на всю ширину.

Выравнивание в ячейках

Так центрируют и одиночный блок: у родителя display: grid; place-items: center; и высота.

Flexbox или Grid

Они отлично сочетаются: страница разложена Grid, а внутри шапки — Flexbox.

Частые ошибки

Коротко

Проверьте себя

1. Что задаёт grid-template-columns: 1fr 2fr;?
2. Как растянуть элемент на всю ширину сетки, сколько бы в ней ни было столбцов?
3. Чем удобна запись repeat(auto-fill, minmax(220px, 1fr))?
4. Что лучше подходит для ряда кнопок в одну линию, а что — для раскладки страницы на шапку, меню, текст и подвал?