🔒 Ты не вошёл(вошла) в аккаунт — прогресс, работы и результаты теста не сохраняются. Что недоступно?

✅ Без входа можно

  • читать все 33 занятия, смотреть слайды и шпаргалку;
  • пробовать код в редакторе и песочнице.

⛔ Без входа нельзя

  • сохранять работы — черновик живёт только в этом браузере и пропадёт при очистке истории, в режиме инкогнито или на другом устройстве;
  • отмечать пройденные занятия и видеть свой прогресс;
  • выбрать тему итогового проекта и отмечать чек-лист;
  • отправить итоговый тест и сохранить результат.
Модуль 2. CSS и оформление Занятие 21

CSS Grid

Сегодня мы соберём ровную галерею работ в виде сетки, как в фотоальбоме.

Изучаем: display: grid, колонки, строки, gap
Результат: Галерея работ

🎬 Слайды для урока Листай стрелками ← →, F — весь экран, N — подсказки

👀 Сегодня сделаем вот такое

Показать код примера
<h1>Галерея работ</h1>
<div class="gallery">
  <img class="big" src="/images/mountain.svg" alt="Горы">
  <img src="/images/cat.svg" alt="Кот">
  <img src="/images/dog.svg" alt="Собака">
  <img src="/images/rocket.svg" alt="Ракета">
  <img src="/images/cat.svg" alt="Кот ещё раз">
  <img src="/images/dog.svg" alt="Собака ещё раз">
</div>
body {
  font-family: sans-serif;
  padding: 16px;
}
.gallery {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 12px;
}
.gallery img {
  width: 100%;
  height: 100%;
  aspect-ratio: 1;
  object-fit: cover;
  border-radius: 12px;
  background: #dfe6e9;
}
.big {
  grid-column: span 2;
  grid-row: span 2;
}

💡 Объяснение

Сетка — как тетрадь в клетку

Flexbox отлично раскладывает элементы в одну линию (ряд или колонку). А когда нужно сразу и строки, и столбцы — галерея фотографий, плитка карточек, раскладка всей страницы — удобнее CSS Grid. Grid делит контейнер на клетки, как тетрадь или шахматную доску, и расставляет элементы по ним.

Включаем сетку

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

Как и во Flexbox, свойства пишем родителю, а его прямые дети автоматически раскладываются по клеткам: слева направо, а когда ряд заполнен — на следующую строку.

Колонки: grid-template-columns

Сколько значений — столько колонок. Каждое значение — ширина колонки:

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

Чтобы не повторять одно и то же, есть repeat: repeat(4, 1fr) = 1fr 1fr 1fr 1fr.

Строки и промежутки

  • grid-template-rows — высоты строк (часто не нужно: строки создаются сами по содержимому);
  • gap: 16px; — промежутки между клетками по обеим осям; gap: 20px 10px; — между строками 20, между колонками 10.

Большой элемент на несколько клеток

.big {
  grid-column: span 2;   /* занять 2 колонки */
  grid-row: span 2;      /* и 2 строки */
}

Так в галерее делают одну «главную» фотографию крупнее остальных. Остальные элементы сами обтекают её и занимают свободные клетки.

Адаптивная сетка без медиазапросов

grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));

Это «волшебная формула»: «сделай столько колонок, сколько влезет, но каждая не уже 150px, а остаток места раздели поровну». На широком экране будет 6 колонок, на планшете 4, на телефоне 2 — и ни строчки дополнительного кода. minmax(a, b) означает «не меньше a и не больше b».

Одинаковые картинки в галерее

Фотографии бывают разных пропорций, и сетка получается неровной. Решение:

.gallery img {
  width: 100%;
  aspect-ratio: 1;       /* квадрат (1:1). Для 4:3 — 4 / 3 */
  object-fit: cover;     /* заполнить клетку, лишнее обрезать */
  border-radius: 12px;
}

object-fit: cover работает для картинок так же, как background-size: cover для фона: картинка не растягивается и не сплющивается, а аккуратно обрезается.

Раскладка страницы: grid-template-areas

Grid умеет рисовать раскладку «картинкой» из названий областей:

.page {
  display: grid;
  grid-template-columns: 200px 1fr;
  grid-template-areas:
    "header header"
    "menu   content"
    "footer footer";
}
header { grid-area: header; }
nav    { grid-area: menu; }
main   { grid-area: content; }
footer { grid-area: footer; }

Каждая строка в кавычках — строка сетки, каждое слово — клетка. Одинаковые слова рядом объединяются в одну область.

Flexbox или Grid?

  • Flexbox — одно направление: меню, ряд кнопок, шапка, элементы внутри карточки.
  • Grid — два направления: галерея, плитка карточек, раскладка страницы.

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

Потренируйся

Игра Grid Garden (cssgridgarden.com, есть русский язык): поливай морковку, управляя свойствами Grid.

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

  • display: grid без grid-template-columns — все элементы в одну колонку, «ничего не изменилось».
  • Картинки разной высоты — нет aspect-ratio и object-fit.
  • Колонки в px на всю ширину — на телефоне сетка вылезает за экран. Используй fr и minmax.
  • Опечатка в названии области в grid-template-areas.

Проверь себя

  1. Что означает 1fr?
  2. Как сделать, чтобы элемент занимал две колонки?
  3. Когда лучше Flexbox, а когда Grid?

⌨️ Практика

  1. Сделай галерею из 6 картинок в 3 колонки.
  2. Добавь промежутки gap и скругли углы картинкам.
  3. Сделай первую картинку большой — на 2 колонки и 2 строки.
  4. Замени колонки на repeat(auto-fill, minmax(150px, 1fr)) и сузь окно.

🧪 Редактор

🪞 Рефлексия

  • Что нового я сегодня узнал(а)?
  • Что получилось лучше всего?
  • Где было трудно и что поможет в следующий раз?

🔒 Отметить занятие пройденным можно только после входа. Без аккаунта сайт не запомнит, до какого занятия ты дошёл(дошла). Регистрация · Вход