INTEGRITY Документация

Создание адаптивных изображений

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

Без этого изображения могут выходить за границы контейнера и ломать вёрстку на маленьких экранах, выглядеть размытыми на дисплеях высокой плотности и без нужды расходовать трафик, поскольку каждое устройство будет загружать один и тот же избыточно большой файл.

Images можно использовать для автоматического изменения размера изображений под оптимальный показ на любом устройстве. Cloudflare поддерживает два способа отдачи адаптивных изображений по запросу:

Подход Как это работает Подходит для
HTML srcset Укажите в разметке несколько размеров и позвольте браузеру выбрать наиболее подходящий вариант с учётом ширины области просмотра и плотности экрана. Полный контроль над тем, какие размеры доступны. Работает во всех браузерах.
width=auto Cloudflare автоматически подбирает оптимальную ширину для одного URL: менять разметку не нужно. Самая простая реализация, особенно если у вас нет контроля над HTML.

Оптимизация для экранов с высоким DPI

Экран отображает изображения в физических пикселях (отдельных точках, которые вы видите), тогда как браузер использует CSS-пиксели (абстрактную единицу, применяемую для вёрстки).

На обычном экране это соответствие 1:1. На экранах с высокой плотностью пикселей (например, Retina, 4K) каждый пиксель CSS отображается с помощью нескольких физических пикселей: например, 4 физических пикселя на экране с плотностью 2x и 9 на экране с плотностью 3x.

Это соотношение, известное как device pixel ratio (DPR), определяет резкость изображения. Если изображение размером 960px выводится на экране 2x, браузер растягивает его до 1920 физических пикселей, из-за чего оно выглядит размытым.

Чтобы изображения оставались четкими, можно предоставить отдельную версию с более высоким разрешением для экранов с высоким DPI, используя dpr параметр:

dpr=1 outputdpr=2 output
width=300,height=200,dpr=1width=300,height=200,dpr=2

Используйте srcset атрибут

При встраивании изображения с помощью тега <img> элементе можно использовать его srcset ↗ атрибут, чтобы предоставить браузеру список одного и того же изображения в разных размерах.

Браузер учитывает размер экрана, плотность пикселей и условия сети, а затем выбирает один наиболее подходящий вариант.

В приведенном ниже фрагменте показано, как srcset можно использовать внутри <img> тег, чтобы отдавать один из двух возможных размеров в зависимости от плотности пикселей устройства пользователя:

<img
	src="portrait-800w.jpg"
	srcset="
		portrait-1600.jpg 2x,
	"
/>

Вместо того чтобы заранее генерировать каждый размер, используйте Images и направьте каждый srcset запись для того же исходного изображения с другим width и дескриптор плотности пикселей (например, 2x). После того как браузер выберет подходящую ширину для коэффициента пикселей устройства пользователя, Cloudflare динамически создаёт изменённую версию по запросу:

<img
	src="/cdn-cgi/image/fit=contain,width=960/assets/product.jpg"
	srcset="/cdn-cgi/image/fit=contain,width=1920/assets/product.jpg 2x"
/>

В приведённом выше примере src атрибут содержит изображение для дисплеев 1x (например, мониторов HD/1080p). srcset атрибут добавляет более крупное изображение с высоким DPI для дисплеев 2x (например, большинства мобильных устройств, настольных 4K дисплеев). Используйте исходные изображения высокого разрешения, поскольку масштабирование изображения низкого разрешения увеличивает размер файла без улучшения качества.

Создание адаптивных макетов

Дескрипторы плотности пикселей используются, когда изображение имеет фиксированный размер CSS (например, фото товара шириной 960px) и ширина области просмотра не имеет значения. В этом случае вы точно знаете, сколько пикселей CSS займёт изображение, и хотите предоставить версии с более высоким разрешением для экранов с высоким DPI.

Однако если изображение масштабируется вместе с областью просмотра, то есть его CSS-размер меняется в зависимости от ширины экрана (например, width: 100%, width: 50vw), затем используйте дескриптор ширины (w) вместо этого, чтобы задать диапазон ширин:

<img
	width="100%"
	srcset="
		/cdn-cgi/image/fit=contain,width=320/assets/hero.jpg   320w,
		/cdn-cgi/image/fit=contain,width=640/assets/hero.jpg   640w,
		/cdn-cgi/image/fit=contain,width=960/assets/hero.jpg   960w,
		/cdn-cgi/image/fit=contain,width=1280/assets/hero.jpg 1280w,
		/cdn-cgi/image/fit=contain,width=2560/assets/hero.jpg 2560w
	"
	src="/cdn-cgi/image/width=960/assets/hero.jpg"
