Как указать несколько форматов для одной картинки не на уровне HTML

Ответ

Для указания нескольких форматов одной картинки можно использовать тег <picture> с <source> внутри. Это позволяет браузеру выбрать оптимальный формат из предложенных:

<picture>
  <source srcset="image.webp" type="image/webp">
  <source srcset="image.avif" type="image/avif">
  <img src="image.jpg" alt="Описание">
</picture>

Браузер проверит поддержку форматов и загрузит первый подходящий. Если ни один не поддерживается, загрузится fallback из <img>.

Для адаптивных изображений можно комбинировать с media-запросами:

<picture>
  <source media="(min-width: 800px)" srcset="large.webp" type="image/webp">
  <source srcset="small.webp" type="image/webp">
  <img src="fallback.jpg" alt="Описание">
</picture>

Ответ 18+ 🔞

А, ну это ж классика, блядь! Картинки в интернете, сука! Все эти форматы, как собаки несчастные — каждый тянет одеяло на себя. WebP, AVIF, JPEG... Ёпта, целый зоопарк!

Так вот, слушай сюда, гениальная мысль. Чтобы не гадать, какой формат у пользователя в браузере заведётся, есть тег <picture>. Это как умный, блядь, швейцар, который сам решает, кого впустить. Внутри него источники <source> лежат, как меню в столовой.

Браузер, этот хитрожопый клиент, смотрит: «Ага, AVIF я жру? Жру!» — и хватает его. Не жрёт AVIF? Ну, ладно, WebP схавает. А если он совсем старый пердун и ничего нового не понимает — тогда уже дефолтная JPEG-картинка из тега <img> вылезет, как запасной игрок. И никто не останется голодным, все довольны!

Ну а если тебе надо не просто формат выбрать, а ещё и для разных экранов разные картинки — так это вообще красота! Ты ему прямо в media укажи, мол, для широких экранов вот эту здоровую картинку давай, а для телефонов — ту, что поменьше. Умная система, ёбана!

Короче, вместо того чтобы одним <img> всё на авось кидать, используй <picture>. Выглядит это, конечно, как простыня кода, но зато работает на ура. Вот, смотри, как это выглядит, без всяких там изменений:

<picture>
  <source srcset="image.webp" type="image/webp">
  <source srcset="image.avif" type="image/avif">
  <img src="image.jpg" alt="Описание">
</picture>

А для адаптивности — вообще песня:

<picture>
  <source media="(min-width: 800px)" srcset="large.webp" type="image/webp">
  <source srcset="small.webp" type="image/webp">
  <img src="fallback.jpg" alt="Описание">
</picture>

Вот и весь секрет, блядь. Никакой магии, чистая логика, как у Герасима из «Муму» — либо так, либо никак. Только тут топить никого не придётся.