Кратко
СкопированоТег <picture> используется, когда для разных устройств или вариантов отображения нам нужны разные картинки.
Пример
Скопировано
<picture> <source srcset="320.jpg" media="(max-width: 800px)"> <img src="640.jpg" alt="Абстрактное изображение"></picture>
<picture>
<source srcset="320.jpg" media="(max-width: 800px)">
<img src="640.jpg" alt="Абстрактное изображение">
</picture>
Как понять
СкопированоОдна и та же страница может быть открыта на разных устройствах и в браузерных окнах разной ширины. У телефона небольшой экран, и было бы круто не загружать полноразмерные картинки с большим разрешением. В CSS мы можем изменять фон элемента (background) в зависимости от ширины экрана, используя медиавыражения. Но если изображение контентное, вставлено в HTML при помощи тега <img>, то CSS нам уже не поможет. Мы должны использовать теги <picture> и <source>.
Как пишется
СкопированоВнутри тега <picture> обязательно должен находиться тег <img>, и опционально — теги <source>.
<picture> <source srcset="750x100.png" media="(min-width: 1000px)"> <img src="650x100.png" alt="Картинка с размерами"></picture>
<picture>
<source srcset="750x100.png" media="(min-width: 1000px)">
<img src="650x100.png" alt="Картинка с размерами">
</picture>
Браузер анализирует каждый тег <source> по порядку, останавливается на первом подходящем под текущие условия и отображает картинку из атрибута srcset. Другие теги <source> не анализируются. Если тег <picture> не поддерживается браузером или ни один из тегов <source> не подходит под условия, то отображается картинка из тега <img>.
В этом примере при помощи атрибута media в теге <source> мы задаём условие по аналогии с медиавыражением @media в CSS. Если условие определяется как ложное, то элемент <source> пропускается. Разница становится видна, если менять размер окна браузера.
Подсказки
Скопировано💡 Если медиавыражение не сработало, то браузер не загружает для него изображение. Так что можно не экономить и писать столько условий, сколько нужно.
💡 Тег <picture> не является полноценным блочным контейнером, как <div>, поэтому стили необходимо применять к тегу <img> внутри.
💡 Старайтесь при вёрстке всегда готовить несколько версий одной и той же картинки для отображения на разных устройствах. Пользователи мобильных телефонов будут вам очень благодарны, если для них вы будете готовить картинки с меньшим разрешением. В то же время пользователям десктопов с экранами высокой чёткости можно показывать картинки с увеличенным разрешением:
В этом примере пользователи с обычными экранами увидят картинку с надписью 750x100. Пользователи, у которых ретиновые дисплеи, увидят картинку с надписью 1500x200.
На практике
Скопированосоветует
Скопировано🛠 Одна из частых ошибок при работе с тегом <picture> — забытый тег <img>. Помните, что браузер показывает изображение исключительно при помощи тега <img>, а теги <source> только помогают выбрать нужный URL картинки для текущих условий. Поэтому если внутри <picture> не будет тега <img>, то и показывать браузеру будет нечего.
советует
Скопировано🛠 Используйте все доступные вам медиавыражения по полной.
Не обязательно останавливаться только на размерах картинок для мобильных и ПК. Можно использовать медиавыражения для определения тёмной темы на устройстве пользователя и подменять картинку, делая интерфейс более приятным для глаз.
<picture> <!-- Картинка для тёмной темы --> <source srcset="image-dark.png" media="(prefers-color-scheme: dark)"> <!-- Картинка по умолчанию для светлой темы --> <img src="image-light.png" alt=""></picture>
<picture>
<!-- Картинка для тёмной темы -->
<source srcset="image-dark.png" media="(prefers-color-scheme: dark)">
<!-- Картинка по умолчанию для светлой темы -->
<img src="image-light.png" alt="">
</picture>