/>

w значения сообщают браузеру ширину в пикселях каждого варианта. Браузер учитывает и ширину области просмотра, и плотность экрана, чтобы выбрать наилучший вариант.

Используйте sizes атрибут

По умолчанию браузер считает, что изображение заполняет всю область просмотра. Если изображение занимает только часть экрана, можно использовать sizes чтобы сообщить браузеру его фактическую ширину:

<!-- Image fills 50% of the viewport -->
<img style="width: 50vw" srcset="..." sizes="50vw" />

Если размер изображения может меняться в зависимости от медиазапросов или других свойств CSS (например, max-width), затем укажите все условия в sizes атрибут:

<img
	style="max-width: 640px"
	srcset="
		/cdn-cgi/image/fit=contain,width=320/assets/hero.jpg   320w,
		/cdn-cgi/image/fit=contain,width=480/assets/hero.jpg   480w,
		/cdn-cgi/image/fit=contain,width=640/assets/hero.jpg   640w,
		/cdn-cgi/image/fit=contain,width=1280/assets/hero.jpg 1280w
	"
	sizes="(max-width: 640px) 100vw, 640px"
/>

В приведённом выше примере:

Используйте width=auto

С srcset, вы точно контролируете, какие размеры доступны, но при этом придётся обновлять HTML для каждого изображения.

С другой стороны, width=auto использует другой подход: Cloudflare сама определяет нужную ширину для каждого запроса на основе одного URL:

/cdn-cgi/image/width=auto/assets/hero.jpg

Это особенно полезно при оптимизации удаленных изображений с помощью способы преобразования, где можно применить width=auto для всей вашей зоны без изменения разметки.

Если запрос включает width=auto, Cloudflare определяет ширину на основе размера экрана, используя client hints, если они отправлены, или определение user-agent в качестве запасного варианта.

Client hints (предпочтительно)

Браузеры, поддерживающие client hints (Chrome, Edge, Opera), передают ширину окна просмотра в заголовке запроса. Затем Cloudflare считывает это значение и выбирает подходящий размер изображения.

Вместо создания уникального изображения для каждой возможной ширины окна просмотра Cloudflare выбирает наименьшую контрольную точку, которая равна обнаруженной ширине экрана или превышает её.

Точки перелома по умолчанию для client hints: 320, 768, 960, а также 1200 пикселей.

В следующей таблице показаны ширины, которые Cloudflare выбирает на основе точек перелома по умолчанию. Если обнаруженная ширина viewport превышает самую большую точку перелома, изображение отдаётся с этой самой большой точкой перелома.

Обнаруженная ширина области просмотра Ширина отдаваемого изображения
280px 320px
500px 768px
960px 960px
1500px 1200px

Переопределить контрольные точки по умолчанию можно с помощью wbreakpoints подпараметр, который принимает положительные целые числа, разделённые точкой с запятой.

Включение client hints

Client hints дают Cloudflare наиболее точную информацию, но требуют, чтобы сайт явно включил эту функцию. Без них width=auto переключается на определение по user-agent.

Client hints можно включить одним из следующих способов:

HTML <meta> тег

Добавьте следующее в <head> страницы раньше всех остальных элементов:

<meta
	http-equiv="Delegate-CH"
	content="sec-ch-dpr {ZONE}; sec-ch-viewport-width {ZONE}"
/>

Заголовки HTTP-ответа

Добавьте следующие заголовки в ответ HTML:

critical-ch: sec-ch-viewport-width, sec-ch-dpr
permissions-policy: ch-dpr=("{ZONE}"), ch-viewport-width=("{ZONE}")

Определение по User-Agent (запасной вариант)

Если Client Hints недоступны, Cloudflare определяет тип устройства (мобильное или настольное) по строке user-agent и выбирает соответствующий размер.

Размеры по умолчанию для определения user-agent:

Тип устройства Размер по умолчанию
Мобильные (iPhone или Android в user-agent) 768px
Настольные компьютеры (все остальные user-agent) 1200px

Переопределить размеры по умолчанию можно с помощью wmobile и wdesktop подпараметры, которые принимают положительные целые числа.