CSS Grid Layout: От основ до сложных примеров сетки для вашего сайта

CSS Grid Layout: От основ до сложных примеров сетки для вашего сайта

CSS Grid Layout — это революционная система компоновки, которая навсегда изменила подход к созданию веб-интерфейсов. В отличие от Flexbox, работающего в одном измерении, Grid позволяет строить сложные, адаптивные двумерные сетки с минимальным количеством кода. Давайте разберемся, как превратить хаотичные блоки в идеально структурированный макет.

Что такое CSS Grid и почему он незаменим?

Представьте себе тетрадь в клеточку. Grid — это цифровой аналог, где вы сами определяете количество строк и столбцов, их размеры и расположение элементов. Система стала стандартом в 2017 году и сегодня поддерживается всеми современными браузерами.

Ключевое отличие от Flexbox: Grid работает с двумя осями одновременно, что идеально для макетов всего сайта, тогда как Flexbox лучше подходит для выравнивания элементов внутри отдельных компонентов.

Базовый пример: создаем первую сетку

Для начала объявим контейнер сеткой:

.container {
  display: grid;
  grid-template-columns: 200px 1fr 300px; /* три колонки */
  grid-template-rows: 100px auto 150px; /* три строки */
  gap: 20px; /* отступы между ячейками */
}

Здесь мы создали макет из трех колонок (фиксированная, гибкая, фиксированная) и трех строк. Свойство gap заменило устаревшие grid-gap.

Расположение элементов

Дочерние элементы можно размещать явно:

.item {
  grid-column: 2 / 4; /* от второй до четвертой линии */
  grid-row: 1 / 3; /* от первой до третьей линии */
}

/* Или используем именованные области */
.container {
  grid-template-areas:
    "header header header"
    "sidebar content ads"
    "footer footer footer";
}
.header { grid-area: header; }

Продвинутые техники и практические примеры

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

Используйте repeat() и auto-fit:

.gallery {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
  gap: 15px;
}

Этот код создаст автоматическое количество колонок шириной минимум 250px, которые будут переноситься на новую строку при уменьшении экрана.

Функция minmax(250px, 1fr) означает: минимальная ширина 250px, максимальная — 1fr (доля свободного пространства). Это основа адаптивности.

Сложный макет сайта

Создадим типичный макет с заголовком, сайдбаром, основным контентом и подвалом:

.site-layout {
  display: grid;
  grid-template-columns: 1fr 3fr;
  grid-template-rows: auto 1fr auto;
  grid-template-areas:
    "header header"
    "sidebar main"
    "footer footer";
  min-height: 100vh;
}

@media (max-width: 768px) {
  .site-layout {
    grid-template-columns: 1fr;
    grid-template-areas:
      "header"
      "main"
      "sidebar"
      "footer";
  }
}

Работа с неявной сеткой

Когда элементов больше, чем явно заданных ячеек, Grid автоматически создает дополнительные строки или столбцы. Управлять их размером можно через:

  • grid-auto-rows: 100px; — все новые строки высотой 100px
  • grid-auto-flow: column; — автоматическое заполнение колонками вместо строк
  • grid-auto-columns: minmax(100px, auto);

Выравнивание и центрирование

Grid предоставляет мощные инструменты выравнивания:

  1. justify-items — выравнивание по горизонтали внутри ячейки
  2. align-items — выравнивание по вертикали внутри ячейки
  3. justify-content — выравнивание всей сетки по горизонтали
  4. align-content — выравнивание всей сетки по вертикали
.container {
  display: grid;
  justify-items: center; /* все элементы по центру ячеек */
  align-items: start; /* элементы у верхнего края */
}

Практические советы для начинающих

  • Начинайте с мобильной версии, используя одноколоночную сетку
  • Используйте fr единицы для гибких пропорций вместо процентов
  • Именуйте линии сетки для удобства: grid-template-columns: [start] 1fr [content-start] 2fr [content-end] 1fr [end];
  • Для отладки используйте инструменты разработчика браузера — там есть визуализатор сетки
  • Не бойтесь комбинировать Grid с Flexbox внутри ячеек

Часто задаваемые вопросы (FAQ)

В чем основное отличие Grid от Flexbox?

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

Нужны ли префиксы для поддержки старых браузеров?

Для IE10-11 потребуется префикс -ms-, но в 2024 году можно ориентироваться на современные браузеры. Используйте @supports (display: grid) для проверки поддержки.

Можно ли создавать асимметричные сетки?

Да, Grid отлично справляется с асимметричными макетами. Комбинируйте разные единицы измерения и используйте grid-template-areas для визуального проектирования.

Как сделать отступы между элементами?

Используйте свойство gap (ранее grid-gap). Для разных отступов по горизонтали и вертикали: gap: 20px 10px; (вертикальный горизонтальный).

Grid замещает все другие методы верстки?

Нет. Grid идеален для макета страницы, но для мелких компонентов часто удобнее Flexbox. Лучшая практика — комбинировать обе технологии.