Респонсивний елемент <img>
Респонсивний елемент <img>
використовується браузером для завантаження тільки того зображення, яке підходить для цього пристрою із запропонованих розробником.
Розробник вказує список доступних для завантаження зображень, а браузер,
виходячи з розміру екрану пристрою і його піксельної щільності, вибирає
найбільш вдалий.
Наприклад, розробник вказав два доступних зображення - 300×300
і 600×600
пікселів. Якщо браузеру достатньо зображення 300×300
- це чотириразова економія ваги зображення, яке завантажується. Що менший розмір екрана пристрою, то більше користі від такого підходу. Економія трафіку на мобільному пристрої може досягати 70-90%
, порівняно з десктопом.
Атрибут srcset
Визначає список версій однакового зображення різних розмірів. Не варто
намагатися завантажити різні зображення (за контентом або форматом) за допомогою
цієї техніки, браузер звертає увагу тільки на розмір і вважає, що все, що
передають в srcset
- це версії одного й того самого зображення.
<img srcset="" src="" alt="" />
Дескриптор x
Найпростіший спосіб використання респонсивного елемента <img>
- це застосування дескриптора x
, який буквально вказує браузеру, для якої щільності екрану підходить ця версія зображення.
<img
srcset="photo.jpg 1x, photo@2x.jpg 2x"
src="photo.jpg"
alt="Опис зображення для усіх версій"
/>
В атрибуті src
вказується версія зображення стандартної якості, яка буде використана у разі, якщо браузер старий і не знає про srcset
. В атрибуті srcset
вказуємо 1x
і 2x
версії зображення, розділяючи оголошення комою. Якщо сторінка буде відкрита на пристрої з щільністю пікселів 2
або вище, замість стандартного, буде використане зображення photo@2x.jpg
.
У прикладі для атрибута srcset
вказані зображення стандартної і подвійної щільності, а також оригінальне зображення за замовчуванням в атрибуті src
.
Якщо відкрити інструменти розробника і перейти на вкладку Network
, то буде
видно, що завантажується тільки одне зображення, що підходить для щільності екрану, на якому відкрита веб-сторінка. Відкриваючи з Macbook Pro 15" 2017, щільність пікселів екрану якого дорівнює 2
, браузер завантажить зображення, у якого вказаний дескриптор 2x
.
Єдиний недолік такого підходу полягає в обмеженості критеріїв, за якими браузер вибирає зображення - тільки щільність пікселів екрану. Респонсивні зображення використовуються у респонсивній верстці, розміри блоків в якій змінюються, залежно від розміру в'юпорту.
Не завжди можливо задати точні розміри зображення на екрані, тому що під час
збільшення в'юпорту необхідно буде показувати зображення 300x200
у блоці
розмірами 600x400
пікселів або більше.
Ідеально, якби браузер вибирав зображення не тільки за щільністю пікселів, але ще враховував поточний розмір в'юпорту і розмір самого зображення на екрані. Для цього йому необхідно знати розмір оригінального зображення із запропонованого списку. Якраз це завдання і вирішує дескриптор w
та атрибут sizes
.
Дескриптор w
Ми, як і раніше, надаємо одне і те саме зображення у різних розмірах, але водночас даємо браузеру більше інформації, щоб він міг сам вибрати необхідне зображення, виходячи зі щільності пікселів, розміру в'юпорту та оригінального розміру зображення.
<img
srcset="photo-300.jpg 300w, photo-600.jpg 600w, photo-1200.jpg 1200w"
src="photo-300.jpg"
alt="Опис зображення для всіх версій"
/>
Позначаючи кожне зображення дескриптором w
, в якому вказана ширина цього
зображення в пікселях, ми перекладаємо всі обчислення і вибір зображення на
браузер.
Якщо зображення photo-600.jpg
розміром 600x400
пікселів, то помічаємо його
дескриптором 600w
. В імені файлу зображення вказуємо його фізичну ширину, щоб
не забути, оскільки версій зображення може бути багато.
Атрибут sizes
У разі використання дескриптора w
, тобто прив'язки до фізичних розмірів
зображення, необхідно використовувати атрибут sizes
, щоб підказати браузеру
приблизний розмір полотна, на якому в браузері буде малюватися зображення.
Розміри можна вказувати як у пікселях, так і у відносних одиницях.
Наприклад, якщо зображення на екрані завжди буде 300px
, достатньо вказати одне
значення.
<img
srcset="photo-300.jpg 300w, photo-600.jpg 600w, photo-1200.jpg 1200w"
sizes="300px"
src="photo-300.jpg"
alt="Опис зображення для всіх версій"
/>
У разі, коли зображення повинно бути на 100% ширини в'юпорту на мобільних пристроях до 600px, 300px на екранах 601-900px і 600px на екранах ширше, значення sizes
буде містити медіа-запити.
<img
srcset="photo-300.jpg 300w, photo-600.jpg 600w, photo-1200.jpg 1200w"
sizes="(min-width: 900px) 600px, (min-width: 600px) 300px, 100vw"
src="photo-300.jpg"
alt="Опис зображення для всіх версій"
/>
(min-width: 900px) 600px
- при ширині в'юпорту від 900px, розмір зображення 600px.(min-width: 600px) 300px
- при ширині в'юпорту від 600px, розмір зображення 300px.100vw
- повна ширина в'юпорту. Значення за замовчуванням, яке вказується останнім.
Браузер читає медіа-вирази, зазначені в атрибуті sizes
, зліва направо і обирає
перше підходяще, тому треба уважно стежити за порядком їх оголошення.
Як браузер вибирає
Браузер вибирає зображення за дуже простим алгоритмом - множить розмір полотна
(значення sizes
) на щільність пікселів і вибирає найближче, підходяще за
розміром зображення.
На ілюстрації показаний десктоп і смартфон з шириною зображення 100% ширини
в'юпорту. Напишемо розмітку респонсивного елемента <img>
для цього випадку.
<img
srcset="img-1200x714.png 1200w, img-3000x1768.png 3000w"
sizes="100vw"
src="img.png"
alt="Опис зображення для всіх версій"
/>
Браузер множить ширину в'юпорту на щільність пікселів.
1680 * 2 = 3360
- на ілюстрації цеimg-3000x1768.png
для десктопа.375 * 3 = 1125
- на ілюстрації цеimg-1200x714.png
для смартфона.
У разі, коли в sizes
задане фіксоване значення ширини зображення, браузер
помножить його на щільність пікселів. Наприклад, sizes
задане значення
400px
.
<img
srcset="
photo-300.jpg 300w,
photo-600.jpg 600w,
photo-900.jpg 900w,
photo-1200.jpg 1200w
"
sizes="400px"
src="photo-300.jpg"
alt="Опис зображення для всіх версій"
/>
400 * 2 = 800
- для десктопа буде взято зображення максимально близьке до 800px, а самеphoto-900.jpg
.400 * 3 = 1200
- для смартфона буде взято зображення максимально близьке до 1200px, а самеphoto-1200.jpg
.
Тобто для мобільного пристрою буде взято більше зображення? Не завжди, браузер вибирає те зображення, яке найкраще підходить в цій ситуації.
На відміну від розробника, який знає тільки розмір зображення і приблизний розмір полотна, на якому воно буде відображатися, браузер знає всі важливі технічні характеристики пристрою, на якому була відкрита веб-сторінка. Крім того, браузер може враховувати інші фактори, такі як швидкість інтернет-з'єднання і стан заряду батареї.