Skip to content

CdsResponsive

New in v4.0

Рамка с постоянными пропорциями. Задайте aspect-ratio — и высота блока посчитается от его ширины на любом экране. Внутрь кладут всё, чему нужна фиксированная форма: видео, карту, iframe, плитку категории. Место под контент занимается сразу, поэтому вёрстка не прыгает, пока он грузится.

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

Для фотографий возьмите CdsImage — он построен на CdsResponsive и вдобавок умеет ленивую загрузку, заглушку и обрезку кадра. Если нужна не форма одного блока, а колонки страницы — CdsGrid.

Вариации ​

Соотношение сторон ​

Свойство aspect-ratio принимает дробь (16/9) или число (1.7778). Ширину задаёт родитель, высоту компонент считает сам — и пересчитывает при каждом изменении ширины. Посчитанная высота работает как минимальная: контент, который в неё не поместился, растянет рамку и собьёт пропорции.

Sandbox Storybook

Размеры ​

По умолчанию рамка занимает всю ширину родителя. Свойства width, max-width и min-width ограничивают её, а height, max-height и min-height — высоту; числа превращаются в пиксели, строки уходят в CSS как есть.

Sandbox Storybook

Компоновка ​

Свойство inline переводит рамку в inline-flex — она перестаёт растягиваться и встаёт в строку с соседями. Ширину в этом случае задайте сами: от контента она её не возьмёт.

Sandbox Storybook

Слоты ​

Высоту рамки держит невидимая распорка, а контент лежит поверх неё. Отсюда два слота с разными задачами.

СлотОписание
defaultОсновной контент в обёртке — она занимает всю рамку целиком
additionalКонтент без обёртки, поверх распорки — для подложек и абсолютных слоёв

Свойство content-class вешает классы на обёртку слота default — так задают внутренние отступы и раскладку. Корень компонента спозиционирован (position: relative), поэтому элементы из additional можно раскладывать абсолютно относительно рамки.

Sandbox Storybook

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

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

Встроенная карта или видео ​

Карты и видеоплееры приезжают в iframe с собственными пропорциями. Оберните iframe в CdsResponsive с нужным aspect-ratio и растяните его классами h-full w-full — плеер будет одинаково смотреться и на широком мониторе, и на телефоне.

Sandbox Storybook

Сетка плиток ​

В сетке категорий плитки должны быть квадратными независимо от длины подписи. Значение aspect-ratio="1" даёт квадрат, а ширину каждой плитки задаёт колонка сетки — от числа колонок зависит только размер, но не форма.

Sandbox Storybook

Место под виджет на время загрузки ​

Отчёт, график или карта приходят с сервера через секунду-другую. Рамка с пропорциями занимает их место сразу: пока внутри крутится загрузчик, подпись и кнопки под виджетом стоят там же, где окажутся после загрузки.

Sandbox Storybook

Переключение пропорций ​

Значение aspect-ratio реактивно, а смена высоты анимирована — переключатель кадрирования не дёргает соседние блоки.

Sandbox Storybook

API ​

Пропсы

ИмяТипПо умолчаниюОписание
aspectRatiostring | number | undefined—Соотношение сторон контента. Например 1.7778 (16/9) или '4/3'.
contentClassany—CSS-класс, применяемый к обёртке контента.
heightstring | number | undefined—Высота компонента
inlineboolean | undefined—Отображает компонент как inline-блок (inline-flex) вместо блочного.
maxHeightstring | number | undefined—Максимальная высота компонента
maxWidthstring | number | undefined—Максимальная ширина компонента
minHeightstring | number | undefined—Минимальная высота компонента
minWidthstring | number | undefined—Минимальная ширина компонента
widthstring | number | undefined—Ширина компонента

Слоты

ИмяТипОписание
additionalanyДополнительный контент, отображаемый поверх sizer вне обёртки контента.
defaultanyОсновной контент компонента, обёрнутый с сохранением соотношения сторон.