Проблема адаптивных (отзывчивых) изображений будоражит умы веб-разработчиков уже давно. Это задача, когда нужно показывать большую картинку на больших экранах и маленькую на маленьких. Такая проблема решается через HTML атрибуты srcset и sizes, а также тег <picture>. Ниже рассмотрим их подробнее
srcset — содержит сет УРЛов на картинки (через запятую), чтобы браузер мог выбрать наиболее подходящий вариант в зависимости от параметров экрана устройства, с которого просматривается страница.
В srcset можно указать один или несколько URL.
В srcset подразумевается указывать разные размеры одной и той же картинки. Можно указать и разные, но логика его работы подразумевает одну и ту же картинку.
Каждая строка в списке должна содержать УРЛ и дескриптор. Если никакой дескриптор не указан, то берется по умолчанию — 1x.
Дескриптор может быть двух типов:
Дескриптор — это инструкция для браузера. Он помогает браузеру выбрать правильный URL из набора изображений, потому что браузер заранее ничего не знает о картинке, которая находится по этому URL. Благодаря дескриптору браузер понимает, какая у картинки ширина или для какого DPR она подходит.
Синтаксис srcset имеет следующий вид:
<img srcset="image-1200.jpg"
src="full.jpg">
<img srcset="image-640.jpg 640w, image-960.jpg 960w, image-1200.jpg 1200w"
src="full.jpg">
<img srcset="image-640.jpg, image-1280.jpg 2x, image-1920.jpg 3x"
src="full.jpg">
Как это работает на примере:
<img srcset="image-640.jpg 640w, image-960.jpg 960w, image-1200.jpg 1200w"
src="full.jpg">
В этом примере картинка full.jpg не будет использоваться, потому что есть атрибут srcset — браузер выберет наиболее подходящее изображение из srcset.
Какую картинку выберет браузер?
Как это работает на примере:
<img srcset="image-640.jpg, image-1280.jpg 2x, image-1920.jpg 3x"
src="full.jpg">
Какую картинку выберет браузер?
На самсунгах и других смартфонах, часто DPR доходит до 4!
Примеры поиграться:
https://imagekitio.github.io/responsive-images-guide/srcset-density.html (DPR) →
Если изображение занимает только часть ширины экрана, использовать srcset без sizes — плохая идея. Браузер не знает, как выглядит макет страницы, и будет думать, что картинка занимает всю ширину экрана. В итоге он загрузит изображение большего размера, чем нужно.
Так стоп! Что? Браузер не знает о лейауте?
Можно подумать, что браузер может узнать ширину картинки из CSS-стилей. Но есть нюанс: на момент парсинга тега IMG CSS-стили еще не обработаны, а макет страницы не построен. Если браузер будет ждать, пока все стили будут применены, это задержит загрузку изображений.
Если для картинки не указаны никакие размеры в css, то sizes также ограничит размер картинки, как это делает атрибут width.
Если мы используем для картинки CSS-свойство max-width: 100%, оно перебивает значение атрибута sizes.
Что это значит? Если ширина картинки, указанная в sizes, больше ширины ее родительского элемента, то ширина картинки будет равна ширине родительского элемента (из-за max-width: 100%).
sizes— это дополнение к srcset, которое помогает браузеру выбрать оптимальный размер изображения.
sizes содержит список элементов (через запятую), где каждый элемент описывает размер изображения по отношению к ширине экрана (области просмотра).
Использование sizes дает браузеру дополнительную информацию, чтобы правильно выбрать подходящую картинку из srcset и начать ее загрузку, как только он увидит тег <img>, не дожидаясь, парсинга css стилей.
Синтаксис:
<img
srcset="small.jpg 300w,
medium.jpg 600w,
large.jpg 900w"
sizes="(max-width: 300px) 100vw,
(max-width: 600px) 50vw,
(max-width: 900px) 33vw,
900px"
src="image.jpg"
/>
Обратите внимание, что у последнего размера нет медиа-условия — это значение по умолчанию. Оно будет использоваться, когда ни одно из предыдущих медиа-условий не подошло.
Будьте внимательнее к порядку объявления проверок, потому что браузер игнорирует все следующие проверки после первой успешной.
Элементы в sizes могут иметь:
Рассмотрим такой пример:
<img
srcset="w-225.jpg 225w,
w-300.jpg 300w,
w-350.jpg 350w,
w-640.jpg 640w"
sizes="(max-width: 400px) 100vw,
(max-width: 700px) 50vw,
(max-width: 900px) 33vw,
225px"
src="women-dress.jpg"
>
На основе этих данных браузер выберет одну из картинок из сета srcset (включая все проверки с DPR — см описание srcset).
Вот пример: https://imagekitio.github.io/responsive-images-guide/srcset-sizes.html →
Ниже показан весь список возможных единиц измерения, которые можно использовать в атрибуте sizes.
При загрузке страницы, браузер начинает загрузку изображений до загрузки и интерпретации CSS и JavaScript. Такая техника уменьшает время загрузки страницы, в среднем, на 20%. Но она не подходит для создания адаптивных изображений, для этого и был создан srcset атрибут.
Например, невозможно было бы загрузить элемент <img>, затем определить ширину экрана при помощи JavaScript и динамически изменить URL картинки. Изначальное изображение было бы уже загружено (или было бы отправлено к загрузке) к моменту загрузки его меньшей версии.
Ссылка на оригинал статьи — https://wp-kama.ru/id_13564/atributy-scrset-sizes.html →