CSS Grid Layout — это мощная двумерная система компоновки, которая навсегда изменила подход к созданию веб-интерфейсов. В отличие от Flexbox, который работает в одном измерении, Grid позволяет одновременно управлять строками и столбцами, создавая сложные, адаптивные макеты с минимальным кодом. Давайте разберемся, как это работает на практике.
Что такое CSS Grid и почему он незаменим?
Представьте себе настоящую сетку, как в графическом редакторе или на листе бумаги. Вы можете точно размещать элементы в ячейках, объединять их, создавать сложные структуры. Именно это и предлагает Grid. Он стал стандартом в 2017 году и поддерживается всеми современными браузерами.
Ключевое преимущество Grid — разделение структуры макета (задаваемой в контейнере) и позиционирования элементов (задаваемого в дочерних элементах). Это делает код чище и логичнее.
Базовый пример: создаем первую сетку
Для начала объявим контейнер сеткой:
.container {
display: grid;
grid-template-columns: 200px 1fr 300px; /* три колонки */
grid-template-rows: 100px auto 150px; /* три строки */
gap: 20px; /* отступы между ячейками */
}
Здесь мы создали макет из трех колонок (фиксированная, гибкая, фиксированная) и трех строк. Свойство gap заменило устаревшие grid-gap.
Размещение элементов в сетке
Элементы можно размещать по номерам линий или именованным областям:
.item-header {
grid-column: 1 / 4; /* от первой до четвертой линии колонки */
grid-row: 1; /* занимает первую строку */
}
.item-sidebar {
grid-column: 1;
grid-row: 2;
}
Практические примеры сеток
Пример 1: Классический макет сайта
Создадим стандартный макет: шапка, сайдбар, основной контент, футер.
.layout {
display: grid;
grid-template-areas:
"header header"
"sidebar content"
"footer footer";
grid-template-columns: 250px 1fr;
grid-template-rows: auto 1fr auto;
min-height: 100vh;
gap: 15px;
}
.header { grid-area: header; }
.sidebar { grid-area: sidebar; }
.content { grid-area: content; }
.footer { grid-area: footer; }
Использование grid-template-areas делает код визуально понятным. Вы буквально видите макет в CSS!
Пример 2: Адаптивная галерея изображений
Сетка идеально подходит для создания адаптивных галерей без медиа-запросов:
.gallery {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
gap: 10px;
}
Магия здесь в repeat(auto-fill, minmax(250px, 1fr)). Браузер автоматически разместит столько колонок шириной минимум 250px, сколько поместится в контейнере.
Пример 3: Сложное позиционирование
Grid позволяет легко создавать перекрывающиеся элементы:
.overlap-container {
display: grid;
}
.element1 {
grid-column: 1 / 3;
grid-row: 1;
z-index: 1;
}
.element2 {
grid-column: 2 / 4;
grid-row: 1;
opacity: 0.8;
}
Продвинутые техники
Выравнивание и распределение пространства
Используйте justify-content, align-content, justify-items и align-items для тонкого контроля:
justify-contentвыравнивает всю сетку по горизонталиalign-itemsвыравнивает элементы внутри своих ячеек по вертикалиplace-content— шорткат для обоих свойств
Неявная и явная сетка
Явная сетка задается через grid-template-*. Если элементов больше, чем явно заданных ячеек, Grid автоматически создает дополнительные строки/колонки — это неявная сетка. Ее размеры контролируются grid-auto-rows и grid-auto-columns.
.container {
grid-auto-rows: minmax(100px, auto); /* новые строки высотой минимум 100px */
}
Grid vs Flexbox: когда что использовать?
- Grid — для двумерных макетов (и строки, и колонки одновременно)
- Flexbox — для одномерных макетов (либо строка, либо колонка)
- Часто они отлично работают вместе: Grid для общего макета страницы, Flexbox для внутренних компонентов
Помните: Grid не заменяет Flexbox, а дополняет его. Используйте оба инструмента в зависимости от задачи.
FAQ: Часто задаваемые вопросы о CSS Grid
Поддерживается ли Grid во всех браузерах?
Да, все современные браузеры (Chrome, Firefox, Safari, Edge) полностью поддерживают CSS Grid с 2017 года. Для IE11 существует ограниченная поддержка с префиксом -ms-.
Нужно ли использовать Grid для всех макетов?
Нет. Для простых линейных макетов часто достаточно Flexbox. Grid идеален для сложных, двумерных структур.
Как сделать сетку адаптивной?
Используйте auto-fill/auto-fit с minmax(), именованные области с медиа-запросами или меняйте grid-template-columns на разных брейкпоинтах.
Можно ли анимировать Grid?
Да, можно анимировать свойства Grid, но не все. Лучше анимировать размеры элементов, а не структуру сетки, для плавности.
Сложно ли учить CSS Grid?
Базовые концепции осваиваются за несколько часов. Главное — практиковаться, создавая реальные макеты. Инструменты разработчика в браузерах отлично визуализируют сетку.