CSS Grid для новичков: пошаговое создание адаптивных сеток
Перейти

CSS Grid для новичков: пошаговое создание адаптивных сеток

#Веб-разработка  #CSS и верстка  #Фронтенд CSS  
Пройдите тест, узнайте какой профессии подходите
Сколько вам лет
0%
До 18
От 18 до 24
От 25 до 34
От 35 до 44
От 45 до 49
От 50 до 54
Больше 55

Для кого эта статья:

  • Веб-разработчики, желающие улучшить свои навыки верстки
  • Дизайнеры UX/UI, стремящиеся понять адаптивные макеты
  • Студенты или новички в области веб-разработки, изучающие CSS Grid

Если вы когда-нибудь пытались выровнять элементы на веб-странице и в итоге получали хаос из плавающих блоков и отступов — добро пожаловать в клуб! 🤦‍♂️ CSS Grid — настоящий спаситель, превращающий этот хаос в управляемые двумерные структуры. Представьте: вы создаёте сложный адаптивный макет в несколько строк кода вместо десятков костылей из флоатов и позиционирования. Технология, способная сделать вёрстку не только более логичной и предсказуемой, но и по-настоящему гибкой на всех устройствах. Погружаемся в мир CSS Grid, где сложные макеты становятся простыми, а невозможное — возможным.

Основы CSS Grid: как работает сетка и её ключевые свойства

CSS Grid Layout — это двухмерная система компоновки, специально разработанная для решения сложных задач макетирования. В отличие от flexbox, который контролирует элементы только в одном измерении (по строке или столбцу), Grid позволяет точно контролировать как столбцы, так и строки одновременно. 🧩

Работа с Grid начинается с простой конструкции: родительский элемент с display: grid становится контейнером, а все его прямые потомки автоматически становятся элементами сетки. Вот базовая структура:

.container {
display: grid;
grid-template-columns: 200px 1fr 200px;
grid-template-rows: auto 1fr auto;
gap: 10px;
}

Ключевые свойства CSS Grid можно разделить на две основные категории: свойства контейнера и свойства элементов. Понимание этих свойств — фундамент для создания любых сеточных структур.

Свойства контейнера Описание
display: grid Создает контейнер сетки
grid-template-columns Определяет размер и количество столбцов
grid-template-rows Определяет размер и количество строк
gap Устанавливает отступы между элементами
grid-template-areas Создает именованные области в сетке

Для элементов сетки применяются другие свойства, позволяющие точно указать их местоположение и размер:

  • grid-column — позиционирует элемент по столбцам (начальная/конечная линия)
  • grid-row — позиционирует элемент по строкам (начальная/конечная линия)
  • grid-area — позволяет задать положение элемента, используя именованную область

Важно понимать, что Grid работает с концепцией линий сетки. Каждая сетка имеет нумерованные линии, начинающиеся с 1. Для сетки с тремя столбцами будет четыре линии столбцов (с 1 по 4). Это ключевой момент при позиционировании элементов:

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

Алексей Петров, фронтенд-разработчик Помню свой первый проект с адаптивной версткой — настоящий кошмар из медиа-запросов и условных стилей. На мобильной версии всё постоянно ломалось. Решил переписать вёрстку через CSS Grid и был ошеломлён простотой решения. Макет, который требовал 200+ строк кода, уместился в 50. Самым сложным оказалось переучиться мыслить сеткой, а не отдельными блоками. Когда я наконец понял, что Grid позволяет планировать макет целиком, а не собирать его по частям, эффективность моей работы выросла в разы.

Одно из величайших преимуществ Grid — это возможность создавать асимметричные макеты с минимальным количеством кода. Вы можете легко создавать элементы, которые занимают несколько строк или столбцов, без сложных обходных путей.

Пошаговый план для смены профессии

Настраиваем первую Grid-сетку: базовая разметка страницы

Давайте создадим простой, но функциональный макет страницы с шапкой, сайдбаром, основным контентом и подвалом. Это классическая структура, которую можно встретить на большинстве сайтов. 🏗️

Начнем с базовой HTML-структуры:

<div class="grid-container">
<header>Шапка сайта</header>
<aside>Боковая панель</aside>
<main>Основной контент</main>
<footer>Подвал сайта</footer>
</div>

Теперь добавим CSS для создания базовой сетки. Сначала определим контейнер сетки и зададим базовую структуру:

