CSS Grid и grid lines: мастер-класс по созданию адаптивных сеток
Перейти

CSS Grid и grid lines: мастер-класс по созданию адаптивных сеток

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

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

  • Веб-разработчики и дизайнера
  • Студенты и начинающие специалисты в области веб-разработки
  • Люди, интересующиеся адаптивным дизайном и современными технологиями вёрстки

Адаптивные сетки — не просто модный тренд, а необходимость для каждого, кто создаёт интерфейсы, работающие на устройствах от часов до телевизоров. CSS Grid произвёл революцию в веб-разработке, позволяя создавать сложные двумерные макеты без хаков и излишних обёрток. Пока многие верстальщики до сих пор полагаются на флоаты и флексбокс, те, кто освоил Grid Lines, получают конкурентное преимущество — их вёрстка работает предсказуемо на всех устройствах, требует меньше кода и легче масштабируется. Готовы перестать бороться с отступами и превратить вёрстку в увлекательный процесс? Этот мастер-класс для вас. 🚀

CSS Grid: основы создания адаптивных сеток для веб-страниц

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

Для создания сетки достаточно объявить контейнер с display: grid и определить структуру с помощью свойств grid-template-columns и grid-template-rows:

.grid-container {
display: grid;
grid-template-columns: 250px 1fr 2fr;
grid-template-rows: auto 300px auto;
gap: 20px;
}

Этот простой код создаёт сетку из трёх столбцов и трёх строк с отступами в 20px между ячейками. Первый столбец имеет фиксированную ширину 250px, второй занимает одну долю свободного пространства, а третий — две доли.

Дмитрий Петров, технический директор

Когда наша команда переходила с флексбокса на Grid для вёрстки дашборда аналитической системы, мы столкнулись с классической проблемой: десятки элементов управления, каждый со своими размерами, и всё должно адаптироваться под экраны от 320px до 4K.

Мы потратили неделю, пытаясь выстроить интерфейс на флексах. Получалось громоздко: обёртки внутри обёрток, вложенные флексы, медиа-запросы с дублирующим кодом. После перехода на Grid код сократился на 40%, а количество элементов в DOM — на треть. Самое главное — мы избавились от проблемы «прыгающих» элементов при изменении размера окна.

Для понимания основной терминологии Grid, рассмотрим ключевые компоненты:

  • Grid Container — элемент, к которому применяется display: grid
  • Grid Item — прямой потомок grid-контейнера
  • Grid Line — линии, образующие структуру сетки
  • Grid Track — пространство между двумя соседними линиями
  • Grid Cell — пересечение строки и столбца
  • Grid Area — прямоугольная область из нескольких ячеек

Главное преимущество Grid перед другими методами вёрстки — контроль над обоими измерениями одновременно. Вот сравнение методов вёрстки:

Метод Измерения Поддержка браузерами Сложность использования Адаптивность
Таблицы 2D Отличная Низкая Плохая
Float 1D Отличная Средняя Средняя
Flexbox 1D Хорошая Средняя Хорошая
Grid 2D Хорошая Средняя Отличная
Пошаговый план для смены профессии

Grid lines: техники позиционирования элементов в сетке

Линии сетки (grid lines) — это невидимые линии, образующие структуру CSS Grid. Они нумеруются начиная с 1 для первой линии, и можно также использовать отрицательную нумерацию с конца (-1 для последней линии). Именно через эти линии осуществляется точное позиционирование элементов в сетке. 📏

Позиционирование элемента происходит путем указания, какие линии сетки должны ограничивать элемент:

.item {
grid-column-start: 1;
grid-column-end: 3;
grid-row-start: 2;
grid-row-end: 4;
}

Или с использованием сокращенной записи:

.item {
grid-column: 1 / 3;
grid-row: 2 / 4;
}

Ещё короче через grid-area, где указывается: строка-начало / колонка-начало / строка-конец / колонка-конец:

