logo
CSS Grid и grid lines: мастер-класс по созданию адаптивных сеток
Заговорите на новом языке уверенно
Индивидуальные занятия с преподавателем в Skyeng
Перейти

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

#Веб-разработка  #CSS и верстка  #Фронтенд CSS  

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

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

Адаптивные сетки — не просто модный тренд, а необходимость для каждого, кто создаёт интерфейсы, работающие на устройствах от часов до телевизоров. 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 — это не просто альтернатива существующим методам, а качественный скачок в подходе к вёрстке.

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

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

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

Загрузка...