CSS Grid для новичков: как создать адаптивные макеты с нуля
#Веб-разработка #CSS и верстка #Фронтенд CSSДля кого эта статья:
- Начинающие веб-разработчики, изучающие HTML и CSS
- Опытные разработчики, желающие улучшить свои навыки вёрстки с помощью CSS Grid
- Дизайнеры и разработчики, интересующиеся адаптивной вёрсткой и современными методами создания макетов
Признайтесь, вы тоже утомились бороться с плавающими блоками и костылями из float? А может, только вчера познакомились с HTML/CSS и уже слышите отовсюду это загадочное "гридсетка"? CSS Grid — то самое решение, которое перевернуло вёрстку с ног на голову, позволив разработчикам создавать сложные макеты легко и интуитивно. Забудьте о бесконечных вложенных контейнерах и математических расчётах для построения колонок. Пришло время освоить технологию, которая делает адаптивные макеты доступными даже для тех, кто только вчера набрал свой первый тег. Готовы перейти на новый уровень вёрстки? 🚀
Что такое CSS Grid и почему он упрощает вёрстку сайтов
CSS Grid Layout (или просто Grid) — это двумерная система компоновки, специально созданная для решения сложных задач вёрстки. В отличие от одномерного Flexbox, который отлично работает с элементами в одном направлении (либо строки, либо колонки), Grid позволяет контролировать элементы одновременно в обоих направлениях — и по горизонтали, и по вертикали.
Представьте электронную таблицу — именно так работает Grid. Вы определяете строки и столбцы, а затем размещаете элементы в этой сетке, указывая их положение и размер. Это кардинально отличается от традиционных подходов к вёрстке.
Антон Васильев, ведущий frontend-разработчик
Помню свой первый крупный проект — корпоративный портал с десятками страниц разных шаблонов. Я использовал Bootstrap и float-ы, превращая каждую страницу в настоящий кошмар из классов и вложенных дивов.
Когда клиент попросил переделать всё под мобильные устройства, я провёл неделю в аду, переписывая медиазапросы и фиксируя баги.
Через полгода мне поручили аналогичный проект, но к тому времени я уже освоил CSS Grid. Задача, на которую раньше уходили недели, была решена за три дня. Самое удивительное — код стал чище примерно в 4 раза, а адаптивность работала практически из коробки. Клиент даже не поверил, что проект сдан в срок и без единой ошибки.
Почему же Grid произвёл революцию в мире вёрстки? Давайте сравним Grid с традиционными подходами:
| Метод вёрстки | Преимущества | Недостатки |
|---|---|---|
| Float-вёрстка | Широкая поддержка браузерами | Сложная адаптивность, проблема clearfix, невозможность вертикального выравнивания |
| Flexbox | Отличное выравнивание по одной оси, простота использования | Ограничения при работе с двумерными макетами |
| CSS Grid | Двумерное позиционирование, явное управление строками и столбцами, встроенная адаптивность | Немного более сложная кривая обучения, чем у Flexbox |
CSS Grid решает множество проблем, с которыми веб-разработчики боролись годами:
- Вертикальное центрирование элементов больше не вызывает головную боль
- Создание макетов с пересекающимися элементами стало простым
- Контроль над порядком элементов в разных точках адаптации без изменения HTML
- Минимальное количество вложенных контейнеров и дополнительных классов
- Возможность создавать асимметричные макеты без костылей
Grid поддерживается всеми современными браузерами, что делает его безопасным выбором для новых проектов. Теперь разработчики могут сосредоточиться на творческой стороне вёрстки, а не на преодолении технических ограничений.