.item {
grid-area: 2 / 1 / 4 / 3;
}

Можно использовать ключевое слово span, чтобы указать, сколько ячеек должен занимать элемент:

.item {
grid-column: 1 / span 2; /* Начать с 1-й линии и растянуть на 2 колонки */
grid-row: 2 / span 2; /* Начать со 2-й строки и растянуть на 2 строки */
}

Практическое применение grid lines особенно эффективно при создании сложных интерфейсов с перекрывающимися элементами:

  • Выделение важного содержимого, растягивая его на несколько ячеек
  • Создание боковой панели, занимающей всю высоту страницы
  • Размещение элементов управления в определенных местах интерфейса
  • Создание сетки с разным количеством элементов в строке

Одна из мощных возможностей — именование линий сетки для более понятного кода:

.grid-container {
display: grid;
grid-template-columns: [sidebar-start] 250px [sidebar-end content-start] 1fr [content-end];
grid-template-rows: [header-start] auto [header-end main-start] 1fr [main-end footer-start] auto [footer-end];
}

.header {
grid-column: sidebar-start / content-end;
grid-row: header-start / header-end;
}

Эта техника делает код более читабельным и удобным для поддержки, особенно в больших проектах. 🧩

Настройка отзывчивых сеток с использованием fr и auto

Для создания по-настоящему адаптивных сеток ключевую роль играют единицы измерения fr (fraction) и ключевое слово auto. Они позволяют создавать гибкие макеты, которые автоматически подстраиваются под доступное пространство. 🔄

Единица fr распределяет доступное пространство пропорционально. Например, сетка 1fr 2fr 1fr разделит пространство в соотношении 1:2:1:

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

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

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

Сочетая fr, auto и фиксированные размеры, можно создавать сложные и гибкие макеты:

Шаблон сетки Описание Применение
1fr 1fr 1fr Равные колонки Галереи, карточки товаров
300px 1fr Фиксированная боковая панель Админ-панели, почтовые клиенты
auto 1fr auto Контент посередине, боковые части по контенту Сложные формы, текстовые редакторы
minmax(200px, 1fr) 2fr Гибкая колонка с минимальной шириной Адаптивные приложения, блоги

Функция minmax(min, max) задаёт диапазон размеров, что критически важно для адаптивных макетов:

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

Для полноценной адаптивности используйте repeat() в сочетании с auto-fit или auto-fill:

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

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

Разница между auto-fill и auto-fit:

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

Алексей Соколов, фронтенд-архитектор

Несколько лет назад мы разрабатывали интернет-магазин для клиента, который требовал идеального отображения на всех устройствах. Первоначально мы использовали комбинацию флексбокса и медиа-запросов для управления сеткой товаров.

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

После перехода на Grid с repeat(auto-fit, minmax(280px, 1fr)) мы удалили 70% медиа-запросов, связанных с сеткой. Карточки товаров идеально заполняли пространство на любом устройстве от мобильных до 4K-мониторов. Клиент был поражён, как один и тот же код безупречно работает на всех устройствах.

Продвинутые приёмы работы с grid-template-areas

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

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

.grid-container {
display: grid;
grid-template-columns: 250px 1fr 1fr;
grid-template-rows: auto 1fr auto;
grid-template-areas: 
"header header header"
"sidebar content content"
"footer footer footer";
}

.header { grid-area: header; }
.sidebar { grid-area: sidebar; }
.content { grid-area: content; }
.footer { grid-area: footer; }

Каждая строка в grid-template-areas представляет строку в вашей сетке, а каждое слово — ячейку. Повторение имени области означает, что она растягивается на несколько ячеек.

Символ точки (.) указывает на пустую ячейку:

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

Области должны образовывать прямоугольники — вы не можете создавать L-образные или другие нестандартные формы.

Одно из главных преимуществ grid-template-areas — возможность легко переопределить макет для разных размеров экрана:

CSS
Скопировать код
/* Настольный компьютер */
.grid-container {
grid-template-areas: 
"header header header"
"sidebar content content"
"footer footer footer";
}

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

/* Мобильный */
@media (max-width: 480px) {
.grid-container {
grid-template-areas: 
"header"
"sidebar"
"content"
"footer";
grid-template-columns: 1fr;
}
}

Примеры типичных макетов, реализуемых через grid-template-areas:

  • Holy Grail Layout — классический макет с шапкой, подвалом, контентом и боковыми панелями
  • Dashboard — административные панели с виджетами разных размеров
  • Card Layouts — сетки с карточками разного размера и важности
  • Magazine Layouts — макеты в стиле журнальных страниц с выделением важных материалов

Преимущества использования grid-template-areas:

  • Визуальное представление макета прямо в CSS
  • Легкая перестановка элементов без изменения HTML
  • Упрощение адаптивного дизайна через медиа-запросы
  • Понятный код, который могут легко прочитать даже не технические специалисты

Практикум: создаём многоколоночный адаптивный макет

Давайте применим полученные знания и создадим полноценный адаптивный макет, который будет хорошо работать на всех устройствах. Реализуем типичный макет блога с шапкой, подвалом, основным контентом и боковыми панелями. 👨‍💻

Начнём с HTML-структуры:

<div class="grid-container">
<header class="header">Шапка сайта</header>
<nav class="main-nav">Главная навигация</nav>
<main class="content">Основной контент</main>
<aside class="sidebar">Боковая панель</aside>
<aside class="ads">Рекламный блок</aside>
<footer class="footer">Подвал сайта</footer>
</div>

Теперь определим базовую CSS-сетку с использованием grid-template-areas:

.grid-container {
display: grid;
grid-template-columns: 200px 1fr 250px;
grid-template-rows: auto auto 1fr auto;
grid-template-areas: 
"header header header"
"nav nav nav"
"sidebar content ads"
"footer footer footer";
min-height: 100vh;
gap: 20px;
padding: 20px;
}

.header { grid-area: header; }
.main-nav { grid-area: nav; }
.content { grid-area: content; }
.sidebar { grid-area: sidebar; }
.ads { grid-area: ads; }
.footer { grid-area: footer; }

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

CSS
Скопировать код
/* Планшет */
@media (max-width: 768px) {
.grid-container {
grid-template-columns: 200px 1fr;
grid-template-areas: 
"header header"
"nav nav"
"sidebar content"
"ads ads"
"footer footer";
}
}

/* Мобильный */
@media (max-width: 480px) {
.grid-container {
grid-template-columns: 1fr;
grid-template-areas: 
"header"
"nav"
"content"
"sidebar"
"ads"
"footer";
}
}

Улучшим наш макет, добавив вложенную сетку для блоков контента:

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

.content-item {
background-color: #f5f5f5;
padding: 20px;
border-radius: 5px;
}

/* Выделение важных статей на весь ряд */
.content-item.featured {
grid-column: 1 / -1;
}

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

CSS
Скопировать код
/* Создание вариативной сетки с использованием auto-fit */
.content {
grid-template-columns: repeat(auto-fit, minmax(min(100%, 300px), 1fr));
}

/* Разное количество колонок в галерее в зависимости от ширины */
.gallery {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));
}

@media (min-width: 768px) {
.gallery {
grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
}
}

@media (min-width: 1200px) {
.gallery {
grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
}
}

Ключевые моменты для создания успешного адаптивного макета:

  • Используйте minmax() для установления минимальных размеров колонок
  • Применяйте auto-fit или auto-fill для автоматического определения количества колонок
  • Реорганизуйте макет на разных брейкпоинтах с помощью grid-template-areas
  • Избегайте фиксированных размеров, которые могут привести к переполнению на маленьких экранах
  • Тестируйте на реальных устройствах или с помощью инструментов разработчика в браузере

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

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

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

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

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

Загрузка...