Почему адаптивные изображения?
Эти новые атрибуты доступны уже некоторое время. Однако до конца понять его мне не удалось. Есть отличные статьи, объясняющие этот новый синтаксис. Но я не мог уложить это в голове. И особенно я пропустил в этих статьях, как можно применить srcset
и sizes
к реальным проблемам.
Вот почему я написал эту статью о srcset
и sizes
. Он поставляется с примером общего макета веб-сайта: страница с боковой панелью. Я надеюсь, что это поможет вам лучше понять srcset
и sizes
и как применить их к проектам вашего веб-сайта.
Зачем использовать srcset и размеры?
Начнем с самого начала. Зачем вообще использовать srcset
и sizes
? Я вижу два преимущества:
- предоставление пользователю более качественных изображений,
- улучшение веб-сайта время загрузки
С помощью srcset
и sizes
можно предлагать несколько размеров одного и того же изображения. Браузер выполняет вычисления (да!) и выбирает наилучший размер для отображения пользователю. Браузерная поддержка srcset
и sizes
хороша, а запасной вариант идеален. Подробнее о поддержке браузеров в конце этой статьи.
Браузер выполняет расчет и выбирает наилучший размер для отображения пользователю.
Браузер учитывает не только ширину экрана (ширину области просмотра), но и плотность пикселей. Независимо от того, просматривает ли пользователь ваш веб-сайт на экране настольного компьютера с низким разрешением или на экране планшета с высоким разрешением, браузер выбирает наилучший размер.
Поскольку вы можете предлагать несколько размеров одного и того же изображения, вы можете сократить время загрузки своего сайта. Больше нет необходимости отображать большое изображение героя на маленьком экране. С помощью srcset
и sizes
вы можете предложить меньший размер, который будет использоваться браузером. Это приводит к более быстрому веб-сайту. И большинство пользователей это оценят!
Я думаю, у нас достаточно причин познакомиться с srcset
и sizes
.
Как работает srcset и размеры
Пример тега <img>
с новыми атрибутами srcset
и sizes
:
<img alt="image alt text" src="medium.jpg" srcset="small.jpg 240w, medium.jpg 300w, large.jpg 720w" sizes=“(min-width: 960px) 720px, 100vw">
Чтобы было немного легче читать:
<img alt="image alt text" src="medium.jpg" srcset=" small.jpg 240w, medium.jpg 300w, large.jpg 720w " sizes=" (min-width: 960px) 720px, 100vw " >
Давайте пройдемся по каждой части.
alt="image alt text"
Как и в случае с каждым тегом <img>
, вы просто используете альтернативный текст.
src="medium.jpg"
Знакомый способ указать местоположение вашего изображения. Браузеры, которые не поддерживают srcset
и sizes
, будут использовать src
.
srcset="small.jpg 240w, medium.jpg 300w, large.jpg 720w"
Здесь начинается волшебство. С помощью scrset
вы указываете список изображений разных размеров. В этом примере у нас есть три размера одного и того же изображения. За именем файла каждого изображения вы указываете ширину в пикселях (w
ширины). Например, small.jpg 240w
означает, что это изображение имеет ширину 240 пикселей.
sizes="(min-width: 960px) 540px, 100vw"
С помощью sizes
вы указываете размер изображения и ситуацию, в которой оно должно отображаться. Это делается с помощью комбинации медиа-запроса и ширины изображения. Для меня sizes
было самой сложной частью для понимания. Но я думаю, что он также и самый мощный.
Приведенный выше код для sizes
делает следующее:
- если ширина области просмотра равна 960 пикселям или больше, чем показывать изображение шириной 540 пикселей,
- если ширина области просмотра меньше 960 пикселей, то показывать изображение шириной, равной ширине области просмотра (100vw означает 100 % ширины области просмотра).
Теперь вы можете заметить, что в нашем примере srcset
нет изображения шириной 540 пикселей. Это не проблема. Браузер выберет лучшее доступное изображение большего размера. В этом случае large.jpg будет использоваться с шириной 720 пикселей.
Экраны HD и Retina
На «обычных» экранах использование ширины области просмотра кажется достаточным для выбора правильного размера изображения. Но с экранами HD и Retina вы хотите отображать изображения большего размера. И вуаля, вот и srcset
и sizes
! При использовании srcset
и sizes
браузер также учитывает плотность пикселей экрана.
Чтобы вычислить плотность пикселей экрана, браузеры используют pixel-device-ratio
. pixel-device-ratio
из 1 означает, что один пиксель устройства соответствует одному пикселю CSS. pixel-device-ratio
из 2 означает, что два пикселя устройства соответствуют одному пикселю CSS.
Например, iPad Air 2 имеет разрешение экрана 2048 на 1536 пикселей (источник: Википедия). pixel-device-ratio
этого iPad равно 2. Это означает, что для браузера размер экрана составляет 1024 на 768 пикселей.
Давайте посмотрим, работает ли все это на реальном примере.
Пример: страница с боковой панелью
Для этого примера я выбрал обычный макет веб-сайта: страница с боковой панелью. Я рассмотрю три ситуации: просмотр этой страницы на мобильном телефоне, планшете и компьютере.
Кроме того, применяется следующее:
- ширина содержимого страницы 67%, сайдбара 33%
- на мобильных устройствах боковая панель отображается под контентом,
- мобильный телефон и планшет имеют
pixel-device-ratio
из 2
Обычный макет сайта: страница с боковой панелью. Прекрасный пример использования srcset и размеров.
Медиа-запросы в этом примере основаны на устройствах. Для ваших проектов рекомендуется основывать медиа-запросы на макете сайта.
Мобильный
Когда этот макет просматривается на мобильном устройстве, мы получаем следующий результат:
- ширина области просмотра – 320 пикселей,
pixel-device-ratio
is 2,- поэтому количество фактических пикселей составляет 320 пикселей x 2 = 640 пикселей,
- боковая панель отображается под контентом на всю ширину экрана,
- поэтому нам нужно изображение шириной 640 пикселей,
- а
sizes
установлен на `100vw`
Наш предварительный HTML для srcset
и sizes
:
srcset="small.jpg 640w" sizes="100vw"
планшет
На планшете получаем следующий результат:
- ширина области просмотра – 768 пикселей,
pixel-device-ratio
is 2,- количество фактических пикселей: 768px x 2 = 1536px,
- боковая панель отображается справа от содержимого,
- ширина контента 67%,
- ширина изображения составляет 67% от 1536 пикселей = 1030 пикселей,
sizes
можно установить как:(min-width: 1536px) 1030px
- это означает что-то вроде: если ширина области просмотра 1536 пикселей или выше, показать изображение шириной 1030 пикселей
Для этого примера я установил медиа-запросы sizes
равными размеру изображения. Для своих проектов лучше выбирать медиазапросы, учитывающие весь сайт, а не только это изображение.
Это приводит наш HTML к:
srcset=" small.jpg 640w, large.jpg 1030w " sizes=" (min-width: 1536px) 1030px, 100vw "
Рабочий стол
Последняя ситуация, когда мы хотим загрузить правильный размер изображения, — рабочий стол. Я выбрал дисплей с разрешением 1366 x 768 пикселей. Что является распространенным решением на данный момент (см. статистику w3schools.com).
Это приводит к:
- ширина области просмотра составляет 1366 пикселей,
pixel-device-ratio
равно 1,- Ширина пикселя CSS составляет 1366 пикселей x 1 = 1366 пикселей,
- ширина контента и изображения 67%,
- ширина изображения составляет 67% от 1366 пикселей = 916 пикселей,
- для
sizes
получаем: (min-width: 1366px) 916px,
Добавляя это к нашим srcset
и sizes
, мы получаем:
srcset=" small.jpg 640w, medium.jpg 916w, large.jpg 1030w " sizes=" (min-width: 1366px) 916px, (min-width: 1536px) 1030px, 100vw "
Чтобы завершить тег <img>
для этого примера, добавим атрибуты alt
и src
.
<img alt="alt text image" src="medium.jpg" srcset=" small.jpg 640w, medium.jpg 916w, large.jpg 1030w " sizes=" (min-width: 1366px) 916px, (min-width: 1536px) 1030px, 100vw " >
Таким образом, этот код делает следующее:
- он показывает small.jpg при просмотре на мобильных устройствах,
- он показывает medium.jpg при просмотре на компьютере,
- он показывает большой.jpg при просмотре на планшете
Я думаю, что это хорошо сделано!
Комментарии
Кажется, что разница между medium.jpg и large.jpg невелика. Почему бы не использовать одно и то же изображение для обеих ситуаций, например. большой.jpg?
Что ж, разница больше, чем вы думаете. Предположим, что размер изображения имеет соотношение 3:2 (длина:ширина). Тогда файл large.jpg на 21 % больше, чем файл medium.jpg.
Расчет следующий. Площадь medium.jpg составляет 916 x 614 пикселей = 562,424 пикселей, площадь large.jpg составляет 710,700 пикселей.
Использование обоих размеров, безусловно, того стоит.
Поддержка браузера для srcset и размеров
Браузерная поддержка srcset
и sizes
хорошая, но не отличная. Во всем мире ок. 83% браузеров поддерживают srcset
и sizes
. Он не поддерживается Internet Explorer, Opera Mini и более ранними версиями Android. Но помните, запасной вариант идеален! Если srcset
и sizes
не поддерживаются, браузер будет использовать атрибут src
.
Поддержка браузером srcset на сайте caniuse.com (11 ноября 2016 г.)
Проверьте поддержку браузером srcset на caniuse.com.
Источники
На написание этого поста меня вдохновили следующие статьи:
Спасибо за чтение!
Для получения дополнительной информации следуйте/обратитесь к нам -
- https://medium.com/@ankitkamboj18