Базовые элементы CSS Grid: контейнеры, ячейки и линии сетки
Чтобы эффективно использовать CSS Grid, необходимо освоить его базовую терминологию и понять структуру. Система сетки состоит из нескольких ключевых компонентов, которые работают вместе для создания макета.
Основная терминология CSS Grid:
- Grid-контейнер — элемент, к которому применяется свойство
display: grid. Он становится родителем для всех дочерних элементов сетки. - Grid-элемент — прямой потомок grid-контейнера, который позиционируется согласно правилам сетки.
- Grid-линии — горизонтальные и вертикальные линии, которые формируют структуру сетки и используются для позиционирования элементов.
- Grid-ячейка — наименьший блок в сетке, образованный пересечением строки и столбца.
- Grid-область — прямоугольная область, состоящая из одной или нескольких ячеек сетки.
- Grid-дорожка — пространство между двумя параллельными линиями сетки (строка или столбец).
Визуальное представление компонентов сетки имеет решающее значение для понимания. Давайте рассмотрим их на примере простой структуры:
.grid-container {
display: grid;
grid-template-columns: 100px 200px 100px;
grid-template-rows: 50px 150px;
gap: 10px;
}
В этом примере мы создали сетку с тремя колонками и двумя строками. Важно заметить, что линий сетки будет всегда на одну больше, чем количество дорожек. То есть, для трёх колонок у нас будет четыре вертикальных линии, а для двух строк — три горизонтальных.
Каждая линия в сетке имеет номер, начиная с 1. Нумерация идёт слева направо для вертикальных линий и сверху вниз для горизонтальных. Это критически важно для позиционирования элементов.
Марина Королёва, frontend-наставник
Я часто наблюдаю, как новички пытаются освоить Grid, но спотыкаются на базовых концепциях. Одна из моих студенток никак не могла понять, почему её элементы располагаются не там, где она ожидала. Оказалось, она путала номера линий и ячеек.
Мы нарисовали сетку на бумаге и пронумеровали все линии. Затем закрасили разные области, определяя их через начальные и конечные линии. Этот простой визуальный приём сработал лучше часов теории. Теперь я всегда рекомендую новичкам сначала нарисовать сетку с пронумерованными линиями, прежде чем писать код.
Когда студентка вернулась к своему проекту, она не только исправила ошибки, но и смогла реализовать гораздо более сложный макет, чем планировала изначально. Понимание базовых принципов — ключ к мастерству.
Для более наглядного представления о том, как работают линии и области в Grid, взгляните на эту сравнительную таблицу:
| Термин | Как обозначается в коде | Пример использования |
|---|---|---|
| Grid-линия | Числом или именем | grid-column-start: 2; |
| Grid-ячейка | Неявно через линии | grid-column: 1 / 2; grid-row: 2 / 3; |
| Grid-область | Именем или через линии | grid-area: header; или grid-area: 1 / 1 / 2 / 4; |
| Grid-дорожка | В template-свойствах | grid-template-columns: 1fr 2fr; |
Понимание этих базовых элементов — ключ к успешному использованию CSS Grid. Они формируют фундамент, на котором строятся все остальные техники и приёмы работы с сеткой. 📏
Создаём первую Grid-сетку: синтаксис и основные свойства
Приступим к практике и создадим нашу первую Grid-сетку. Процесс создания можно разделить на два основных шага: определение Grid-контейнера и настройка сетки с помощью основных свойств.
Шаг 1: Объявление Grid-контейнера
.container {
display: grid; /* или display: inline-grid для строчных сеток */
}
Это базовое объявление превращает элемент в Grid-контейнер, а все его прямые потомки автоматически становятся Grid-элементами. Однако на этом этапе наша сетка ещё не имеет определённой структуры — элементы будут размещены в одну колонку.
Шаг 2: Определение структуры сетки
.container {
display: grid;
grid-template-columns: 200px 1fr 2fr;
grid-template-rows: 100px auto 150px;
gap: 20px;
}
В этом примере мы создали сетку с тремя колонками и тремя строками. Обратите внимание на единицу измерения fr (фракция) — это специальная единица для Grid, которая распределяет доступное пространство пропорционально. В нашем примере вторая колонка получит 1 часть оставшегося пространства, а третья — 2 части.
Основные свойства для настройки Grid-сетки:
- grid-template-columns — определяет количество и размер колонок
- grid-template-rows — определяет количество и размер строк
- gap (или column-gap и row-gap) — задаёт расстояние между элементами сетки
- grid-template-areas — позволяет создавать именованные области сетки
- grid-auto-columns и grid-auto-rows — определяют размеры для автоматически генерируемых строк и столбцов
- grid-auto-flow — управляет алгоритмом автоматического размещения элементов
Для более гибких макетов CSS Grid предлагает несколько мощных функций:
.container {
display: grid;
/* Повторение одинаковых значений */
grid-template-columns: repeat(3, 1fr);
/* Автоматическое заполнение с минимальным и максимальным размером */
grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
/* Определение именованных линий */
grid-template-columns: [start] 1fr [content-start] 2fr [content-end] 1fr [end];
}
Функция repeat() значительно упрощает код, особенно при работе с большим количеством одинаковых колонок или строк. А minmax() позволяет задать минимальный и максимальный размеры элемента, что критически важно для создания адаптивных макетов.
Для размещения элементов внутри сетки используются следующие свойства:
.item {
/* Размещение относительно линий сетки */
grid-column-start: 1;
grid-column-end: 3; /* или grid-column: 1 / 3; */
grid-row-start: 2;
grid-row-end: 4; /* или grid-row: 2 / 4; */
/* Или ещё короче */
grid-area: 2 / 1 / 4 / 3;
}
Эти свойства определяют, какие линии сетки будут границами для элемента. Также можно использовать ключевое слово span, чтобы указать, сколько ячеек должен занимать элемент:
.item {
grid-column: 1 / span 2; /* Начиная с линии 1, занять 2 колонки */
grid-row: 2 / span 2; /* Начиная со строки 2, занять 2 строки */
}
Для управления выравниванием элементов внутри ячеек сетки используются свойства выравнивания, знакомые по Flexbox:
.container {
/* Выравнивание всех элементов в контейнере */
justify-items: center; /* по горизонтали */
align-items: center; /* по вертикали */
}
.item {
/* Выравнивание конкретного элемента */
justify-self: end;
align-self: start;
}
Создание базовой сетки — это только начало. CSS Grid предлагает множество возможностей для тонкой настройки макетов, которые мы будем исследовать в следующих разделах. 🔧
Адаптивность в CSS Grid: медиазапросы и автоматическое размещение
Адаптивность — ключевое требование к современным веб-интерфейсам. CSS Grid предлагает мощные инструменты для создания по-настоящему гибких макетов, которые элегантно подстраиваются под различные размеры экрана.
Существует два основных подхода к созданию адаптивных Grid-макетов:
- Использование медиазапросов для полного изменения структуры сетки при разных разрешениях
- Применение внутренних возможностей Grid для автоматической адаптации без медиазапросов
Начнём с рассмотрения традиционного подхода с медиазапросами:
.container {
display: grid;
/* Базовый макет для мобильных устройств */
grid-template-columns: 1fr;
grid-template-areas:
"header"
"nav"
"main"
"sidebar"
"footer";
}
@media (min-width: 768px) {
.container {
/* Макет для планшетов */
grid-template-columns: 200px 1fr;
grid-template-areas:
"header header"
"nav main"
"sidebar main"
"footer footer";
}
}
@media (min-width: 1200px) {
.container {
/* Макет для десктопов */
grid-template-columns: 200px 1fr 300px;
grid-template-areas:
"header header header"
"nav main sidebar"
"footer footer footer";
}
}
В этом примере мы используем grid-template-areas для определения макета на разных устройствах. HTML-структура при этом остаётся неизменной — мы просто перераспределяем элементы в сетке. Это значительное преимущество Grid перед традиционными подходами, где часто требовалось менять порядок элементов в HTML.
Теперь рассмотрим инструменты CSS Grid, которые позволяют создавать адаптивные макеты с минимальным использованием медиазапросов или вовсе без них:
- Функция minmax() — устанавливает минимальный и максимальный размеры для элементов сетки
- Функция auto-fit/auto-fill — автоматически определяет количество колонок в зависимости от доступного пространства
- Единица fr — обеспечивает пропорциональное распределение пространства
Пример адаптивной сетки без медиазапросов:
.container {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
gap: 20px;
}
Этот короткий код создаёт сетку, которая автоматически определяет количество колонок в зависимости от ширины контейнера. Каждая колонка имеет минимальную ширину 300px, а при наличии свободного пространства они равномерно расширяются.
Разница между auto-fill и auto-fit:
| Функция | Поведение | Лучше использовать для |
|---|---|---|
auto-fill | Вставляет максимально возможное количество колонок, даже пустые | Когда важно сохранить точный размер элементов |
auto-fit | Схлопывает пустые колонки и растягивает существующие элементы | Когда важно использовать всё доступное пространство |
Для более сложных адаптивных макетов можно комбинировать внутренние возможности Grid с медиазапросами:
.gallery {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
gap: 20px;
}
@media (min-width: 768px) {
.gallery {
grid-auto-flow: dense; /* Для более плотной упаковки элементов */
}
.gallery-item:nth-child(3n) {
grid-column: span 2; /* Каждый третий элемент занимает 2 колонки */
grid-row: span 2; /* И 2 строки */
}
}
Grid также позволяет создавать сложные адаптивные макеты с перекрытиями и нестандартным позиционированием:
.dashboard {
display: grid;
grid-template-columns: repeat(4, 1fr);
grid-template-rows: repeat(3, minmax(150px, auto));
gap: 15px;
}
.main-widget {
grid-area: 1 / 1 / 3 / 3; /* Большой виджет в верхнем левом углу */
}
@media (max-width: 768px) {
.dashboard {
grid-template-columns: repeat(2, 1fr);
}
.main-widget {
grid-area: 1 / 1 / 2 / 3; /* Изменение размера на мобильных */
}
}
@media (max-width: 480px) {
.dashboard {
grid-template-columns: 1fr;
}
.main-widget {
grid-area: auto; /* Сбрасываем позиционирование, возвращаясь к потоку */
}
}
Важно помнить, что создание по-настоящему адаптивных макетов требует тщательного тестирования на различных устройствах. CSS Grid предоставляет инструменты, но ответственность за проектирование удобного пользовательского опыта остаётся за разработчиком. 📱💻
От теории к практике: собираем макет сайта с помощью Grid
Теория хороша, но именно практические примеры помогают закрепить знания. Давайте создадим полноценный адаптивный макет сайта с использованием CSS Grid. Наша цель — стандартный макет с шапкой, основным контентом, боковой панелью и подвалом, который будет адаптироваться под разные устройства.
Начнём с базовой HTML-структуры:
<div class="site-container">
<header class="header">Шапка сайта</header>
<nav class="main-nav">Главное меню</nav>
<main class="content">Основной контент</main>
<aside class="sidebar">Боковая панель</aside>
<footer class="footer">Подвал сайта</footer>
</div>
Теперь определим базовую CSS Grid-структуру:
.site-container {
display: grid;
grid-template-areas:
"header header header"
"nav content sidebar"
"footer footer footer";
grid-template-columns: 200px 1fr 250px;
grid-template-rows: auto 1fr auto;
min-height: 100vh;
gap: 20px;
padding: 20px;
}
.header { grid-area: header; }
.main-nav { grid-area: nav; }
.content { grid-area: content; }
.sidebar { grid-area: sidebar; }
.footer { grid-area: footer; }
/* Базовая стилизация для наглядности */
.site-container > * {
padding: 20px;
background-color: #f5f5f5;
border-radius: 4px;
}
Теперь добавим адаптивность через медиазапросы:
/* Планшеты */
@media (max-width: 992px) {
.site-container {
grid-template-areas:
"header header"
"nav content"
"sidebar sidebar"
"footer footer";
grid-template-columns: 200px 1fr;
}
}
/* Мобильные устройства */
@media (max-width: 768px) {
.site-container {
grid-template-areas:
"header"
"nav"
"content"
"sidebar"
"footer";
grid-template-columns: 1fr;
}
}
Уже сейчас мы получили адаптивный макет, который перестраивается в зависимости от размера экрана. Но давайте пойдём дальше и добавим вложенную сетку для контента:
/* Обновляем HTML для секции контента */
<main class="content">
<article class="post">Статья 1</article>
<article class="post featured">Статья 2 (главная)</article>
<article class="post">Статья 3</article>
<article class="post">Статья 4</article>
<article class="post">Статья 5</article>
</main>
/* Добавляем вложенную сетку для контента */
.content {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
gap: 20px;
}
.post {
padding: 20px;
background: white;
border-radius: 4px;
box-shadow: 0 2px 4px rgba(0,0,0,0.1);
}
.featured {
grid-column: span 2;
grid-row: span 2;
background: #fffbe5;
}
@media (max-width: 768px) {
.featured {
grid-column: auto;
grid-row: auto;
}
}
Теперь у нас есть основной макет сайта с адаптивной сеткой статей внутри контентной области. Обратите внимание, как легко мы выделили главную статью, заставив её занимать больше места в сетке.
Для более сложных макетов можно добавить ещё один уровень вложенности. Например, создадим сетку внутри шапки сайта для размещения логотипа, навигации и поискового поля:
/* Обновляем HTML для шапки */
<header class="header">
<div class="logo">Логотип</div>
<nav class="top-nav">Верхнее меню</nav>
<div class="search">Поиск</div>
</header>
/* Добавляем сетку для шапки */
.header {
display: grid;
grid-template-columns: auto 1fr auto;
align-items: center;
gap: 20px;
}
@media (max-width: 768px) {
.header {
grid-template-columns: 1fr;
grid-template-rows: auto auto auto;
text-align: center;
}
}
Что делает CSS Grid особенно мощным, так это возможность создавать сложные асимметричные макеты. Например, добавим в нашу сетку контента статью, которая будет занимать всю ширину:
<article class="post full-width">Статья на всю ширину</article>
/* CSS для статьи на всю ширину */
.full-width {
grid-column: 1 / -1; /* От первой до последней линии */
background: #e6f7ff;
}
Один из самых впечатляющих аспектов CSS Grid — это возможность создавать нестандартные макеты, которые раньше требовали сложной реализации. Например, шахматный порядок элементов:
.chess-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
gap: 20px;
}
.chess-grid > div:nth-child(odd) {
background: #f0f0f0;
padding-top: 100%; /* Создаёт квадрат */
}
.chess-grid > div:nth-child(even) {
background: #e0e0e0;
padding-top: 100%;
}
@media (max-width: 768px) {
.chess-grid {
grid-template-columns: repeat(2, 1fr);
}
}
Возможности CSS Grid поистине безграничны. Освоив базовые концепции и практики, вы сможете создавать макеты любой сложности, не ограничивая свой дизайнерский потенциал техническими ограничениями. 🎨
CSS Grid — это не просто еще одна технология вёрстки, а настоящий прорыв в том, как мы создаем веб-интерфейсы. Он сочетает простоту применения с невероятной мощностью и гибкостью. С Grid вы можете сосредоточиться на творческой стороне разработки, а не на преодолении ограничений инструментов. Отказываясь от изучения Grid, вы не просто упускаете возможность писать более чистый и понятный код — вы лишаете себя возможности мыслить о дизайне по-новому. Так что берите приведенные примеры, экспериментируйте, адаптируйте их под свои проекты, и вы удивитесь, насколько проще и приятнее станет процесс создания адаптивных макетов.
Владимир Лисицын
разработчик фронтенда