Русский

Изучите CSS Subgrid и научитесь создавать сложные, адаптивные и поддерживаемые вложенные раскладки для современного веб-дизайна. Освойте передовые техники grid.

CSS Subgrid: Раскрывая мощь вложенных раскладок

CSS Grid произвел революцию в веб-раскладке, предложив беспрецедентную гибкость и контроль. Однако управление вложенными сетками иногда может стать громоздким. Именно здесь на помощь приходит CSS Subgrid. Subgrid позволяет элементу сетки наследовать размеры дорожек (tracks) своей родительской сетки, упрощая сложные макеты и делая ваш код более поддерживаемым. Эта статья представляет собой исчерпывающее руководство по пониманию и внедрению CSS Subgrid, дополненное практическими примерами и советами для разработчиков всех уровней.

Что такое CSS Subgrid?

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

Зачем использовать Subgrid?

Совместимость с браузерами

Прежде чем приступать к реализации, необходимо проверить совместимость с браузерами. На конец 2023 года Subgrid имеет хорошую поддержку в современных браузерах, включая Chrome, Firefox, Safari и Edge. Тем не менее, всегда полезно использовать Can I use для проверки актуального статуса поддержки.

Базовая реализация Subgrid

Давайте начнем с простого примера, чтобы проиллюстрировать основные концепции Subgrid.

HTML-структура

Сначала определим базовую HTML-структуру для нашей сетки.


<div class="container">
  <div class="header">Шапка</div>
  <div class="sidebar">Боковая панель</div>
  <div class="content">
    <div class="item-1">Элемент 1</div>
    <div class="item-2">Элемент 2</div>
    <div class="item-3">Элемент 3</div>
    <div class="item-4">Элемент 4</div>
  </div>
  <div class="footer">Подвал</div>
</div>

CSS-стили

Теперь давайте определим CSS для создания родительской сетки и сабгрида внутри элемента .content.


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

.header {
  grid-area: header;
  background-color: #eee;
  padding: 10px;
}

.sidebar {
  grid-area: sidebar;
  background-color: #ddd;
  padding: 10px;
}

.content {
  grid-area: content;
  display: grid;
  grid-template-columns: subgrid;
  grid-template-rows: subgrid;
  background-color: #ccc;
  padding: 10px;
}

.item-1, .item-2, .item-3, .item-4 {
  background-color: #bbb;
  padding: 10px;
}

.footer {
  grid-area: footer;
  background-color: #eee;
  padding: 10px;
}

/* Определяем размещение элементов внутри сабгрида .content */
.content {
    grid-template-columns: subgrid;
    grid-template-rows: subgrid;
    display: grid;
}

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


В этом примере элемент .content определен как сабгрид. Свойства grid-template-columns: subgrid; и grid-template-rows: subgrid; указывают сабгриду наследовать размеры дорожек от родительской сетки. Теперь область контента соответствует размерам дорожек, определенным в основной сетке-контейнере, без необходимости каких-либо явных настроек для самого сабгрида. Это обеспечивает идеальное выравнивание между боковой панелью и элементами внутри области контента.

Продвинутые техники Subgrid

Объединение дорожек

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


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

Этот код заставит .item-1 растянуться на первые два столбца сабгрида.

Именованные линии сетки

Вы можете использовать именованные линии сетки с Subgrid для еще большей ясности и контроля. Допустим, у вас есть именованные линии в родительской сетке:


.container {
  display: grid;
  grid-template-columns: [sidebar-start] 200px [sidebar-end content-start] 1fr [content-end];
  grid-template-rows: [header-start] auto [header-end content-start] 1fr [content-end footer-start] auto [footer-end];
  grid-template-areas:
    "header header"
    "sidebar content"
    "footer footer";
  height: 100vh;
}

Затем вы можете ссылаться на эти именованные линии внутри вашего сабгрида:


.content {
  grid-area: content;
  display: grid;
  grid-template-columns: subgrid;
  grid-template-rows: subgrid;
}

.item-1 {
  grid-column: content-start / content-end;
  grid-row: content-start;
}

Обработка неявных дорожек

Если количество элементов сетки превышает количество определенных дорожек в родительской сетке, Subgrid создаст неявные дорожки. Вы можете контролировать размер этих неявных дорожек с помощью свойств grid-auto-rows и grid-auto-columns, аналогично обычному CSS Grid.

Практические примеры и сценарии использования

Давайте рассмотрим несколько практических примеров того, как Subgrid можно использовать для создания сложных макетов.

