Skip to content

CdsGrid

Адаптивная модульная сетка: CdsGrid, CdsRow и CdsCol раскладывают контент по колонкам — от 4 на телефоне до 16 на широких экранах. Сетка работает в двух режимах — Flexbox (по умолчанию) и CSS Grid, а вся разметка доступна и в виде готовых CSS-классов, без единого компонента.

Storybook GitLab
Покрытие тестами: 100% — хорошее покрытие
API в спеках
18 / 18 пропсы, события, слоты и exposed, у которых есть тест
Тест-кейсы
29 юнит · 0 браузерных
Известные баги
1 зафиксированы тестом it.fails
Покрытие кода
100% строк · 94.9% ветвей замер v4.0.0-alpha.13
A11y (axe)
1 рекомендаций в 16 историях замер v4.0.0-alpha.11

Сетка размечает контент внутри страницы. Каркас приложения — шапку, панели и подвал — собирайте из CdsLayout.

Анатомия ​

Каждый макет начинается с CdsGrid — контейнер можно ставить на любом уровне вложенности, если он занимает всю ширину родителя. Внутри Flexbox-сетки колонки CdsCol группируются в ряды CdsRow; в режиме CSS Grid ряды не нужны — колонки переносятся сами.

Вариации ​

Flexbox или CSS Grid ​

По умолчанию сетка построена на Flexbox. Второй режим — CSS Grid — включается один раз на всё приложение опцией cssGrid и добавляет возможности, которых у Flexbox нет: вложенные сетки subgrid и явное позиционирование колонок через span, start и end. Flexbox-режим взамен умеет менять порядок колонок через order.

ts
import { createCds } from '@central-design-system/components';

const cds = createCds({ cssGrid: true });

Компоненты и пропсы в обоих режимах одни и те же, различается сгенерированная разметка. В примерах ниже режим CSS Grid включён точечно — через provide(CssGridSymbol, true); в приложении достаточно опции cssGrid.

Колонки и брейкпоинты ​

Ширина колонки задаётся пропсами-брейкпоинтами xs–xl: число — сколько колонок сетки займёт CdsCol, начиная с этого брейкпоинта. Значения работают «снизу вверх»: md="4" действует на md и шире.

Sandbox Storybook

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

БрейкпоинтШирина экранаКолонок в сетке
xs≥ 320px4
sm≥ 672px8
md≥ 1056px16
lg≥ 1312px16
xl≥ 1584px16

Комбинируйте брейкпоинты, чтобы описать поведение макета на всех экранах: здесь каждая колонка занимает половину ряда на телефоне и четверть — начиная с планшета. Значение 0 скрывает колонку на брейкпоинте.

Sandbox Storybook

Автоматические колонки ​

CdsCol без пропсов-брейкпоинтов делит ряд поровну между соседями: одна колонка займёт всю ширину, четыре — по четверти. Удобно, когда доли равные и пересчитывать их по брейкпоинтам незачем. Работает только в Flexbox-режиме.

Sandbox Storybook

Виды сетки ​

Свойства narrow и condensed сжимают отступ между колонками с 32px до 16px и 1px соответственно. Те же пропсы есть у CdsRow — так виды смешиваются в одной сетке. Свойство wide снимает ограничение максимальной ширины (1584px) и растягивает сетку на весь контейнер.

Sandbox Storybook

Смещение и порядок ​

Вместо числа в проп-брейкпоинт можно передать объект. Ключ span задаёт ширину, offset — сдвиг вправо на заданное число колонок.

Sandbox Storybook

Ключ order меняет визуальный порядок колонок, не трогая разметку — например, чтобы на десктопе показать колонки в другой последовательности, чем в DOM. Работает только в Flexbox-режиме.

Sandbox Storybook

Режим CSS Grid ​

В режиме CSS Grid колонки кладутся прямо в CdsGrid — без CdsRow: сетка сама переносит их на новую строку, когда ряд заполнен.

Sandbox Storybook

Вложенная сетка с пропом subgrid наследует колонки родительской: положите её внутрь CdsCol — и её колонки встанут точно по линиям внешней сетки. Виды narrow и condensed у вложенной сетки работают независимо от корневой.

Sandbox Storybook

Колонку можно позиционировать явно: в объекте брейкпоинта start и end задают начальную и конечную линию сетки, а проп span фиксирует диапазон сразу для всех брейкпоинтов — числом или долей '25%', '50%', '75%', '100%'.

Sandbox Storybook

CSS-классы ​

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

Sandbox Storybook

Классы Flexbox-сетки:

