Skip to content

CdsImage

Изображение, которое умеет ждать. Компонент резервирует место в вёрстке по заданным пропорциям, подгружает файл, когда картинка появляется в области видимости, и показывает заглушку, пока он едет. Поверх изображения можно положить градиент и любой контент — подпись, тег, кнопку.

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

Для фотографии человека или логотипа компании в круглой рамке возьмите CdsAvatar, для интерфейсных пиктограмм — CdsIcon. Если пропорции нужно задать не картинке, а произвольному блоку — видео, карте, iframe — используйте CdsResponsive, а слайд-шоу из нескольких изображений соберёт CdsCarousel.

Анатомия ​

Первая схема — загруженное изображение: контейнер держит размеры и пропорции, внутри лежит тег img, а поверх — необязательный градиент. Вторая — то же место, пока файл не доехал: размытая заглушка из lazy-src и содержимое слота placeholder.

Вариации ​

Размеры и пропорции ​

Минимум для показа картинки — src и одно ограничение размера: width, height, max-width или max-height. Свойство alt описывает изображение для читателей с экранными дикторами и попадает в aria-label контейнера.

Sandbox Storybook

Свойство aspect-ratio резервирует место под изображение до того, как оно загрузится, — соседний контент не подпрыгнет. Значение принимается и дробью 16/9, и числом 1.7778. Без него компонент дождётся файла и возьмёт пропорции из его собственных размеров — а если файл не откроется, место под картинку схлопнется.

Sandbox Storybook

Заполнение контейнера ​

По умолчанию изображение вписывается в контейнер целиком (object-fit: contain) и оставляет поля, если пропорции не совпали. Свойство cover наоборот заполняет рамку и обрезает лишнее — так фотографии разного размера встают в ровную сетку.

Sandbox Storybook

Свойство position задаёт, какую часть кадра оставить видимой при обрезке. Принимает любое значение object-position, включая пары вроде left top и проценты.

Sandbox Storybook

Загрузка ​

Изображение начинает грузиться, когда попадает в область видимости — вёрстка ниже первого экрана не тянет за собой десятки файлов. Пороги наблюдения настраиваются свойством options (опции IntersectionObserver), а eager отключает ожидание и грузит картинку сразу — так стоит делать с изображениями первого экрана.

Пока файл едет, компонент показывает lazy-src — миниатюру того же кадра, растянутую и размытую, — и содержимое слота placeholder. Свойство color задаёт цвет подложки под ними. О ходе загрузки сообщают события loadstart и load.

Sandbox Storybook

Ошибка загрузки ​

Если файл не открылся, компонент показывает слот error и сообщает об этом событием error. Без слота на месте картинки останется placeholder — поэтому для ошибки лучше дать свою заглушку с понятным текстом.

Sandbox Storybook

Градиент ​

Свойство gradient кладёт поверх изображения CSS-градиент — значение передаётся как аргументы linear-gradient(). Обычно он нужен, чтобы текст поверх фотографии оставался читаемым на любом кадре.

Sandbox Storybook

Контент поверх изображения ​

Слот по умолчанию рендерится над изображением и растягивается на весь контейнер: внутрь можно положить подпись, тег, кнопку. Раскладку задавайте утилитами на самом компоненте (items-end, justify-center) или через content-class.

Sandbox Storybook

Адаптивные источники ​

Свойства srcset и sizes попадают прямо в тег img — браузер сам выберет файл под плотность пикселей и ширину места. Когда для узкого экрана нужен не просто файл поменьше, а другой кадр, добавьте элементы <source> в слот sources: компонент завернёт изображение в <picture>. Сузьте окно — в примере широкая панорама сменится вертикальным кадром.

Sandbox Storybook

Слоты ​

СлотОписание
defaultКонтент поверх изображения
placeholderЧто показывать, пока изображение грузится
errorЧто показывать, если изображение не загрузилось
sourcesЭлементы <source>; оборачивает изображение в <picture>

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

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

Карточки каталога ​

Обложки объявлений приходят из разных источников и почти никогда не совпадают по размеру. Общий aspect-ratio и cover приводят их к одной рамке, color держит нейтральную подложку, пока файл грузится, а слот по умолчанию оставляет тег в углу обложки.