Сложный список товаров

Представьте себе список товаров, в котором вы хотите отображать несколько деталей продукта (изображение, название, описание, цена) последовательно и выровненно. Subgrid поможет легко этого достичь.


<div class="product-grid">
  <div class="product">
    <img src="product1.jpg" alt="Товар 1">
    <h3>Название товара 1</h3>
    <p>Описание товара 1.</p>
    <span>$99.99</span>
  </div>
  <div class="product">
    <img src="product2.jpg" alt="Товар 2">
    <h3>Название товара 2</h3>
    <p>Описание товара 2.</p>
    <span>$129.99</span>
  </div>
</div>

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

.product {
  display: grid;
  grid-template-columns: subgrid;
  grid-template-rows: subgrid;
  border: 1px solid #ccc;
  padding: 10px;
}

.product > img {
  grid-column: 1;
  grid-row: 1;
  width: 100%;
  height: auto;
}

.product > h3 {
  grid-column: 1;
  grid-row: 2;
  margin-top: 10px;
}

.product > p {
  grid-column: 1;
  grid-row: 3;
  margin-top: 5px;
}

.product > span {
  grid-column: 1;
  grid-row: 4;
  margin-top: 10px;
  font-weight: bold;
}

В этом примере элементы .product используют Subgrid для последовательного выравнивания изображения, названия, описания и цены по всем товарам, даже если длина их содержимого различается. Это обеспечивает аккуратное и профессиональное представление.

Журнальная верстка

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


<div class="magazine-layout">
  <div class="main-article">
    <h2>Заголовок основной статьи</h2>
    <p>Содержимое основной статьи...</p>
  </div>
  <div class="sidebar-article">
    <h3>Заголовок статьи в боковой панели</h3>
    <p>Содержимое статьи в боковой панели...</p>
  </div>
  <div class="featured-image">
    <img src="featured.jpg" alt="Избранное изображение">
  </div>
</div>

.magazine-layout {
  display: grid;
  grid-template-columns: 2fr 1fr;
  grid-template-rows: auto 1fr auto;
  gap: 20px;
}

.main-article {
  grid-column: 1;
  grid-row: 1 / span 2;
  border: 1px solid #ccc;
  padding: 10px;
}

.sidebar-article {
  grid-column: 2;
  grid-row: 1;
  border: 1px solid #ccc;
  padding: 10px;
}

.featured-image {
  grid-column: 2;
  grid-row: 2;
  border: 1px solid #ccc;
  padding: 10px;
}

.magazine-layout > div {
    display: grid;
    grid-template-columns: subgrid;
    grid-template-rows: subgrid;
}

.magazine-layout h2, .magazine-layout h3 {
    grid-column: 1;
    grid-row: 1;
}

.magazine-layout p {
    grid-column: 1;
    grid-row: 2;
}

.magazine-layout img {
    grid-column: 1;
    grid-row: 1;
}

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

Верстка форм

Создание сложных макетов форм с выровненными метками и полями ввода может быть непростым. Subgrid предлагает простое решение.


<form class="form-grid">
  <div class="form-row">
    <label for="name">Имя:</label>
    <input type="text" id="name" name="name">
  </div>
  <div class="form-row">
    <label for="email">Эл. почта:</label>
    <input type="email" id="email" name="email">
  </div>
  <div class="form-row">
    <label for="message">Сообщение:</label>
    <textarea id="message" name="message"></textarea>
  </div>
</form>

.form-grid {
  display: grid;
  grid-template-columns: 1fr;
  gap: 10px;
}

.form-row {
  display: grid;
  grid-template-columns: subgrid;
  grid-template-rows: subgrid;
}

.form-row label {
  grid-column: 1;
  grid-row: 1;
  text-align: right;
  padding-right: 10px;
}

.form-row input, .form-row textarea {
  grid-column: 2;
  grid-row: 1;
  width: 100%;
}


.form-grid {
    display: grid;
    grid-template-columns: 150px 1fr; /* Определяем размеры дорожек в родительской сетке */
    gap: 10px;
}

Здесь элементы .form-row используют Subgrid для последовательного выравнивания меток и полей ввода во всех строках. Размеры дорожек определены в родительской сетке (.form-grid), что обеспечивает единообразный внешний вид.

Лучшие практики и рекомендации

Subgrid в сравнении с обычным CSS Grid

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

Устранение распространенных проблем

Заключение

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

Дополнительные ресурсы