.grid-container {
display: grid;
grid-template-columns: 250px 1fr;
grid-template-rows: auto 1fr auto;
min-height: 100vh; /* Занимает всю высоту viewport */
gap: 20px;
}

Обратите внимание на 1fr — это гибкая единица, которая распределяет доступное пространство. В данном случае у нас будет один фиксированный столбец (250px) и один гибкий, занимающий оставшееся пространство.

Теперь разместим наши элементы в сетке:

header {
grid-column: 1 / -1; /* От первой до последней линии */
background-color: #4CAF50;
padding: 20px;
}

aside {
grid-column: 1 / 2;
grid-row: 2 / 3;
background-color: #FFC107;
padding: 20px;
}

main {
grid-column: 2 / 3;
grid-row: 2 / 3;
background-color: #03A9F4;
padding: 20px;
}

footer {
grid-column: 1 / -1; /* От первой до последней линии */
background-color: #9C27B0;
padding: 20px;
}

Обратите внимание на несколько ключевых моментов:

  • Шапка и подвал растягиваются на всю ширину с помощью grid-column: 1 / -1, где -1 указывает на последнюю линию сетки.
  • Боковая панель и основной контент находятся во второй строке, но занимают разные столбцы.
  • Мы используем min-height: 100vh для контейнера, чтобы наша сетка занимала как минимум всю высоту экрана.

Важное преимущество этого подхода в том, что даже если один из разделов будет иметь больший объем контента, высота соседних секций автоматически адаптируется благодаря гибким строкам. Вы получаете равные по высоте колонки без дополнительных манипуляций.

Для улучшения восприятия, давайте добавим небольшие визуальные улучшения и базовую адаптивность:

* {
margin: 0;
padding: 0;
box-sizing: border-box;
}

body {
font-family: Arial, sans-serif;
color: white;
line-height: 1.6;
}

@media (max-width: 768px) {
.grid-container {
grid-template-columns: 1fr; /* На мобильных – одна колонка */
}

aside {
grid-column: 1;
grid-row: auto;
}

main {
grid-column: 1;
grid-row: auto;
}
}

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

Создаём адаптивные области: техника grid-template-areas

Grid-template-areas — одна из самых интуитивных и наглядных техник CSS Grid, позволяющая буквально нарисовать макет страницы текстом. Вместо работы с числовыми индексами линий, мы можем присвоить областям сетки имена и затем визуально расположить их, создав "карту" макета. 🗺️

Рассмотрим нашу предыдущую структуру сайта, но теперь применим технику grid-template-areas:

.grid-container {
display: grid;
grid-template-columns: 250px 1fr;
grid-template-rows: auto 1fr auto;
min-height: 100vh;
gap: 20px;

grid-template-areas:
"header header"
"sidebar content"
"footer footer";
}

header { grid-area: header; }
aside { grid-area: sidebar; }
main { grid-area: content; }
footer { grid-area: footer; }

Это уже выглядит намного понятнее! Мы просто назначаем каждому элементу именованную область с помощью свойства grid-area, а затем визуально располагаем эти области в свойстве grid-template-areas контейнера.

Каждая строка в grid-template-areas представляет строку в нашей сетке, а каждое имя внутри кавычек — столбец. В данном примере:

  • Шапка (header) занимает оба столбца в первой строке
  • Боковая панель (sidebar) занимает первый столбец во второй строке
  • Основное содержимое (content) занимает второй столбец во второй строке
  • Подвал (footer) занимает оба столбца в третьей строке

Теперь адаптируем наш макет для мобильных устройств, используя медиа-запрос:

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

Заметьте, как легко мы изменили весь макет! Теперь на мобильных устройствах боковая панель будет располагаться после основного контента, а не перед ним. Это отличный пример того, как grid-template-areas позволяет полностью перекомпоновать макет для различных устройств.

Мария Соколова, UX/UI дизайнер Разрабатывала дизайн для новостного портала с десятком различных блоков. Когда дело дошло до адаптации под планшеты и телефоны, я поняла, что нужно менять последовательность элементов. Верстальщик долго сопротивлялся, говоря о сложности такой задачи — пока не показала ему grid-template-areas. Он не верил своим глазам: «Вы хотите сказать, мне просто нужно поменять местами имена в этой текстовой сетке?». Именно! На следующий день макет был полностью адаптирован под три разных разрешения. Теперь в каждый проект я включаю схему grid-областей прямо в макете, чтобы разработчики сразу видели, как должны расположиться блоки.

