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;— все новые строки высотой 100pxgrid-auto-flow: column;— автоматическое заполнение колонками вместо строкgrid-auto-columns: minmax(100px, auto);
Выравнивание и центрирование
Grid предоставляет мощные инструменты выравнивания:
justify-items— выравнивание по горизонтали внутри ячейкиalign-items— выравнивание по вертикали внутри ячейкиjustify-content— выравнивание всей сетки по горизонтали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. Лучшая практика — комбинировать обе технологии.