Елемент <picture>
Як ми вже розібралися, респонсивний елемент <img> дозволяє завантажувати різні
версії (розміри) однакового зображення. Елемент <picture> використовується у
разі, коли необхідно завантажити зображення різного формату (розширення),
зображення різної геометрії (кадрування) або зображення для підтримки
режиму темної теми.
У кожній ситуації необхідно використовувати правильний інструмент, здебільшого
буде достатньо респонсивного елемента <img>, не обов'язково всюди
застосовувати <picture>.
Синтаксис
Елемент <picture> - це контейнер для одного або більше елементів <source>, в
яких перераховуються можливі варіанти, та одного обов'язкового елемента <img>.
<picture>
<source srcset="" media="" sizes="" type="" />
<source srcset="" media="" sizes="" type="" />
<img src="" alt="" />
</picture>
- Браузер перевірить кожен з елементів
<source>і вибере найбільш придатний. Щоб вибрати оптимальне зображення, браузер аналізує атрибутиsrcset,media,sizesіtype. - Якщо жоден з варіантів не підійде, буде вибране зображення, вказане в атрибуті
srcелемента<img>. - Вибране зображення малюється на полотні, яке займає елемент
<img>.
Підтримка сучасних форматів
Елемент <picture> застосовується для завантаження зображень в сучасних
форматах (наприклад webp). Для браузерів, які не підтримують такі формати,
вказується дефолтне зображення в альтернативному форматі (наприклад jpg або
png). Атрибут type вказує
MIME-тип
зображення. Якщо браузер не підтримує його, то цей елемент <source>
пропускається.
Наступний приклад визначає елемент <picture>, який дозволить браузерам
завантажити photo.webp, водночас надається альтернатива photo.jpg для
браузерів, які ще не підтримують webp.
<picture>
<source srcset="photo.webp 1x, photo@2x.webp 2x" type="image/webp" />
<source srcset="photo.jpg 1x, photo@2x.jpg 2x" type="image/jpeg" />
<img src="photo.jpg" alt="Кіт" />
</picture>
Всі варіанти доступних зображень перелічуються в тегах <source>, які будуть
послідовно оброблятися браузером.
Для того щоб швидко і зручно конвертувати зображення у формат webp, можна
використовувати онлайн-інструменти, наприклад
squoosh.app.
Кадрування (art direction)

Техніка кадрування використовується для завантаження різних зображень для кожного екрану. Це дозволяє показати користувачеві максимум корисної інформації і деталей зображення, навіть на маленьких пристроях. Наприклад, завантажувати альбомну (landscape) або книжкову (portrait) версію зображення, залежно від орієнтації або роздільної здатності пристрою.
Атрибут media дозволяє визначити медіа-запит, який браузер буде аналізувати
для вибору елемента <source>. Якщо медіа-запит визначається як помилковий (не
підходить), то цей елемент <source> пропускається.
<!-- Для екранів ширше 600px буде завантажений photo-wide.jpg -->
<picture>
<source srcset="photo-wide.jpg" media="(min-width: 600px)" />
<img src="photo.jpg" alt="Фотографія" />
</picture>
Перейдіть у приклад і змінюйте ширину області перегляду.
- Для екранів шириною до
600pxбуде завантажено портретне зображення400x600пікселів. - Для екранів шириною від
601pxі ширше, буде завантажено ландшафтне зображення800x400пікселів.
Для підтримки екранів з високою щільністю пікселів, кожному елементу <source>
необхідно додати набір зображень з дескрипторами в атрибут srcset, і не забути
задати атрибут sizes.
Додамо в код попереднього прикладу підтримку ретіни зі щільністю 2x,
використовуючи дескриптор w. Обмежимо ландшафтну версію зображення
максимальною шириною 800px, якщо в'юпорт ширший за 800 пікселів. В іншому
випадку зображення тягнеться на 100% в'юпорту.