Особое преимущество grid-template-areas проявляется при создании сложных макетов с нестандартными размещениями элементов. Например, добавим в наш макет баннер между контентом и подвалом:

<div class="grid-container">
<header>Шапка сайта</header>
<aside>Боковая панель</aside>
<main>Основной контент</main>
<div class="banner">Баннер на всю ширину</div>
<footer>Подвал сайта</footer>
</div>

/* CSS */
.grid-container {
grid-template-areas:
"header header"
"sidebar content"
"banner banner"
"footer footer";
}

.banner { 
grid-area: banner;
background-color: #FF5722;
padding: 20px;
}

Вы также можете оставлять пустые ячейки, используя символ точки "." в grid-template-areas:

.grid-container {
grid-template-areas:
"header header header"
"sidebar content ."
"footer footer footer";
}

В этом примере у нас есть пустая ячейка в правом верхнем углу второй строки. Такой подход позволяет создавать асимметричные макеты с пустыми пространствами, что часто требуется в современном дизайне.

Управление размерами: fr, auto и минимаксные функции

Мощь CSS Grid в значительной степени заключается в гибкости управления размерами элементов сетки. Давайте углубимся в различные единицы измерения и функции, которые делают CSS Grid таким мощным инструментом. 📏

Единица fr — дробное распределение

Единица fr (fraction) — это специальная единица измерения в CSS Grid, которая распределяет доступное пространство. Она действует как гибкая часть свободного пространства:

.grid-container {
display: grid;
grid-template-columns: 1fr 2fr 1fr;
}

В этом примере общее пространство делится на 4 части (1+2+1), где средний столбец занимает 2/4 или 50% доступного пространства, а крайние столбцы — по 1/4 или 25% каждый.

auto — автоматическое определение размера

Значение auto позволяет элементу принимать размер, основанный на его содержимом:

.grid-container {
display: grid;
grid-template-columns: auto 1fr;
}

Здесь первый столбец займёт столько места, сколько требуется для его содержимого, а второй столбец заполнит всё оставшееся пространство.

minmax() — установка минимальных и максимальных границ

Функция minmax() позволяет задать минимальное и максимальное значение для размера:

.grid-container {
display: grid;
grid-template-columns: minmax(200px, 300px) 1fr minmax(100px, auto);
}

В этом примере:

  • Первый столбец будет иметь минимальную ширину 200px и максимальную 300px.
  • Второй столбец будет занимать всё доступное пространство.
  • Третий столбец будет минимум 100px, но может расширяться в зависимости от содержимого (до auto).

Сравним популярные методы управления размерами в CSS Grid и их типичное применение:

Метод Применение Преимущества Ограничения
fr единицы Гибкие колонки с пропорциональным делением Простое создание пропорциональных макетов Не учитывает содержимое элементов
auto Размер в зависимости от контента Адаптация к размеру контента Может создавать неравномерные колонки
minmax() Адаптивные колонки с ограничениями Контроль над минимальным и максимальным размерами Более сложный синтаксис
repeat() Создание повторяющихся шаблонов Упрощение кода при многих одинаковых колонках Не всегда интуитивно понятно для новичков

repeat() — функция повторения

Функция repeat() позволяет создать повторяющийся шаблон столбцов или строк:

.grid-container {
display: grid;
grid-template-columns: repeat(3, 1fr);
/* Эквивалентно: grid-template-columns: 1fr 1fr 1fr; */
}

Особенно мощной является комбинация repeat() с minmax() и автозаполнением:

.gallery {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
gap: 20px;
}

Этот код создает адаптивную галерею изображений, где:

  • auto-fill автоматически определяет, сколько столбцов можно разместить.
  • Каждый столбец имеет минимальную ширину 200px.
  • Если есть дополнительное пространство, столбцы равномерно распределяют его между собой (1fr).

Разница между auto-fill и auto-fit тонкая, но важная:

  • auto-fill создает как можно больше треков, даже если они пустые.
  • auto-fit расширяет существующие треки, чтобы заполнить пространство, схлопывая пустые.

Для элементов с фиксированной высотой, но адаптивной шириной, можно использовать aspect-ratio:

.card {
aspect-ratio: 16 / 9;
width: 100%;
}

Это гарантирует, что элементы всегда будут иметь соотношение сторон 16:9, независимо от их ширины, что идеально подходит для видео, карточек и многих других элементов UI.

Мобильная адаптация: медиа-запросы и автоматическое размещение

Создание по-настоящему отзывчивых макетов — это гораздо больше, чем просто уменьшение элементов на маленьких экранах. Благодаря CSS Grid и стратегическому использованию медиа-запросов, мы можем полностью трансформировать макет для различных устройств. 📱

Существует два основных подхода к созданию адаптивных сеток:

  1. Mobile-first — начинаем с мобильного макета и расширяем для больших экранов.
  2. Desktop-first — начинаем с десктопного макета и адаптируем для меньших экранов.

Оба подхода имеют свои преимущества, но mobile-first обычно предпочтительнее, так как заставляет сосредоточиться на основном контенте и ключевых функциях. Давайте создадим адаптивный макет, используя подход mobile-first:

.grid-container {
display: grid;
grid-template-columns: 1fr;
grid-template-areas:
"header"
"nav"
"content"
"sidebar"
"footer";
gap: 10px;
}

/* Планшеты */
@media (min-width: 768px) {
.grid-container {
grid-template-columns: 3fr 1fr;
grid-template-areas:
"header header"
"nav nav"
"content sidebar"
"footer footer";
}
}

/* Десктоп */
@media (min-width: 1024px) {
.grid-container {
grid-template-columns: 1fr 4fr 1fr;
grid-template-areas:
"header header header"
"nav content sidebar"
"footer footer footer";
}
}

Обратите внимание, как меняется не только количество столбцов, но и расположение элементов. На десктопе навигация переходит в левый сайдбар, а на мобильных устройствах она располагается сверху. Это демонстрирует гибкость grid-template-areas для адаптивного дизайна.

Автоматическое размещение элементов

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

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

Этот код создает адаптивную галерею, которая:

  • На больших экранах показывает несколько изображений в ряд.
  • Автоматически уменьшает количество столбцов при уменьшении экрана.
  • Переходит к одному столбцу, когда доступная ширина становится меньше 250px.

Всё это без единого медиа-запроса! Автоматическое размещение — ключевой инструмент для создания интуитивно адаптивных макетов.

Продвинутые техники мобильной адаптации

Для более сложных случаев мы можем сочетать автоматическое размещение с явными медиа-запросами:

/* Базовый стиль для всех экранов */
.dashboard {
display: grid;
gap: 20px;
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
}

/* Особые карточки, которые должны быть шире на определенных экранах */
@media (min-width: 768px) {
.featured-card {
grid-column: span 2; /* Занимает две колонки */
}
}

@media (min-width: 1200px) {
.featured-card {
grid-column: span 3; /* Занимает три колонки */
}
}

Здесь все карточки в дашборде адаптируются автоматически, но специальные "выделенные" карточки дополнительно масштабируются на больших экранах, создавая визуальную иерархию.

Обработка пустого пространства

Функции auto-fit и auto-fill могут вести себя по-разному при наличии дополнительного пространства:

  • auto-fill всегда создает максимально возможное количество строк или столбцов, даже если они пустые.
  • auto-fit расширяет существующие элементы, чтобы заполнить всю доступную ширину.
/* Создает пустые треки, если есть место */
.gallery-fill {
grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
}

/* Расширяет существующие элементы, чтобы заполнить пространство */
.gallery-fit {
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
}

Для адаптивных галерей auto-fit обычно предпочтительнее, так как создает более эстетичный макет без пустых колонок. Однако auto-fill может быть полезен, когда требуется строгое выравнивание с другими элементами сетки.

И наконец, важный трюк для адаптивного дизайна — контроль порядка элементов с помощью свойства order:

@media (max-width: 768px) {
.primary-content {
order: -1; /* Перемещает элемент в начало */
}
}

Это позволяет изменять визуальный порядок элементов без изменения их положения в HTML, что особенно полезно для приоритизации контента на маленьких экранах.

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

Проверь как ты усвоил материалы статьи
Пройди тест и узнай насколько ты лучше других читателей
Что такое grid tracks в CSS Grid?
1 / 5

Владимир Лисицын

разработчик фронтенда

Свежие материалы

Загрузка...