Для фотографий возьмите CdsImage — он построен на
CdsResponsiveи вдобавок умеет ленивую загрузку, заглушку и обрезку кадра. Если нужна не форма одного блока, а колонки страницы — CdsGrid.
Вариации
Соотношение сторон
Свойство aspect-ratio принимает дробь (16/9) или число (1.7778). Ширину задаёт родитель, высоту компонент считает сам — и пересчитывает при каждом изменении ширины. Посчитанная высота работает как минимальная: контент, который в неё не поместился, растянет рамку и собьёт пропорции.
Размеры
По умолчанию рамка занимает всю ширину родителя. Свойства width, max-width и min-width ограничивают её, а height, max-height и min-height — высоту; числа превращаются в пиксели, строки уходят в CSS как есть.
Компоновка
Свойство inline переводит рамку в inline-flex — она перестаёт растягиваться и встаёт в строку с соседями. Ширину в этом случае задайте сами: от контента она её не возьмёт.
Слоты
Высоту рамки держит невидимая распорка, а контент лежит поверх неё. Отсюда два слота с разными задачами.
| Слот | Описание |
|---|---|
default | Основной контент в обёртке — она занимает всю рамку целиком |
additional | Контент без обёртки, поверх распорки — для подложек и абсолютных слоёв |
Свойство content-class вешает классы на обёртку слота default — так задают внутренние отступы и раскладку. Корень компонента спозиционирован (position: relative), поэтому элементы из additional можно раскладывать абсолютно относительно рамки.
Рекомендации
Сценарии использования
Встроенная карта или видео
Карты и видеоплееры приезжают в iframe с собственными пропорциями. Оберните iframe в CdsResponsive с нужным aspect-ratio и растяните его классами h-full w-full — плеер будет одинаково смотреться и на широком мониторе, и на телефоне.
Сетка плиток
В сетке категорий плитки должны быть квадратными независимо от длины подписи. Значение aspect-ratio="1" даёт квадрат, а ширину каждой плитки задаёт колонка сетки — от числа колонок зависит только размер, но не форма.
Место под виджет на время загрузки
Отчёт, график или карта приходят с сервера через секунду-другую. Рамка с пропорциями занимает их место сразу: пока внутри крутится загрузчик, подпись и кнопки под виджетом стоят там же, где окажутся после загрузки.
Переключение пропорций
Значение aspect-ratio реактивно, а смена высоты анимирована — переключатель кадрирования не дёргает соседние блоки.
API
Пропсы
| Имя | Тип | По умолчанию | Описание |
|---|---|---|---|
aspectRatio | string | number | undefined | — | Соотношение сторон контента. Например 1.7778 (16/9) или '4/3'. |
contentClass | any | — | CSS-класс, применяемый к обёртке контента. |
height | string | number | undefined | — | Высота компонента |
inline | boolean | undefined | — | Отображает компонент как inline-блок (inline-flex) вместо блочного. |
maxHeight | string | number | undefined | — | Максимальная высота компонента |
maxWidth | string | number | undefined | — | Максимальная ширина компонента |
minHeight | string | number | undefined | — | Минимальная высота компонента |
minWidth | string | number | undefined | — | Минимальная ширина компонента |
width | string | number | undefined | — | Ширина компонента |
Слоты
| Имя | Тип | Описание |
|---|---|---|
additional | any | Дополнительный контент, отображаемый поверх sizer вне обёртки контента. |
default | any | Основной контент компонента, обёрнутый с сохранением соотношения сторон. |