Sandbox Storybook

Обложка страницы ​

Широкая шапка с текстом поверх фотографии: height задаёт высоту полосы, cover и position кадрируют снимок под неё, gradient затемняет низ, чтобы заголовок и кнопка читались. Такой картинке нужен eager — она на первом экране, и ждать появления в области видимости ей незачем.

Sandbox Storybook

Галерея с превью ​

Клик по миниатюре меняет src большого изображения. Миниатюры получают общий aspect-ratio и cover, поэтому ряд остаётся ровным, а color держит подложку большого кадра, пока новый файл грузится. Если кадры нужно ещё и листать — стрелками или свайпом — возьмите готовый сценарий «Галерея с миниатюрами» у CdsCarousel.

Sandbox Storybook

API ​

Пропсы

ИмяТипПо умолчаниюОписание
absoluteboolean | undefined—Позиционирует изображение как position: absolute, заполняя родителя.
altstring | undefined—Альтернативный текст изображения (атрибут alt).
aspectRatiostring | number | undefined—Соотношение сторон контента. Например 1.7778 (16/9) или '4/3'.
colorstring | undefined—Цвет фона-плейсхолдера, отображаемого во время загрузки.
contentClassany—CSS-класс, применяемый к обёртке контента.
coverboolean | undefined—Масштабирует изображение, чтобы оно полностью закрывало контейнер (object-fit: cover).
crossorigin"" | "anonymous" | "use-credentials" | undefined—Значение атрибута crossorigin.
draggableboolean | "true" | "false" | undefined—Управляет возможностью перетаскивания изображения (атрибут draggable).
eagerboolean | undefined—Принудительно загружает изображение сразу, не дожидаясь появления в области видимости.
gradientstring | undefined—CSS-градиент, накладываемый поверх изображения. Например 'to top, rgba(0,0,0,.4), transparent'.
heightstring | number | undefined—Высота компонента
imageClassany—CSS-класс, применяемый к внутреннему элементу <img>.
inlineboolean | undefined—Отображает компонент как inline-блок (inline-flex) вместо блочного.
lazySrcstring | undefined—Источник изображения-заглушки низкого качества, показываемого до загрузки основного.
maxHeightstring | number | undefined—Максимальная высота компонента
maxWidthstring | number | undefined—Максимальная ширина компонента
minHeightstring | number | undefined—Минимальная высота компонента
minWidthstring | number | undefined—Минимальная ширина компонента
optionsIntersectionObserverInit | undefined{}Опции IntersectionObserver для ленивой загрузки.
positionstring | 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.
sizesstring | undefined—Значение атрибута sizes для адаптивных изображений.
srcstring | CdsImageSrcObject | undefined''Источник изображения. Строка или объект с src/srcset/lazySrc/aspect.
srcsetstring | undefined—Набор источников изображения для разных разрешений (атрибут srcset).
themestring | undefined—Тема компонента
transitionstring | boolean | (TransitionProps & { component?: Component | undefined; }) | null | undefined'fade-transition'Анимация перехода
widthstring | number | undefined—Ширина компонента

События

ИмяТипОписание
error[value: string | undefined]Срабатывает при ошибке загрузки изображения.
load[value: string | undefined]Срабатывает после успешной загрузки изображения.
loadstart[value: string | undefined]Срабатывает в начале загрузки изображения.

Слоты

ИмяТипОписание
defaultanyКонтент, отображаемый поверх изображения.
erroranyСодержимое, отображаемое при ошибке загрузки изображения.
placeholderanyСодержимое, отображаемое во время загрузки изображения.
sourcesanyДополнительные элементы <source> для тега <picture>.

Exposed

ИмяТипОписание
currentSrcstringФактический адрес загруженного изображения — с учётом srcset и выбранной браузером плотности.
imageHTMLImageElement | undefinedСсылка на DOM-элемент img.
naturalHeightnumber | undefinedСобственная высота загруженного изображения в пикселях.
naturalWidthnumber | undefinedСобственная ширина загруженного изображения в пикселях.
state"error" | "loading" | "idle" | "loaded"Состояние загрузки изображения: ожидание, загрузка, успех или ошибка.