Для фотографии человека или логотипа компании в круглой рамке возьмите CdsAvatar, для интерфейсных пиктограмм — CdsIcon. Если пропорции нужно задать не картинке, а произвольному блоку — видео, карте, iframe — используйте CdsResponsive, а слайд-шоу из нескольких изображений соберёт CdsCarousel.
Анатомия
Первая схема — загруженное изображение: контейнер держит размеры и пропорции, внутри лежит тег img, а поверх — необязательный градиент. Вторая — то же место, пока файл не доехал: размытая заглушка из lazy-src и содержимое слота placeholder.
Вариации
Размеры и пропорции
Минимум для показа картинки — src и одно ограничение размера: width, height, max-width или max-height. Свойство alt описывает изображение для читателей с экранными дикторами и попадает в aria-label контейнера.
Свойство aspect-ratio резервирует место под изображение до того, как оно загрузится, — соседний контент не подпрыгнет. Значение принимается и дробью 16/9, и числом 1.7778. Без него компонент дождётся файла и возьмёт пропорции из его собственных размеров — а если файл не откроется, место под картинку схлопнется.
Заполнение контейнера
По умолчанию изображение вписывается в контейнер целиком (object-fit: contain) и оставляет поля, если пропорции не совпали. Свойство cover наоборот заполняет рамку и обрезает лишнее — так фотографии разного размера встают в ровную сетку.
Свойство position задаёт, какую часть кадра оставить видимой при обрезке. Принимает любое значение object-position, включая пары вроде left top и проценты.
Загрузка
Изображение начинает грузиться, когда попадает в область видимости — вёрстка ниже первого экрана не тянет за собой десятки файлов. Пороги наблюдения настраиваются свойством options (опции IntersectionObserver), а eager отключает ожидание и грузит картинку сразу — так стоит делать с изображениями первого экрана.
Пока файл едет, компонент показывает lazy-src — миниатюру того же кадра, растянутую и размытую, — и содержимое слота placeholder. Свойство color задаёт цвет подложки под ними. О ходе загрузки сообщают события loadstart и load.
Ошибка загрузки
Если файл не открылся, компонент показывает слот error и сообщает об этом событием error. Без слота на месте картинки останется placeholder — поэтому для ошибки лучше дать свою заглушку с понятным текстом.
Градиент
Свойство gradient кладёт поверх изображения CSS-градиент — значение передаётся как аргументы linear-gradient(). Обычно он нужен, чтобы текст поверх фотографии оставался читаемым на любом кадре.
Контент поверх изображения
Слот по умолчанию рендерится над изображением и растягивается на весь контейнер: внутрь можно положить подпись, тег, кнопку. Раскладку задавайте утилитами на самом компоненте (items-end, justify-center) или через content-class.
Адаптивные источники
Свойства srcset и sizes попадают прямо в тег img — браузер сам выберет файл под плотность пикселей и ширину места. Когда для узкого экрана нужен не просто файл поменьше, а другой кадр, добавьте элементы <source> в слот sources: компонент завернёт изображение в <picture>. Сузьте окно — в примере широкая панорама сменится вертикальным кадром.
Слоты
| Слот | Описание |
|---|---|
default | Контент поверх изображения |
placeholder | Что показывать, пока изображение грузится |
error | Что показывать, если изображение не загрузилось |
sources | Элементы <source>; оборачивает изображение в <picture> |
Рекомендации
Сценарии использования
Карточки каталога
Обложки объявлений приходят из разных источников и почти никогда не совпадают по размеру. Общий aspect-ratio и cover приводят их к одной рамке, color держит нейтральную подложку, пока файл грузится, а слот по умолчанию оставляет тег в углу обложки.
Обложка страницы
Широкая шапка с текстом поверх фотографии: height задаёт высоту полосы, cover и position кадрируют снимок под неё, gradient затемняет низ, чтобы заголовок и кнопка читались. Такой картинке нужен eager — она на первом экране, и ждать появления в области видимости ей незачем.
Галерея с превью
Клик по миниатюре меняет src большого изображения. Миниатюры получают общий aspect-ratio и cover, поэтому ряд остаётся ровным, а color держит подложку большого кадра, пока новый файл грузится. Если кадры нужно ещё и листать — стрелками или свайпом — возьмите готовый сценарий «Галерея с миниатюрами» у CdsCarousel.
API
Пропсы
| Имя | Тип | По умолчанию | Описание |
|---|---|---|---|
absolute | boolean | undefined | — | Позиционирует изображение как position: absolute, заполняя родителя. |
alt | string | undefined | — | Альтернативный текст изображения (атрибут alt). |
aspectRatio | string | number | undefined | — | Соотношение сторон контента. Например 1.7778 (16/9) или '4/3'. |
color | string | undefined | — | Цвет фона-плейсхолдера, отображаемого во время загрузки. |
contentClass | any | — | CSS-класс, применяемый к обёртке контента. |
cover | boolean | undefined | — | Масштабирует изображение, чтобы оно полностью закрывало контейнер (object-fit: cover). |
crossorigin | "" | "anonymous" | "use-credentials" | undefined | — | Значение атрибута crossorigin. |
draggable | boolean | "true" | "false" | undefined | — | Управляет возможностью перетаскивания изображения (атрибут draggable). |
eager | boolean | undefined | — | Принудительно загружает изображение сразу, не дожидаясь появления в области видимости. |
gradient | string | undefined | — | CSS-градиент, накладываемый поверх изображения. Например 'to top, rgba(0,0,0,.4), transparent'. |
height | string | number | undefined | — | Высота компонента |
imageClass | any | — | CSS-класс, применяемый к внутреннему элементу <img>. |
inline | boolean | undefined | — | Отображает компонент как inline-блок (inline-flex) вместо блочного. |
lazySrc | string | undefined | — | Источник изображения-заглушки низкого качества, показываемого до загрузки основного. |
maxHeight | string | number | undefined | — | Максимальная высота компонента |
maxWidth | string | number | undefined | — | Максимальная ширина компонента |
minHeight | string | number | undefined | — | Минимальная высота компонента |
minWidth | string | number | undefined | — | Минимальная ширина компонента |
options | IntersectionObserverInit | undefined | {} | Опции IntersectionObserver для ленивой загрузки. |
position | string | undefined | — | Значение object-position для позиционирования изображения внутри контейнера. |
referrerpolicy | "origin" | "no-referrer" | "no-referrer-when-downgrade" | "origin-when-cross-origin" | "same-origin" | "strict-origin" | "strict-origin-when-cross-origin" | "unsafe-url" | undefined | — | Значение атрибута referrerpolicy. |
sizes | string | undefined | — | Значение атрибута sizes для адаптивных изображений. |
src | string | CdsImageSrcObject | undefined | '' | Источник изображения. Строка или объект с src/srcset/lazySrc/aspect. |
srcset | string | undefined | — | Набор источников изображения для разных разрешений (атрибут srcset). |
theme | string | undefined | — | Тема компонента |
transition | string | boolean | (TransitionProps & { component?: Component | undefined; }) | null | undefined | 'fade-transition' | Анимация перехода |
width | string | number | undefined | — | Ширина компонента |
События
| Имя | Тип | Описание |
|---|---|---|
error | [value: string | undefined] | Срабатывает при ошибке загрузки изображения. |
load | [value: string | undefined] | Срабатывает после успешной загрузки изображения. |
loadstart | [value: string | undefined] | Срабатывает в начале загрузки изображения. |
Слоты
| Имя | Тип | Описание |
|---|---|---|
default | any | Контент, отображаемый поверх изображения. |
error | any | Содержимое, отображаемое при ошибке загрузки изображения. |
placeholder | any | Содержимое, отображаемое во время загрузки изображения. |
sources | any | Дополнительные элементы <source> для тега <picture>. |
Exposed
| Имя | Тип | Описание |
|---|---|---|
currentSrc | string | Фактический адрес загруженного изображения — с учётом srcset и выбранной браузером плотности. |
image | HTMLImageElement | undefined | Ссылка на DOM-элемент img. |
naturalHeight | number | undefined | Собственная высота загруженного изображения в пикселях. |
naturalWidth | number | undefined | Собственная ширина загруженного изображения в пикселях. |
state | "error" | "loading" | "idle" | "loaded" | Состояние загрузки изображения: ожидание, загрузка, успех или ошибка. |