КлассНазначение
cds-gridКонтейнер сетки
cds-grid-narrow / cds-grid-condensedУзкий (16px) и конденсированный (1px) отступ
cds-grid--wideБез ограничения максимальной ширины
cds-rowРяд; cds-row-narrow, cds-row-condensed — виды
cds-col-{bp}-{n}Колонка шириной n на брейкпоинте bp и шире
cds-col-{bp} / cds-col-{bp}-autoАвтоматическая колонка / ширина по контенту
cds-offset-{bp}-{n}Сдвиг вправо на n колонок
cds-order-{bp}-{n}Визуальный порядок колонки
cds-row-padding / cds-col-paddingВертикальные отступы, равные половине межколонника
cds-aspect-ratio cds-aspect-ratio--{w}x{h}Соотношение сторон блока: 16x9, 4x3, 1x1, …

Классы режима CSS Grid:

КлассНазначение
cds--css-gridКонтейнер; --narrow, --condensed, --wide
cds--css-grid-columnКолонка
cds--col-span-{n}Диапазон в n колонок на всех брейкпоинтах
cds--{bp}:col-span-{n}Диапазон с брейкпоинта bp
cds--col-span-{25|50|75|100}Диапазон долей сетки
cds--col-start-{n} / cds--col-end-{n}Начальная и конечная линия
cds--subgridВложенная сетка; виды — --narrow и т. д.

Классы cds-no-gutter и cds-no-gutter--start / cds-no-gutter--end убирают отступы колонок — у всего ряда или с одной стороны. Парные cds-hang--start / cds-hang--end возвращают отступ контенту, когда его нужно выровнять по модульной сетке.

Sandbox Storybook

Рекомендации ​

Сценарии использования ​

Плитка карточек ​

Витрина отчётов: на телефоне карточки в столбик, на планшете — по две, на широком экране — четыре в ряд. Класс cds-row-padding даёт вертикальный отступ между рядами плитки.

Sandbox Storybook

Форма в две колонки ​

Сетка раскладывает поля формы: парные поля (sm="4" md="8") делят ряд пополам начиная с планшета, комментарий и кнопки занимают ряд целиком. На телефоне всё складывается в одну колонку без дополнительных условий. Вертикальный ритм задают утилитарные классы py-1 на колонках — плотнее, чем cds-row-padding, а hide-details у контролов убирает зарезервированную зону сообщений.

Sandbox Storybook

Список с фильтрами ​

Классическая пропорция «фильтры слева, результаты справа»: панель занимает 4 колонки, список — 12. На телефоне и планшете фильтры встают над списком — за это отвечают значения xs и sm во всю ширину ряда.

Sandbox Storybook

API ​

CdsGrid ​

Пропсы

ИмяТипПо умолчаниюОписание
condensedboolean | undefined—Конденсированная сетка. Уменьшенный отступ до 1px по обеим сторонам
narrowboolean | undefined—Узкая сетка
subgridboolean | undefined—Only CSS Grid supported. Вложенная сетка
tagstring | JSXComponent<any> | undefined'div'Пользовательский HTML-тег для отображения
wideboolean | undefined—Удаляет max-width по умолчанию и растягивает сетку на всю ширину контейнера

Слоты

ИмяТипОписание
defaultanyРяды сетки — CdsRow

CdsRow ​

Пропсы

ИмяТипПо умолчаниюОписание
condensedboolean | undefined—Конденсированная сетка. Уменьшенный отступ до 1px по обеим сторонам
narrowboolean | undefined—Узкая сетка
tagstring | JSXComponent<any> | undefined'div'Пользовательский HTML-тег для отображения

Слоты

ИмяТипОписание
defaultanyКолонки ряда — CdsCol

CdsCol ​

Пропсы

ИмяТипПо умолчаниюОписание
lgColumnBreakpoint<ColumnGridBreakpoint | ColumnFlexBreakpoint>—>1312px
mdColumnBreakpoint<ColumnGridBreakpoint | ColumnFlexBreakpoint>—>1056px
smColumnBreakpoint<ColumnGridBreakpoint | ColumnFlexBreakpoint>—>672px
spanstring | number | ColumnSpanType | undefined—Only CSS Grid supported. Постоянный диапазон колонок, start или end значения, которые не изменятся.
tagstring | JSXComponent<any> | undefined'div'Пользовательский HTML-тег для отображения
xlColumnBreakpoint<ColumnGridBreakpoint | ColumnFlexBreakpoint>—>1584px
xsColumnBreakpoint<ColumnGridBreakpoint | ColumnFlexBreakpoint>—>320px

Слоты

ИмяТипОписание
defaultanyКонтент колонки