Как правильно работать с изображениями и медиа в HTML?
MiddleHTML #html #media #images
Вопрос
Как реализовать адаптивные изображения с помощью srcset/sizes и <picture>, и какие базовые возможности предоставляют теги <video> и <audio>?
Короткий ответ
srcset + sizes на <img> позволяют браузеру самому выбрать подходящий по разрешению файл из нескольких вариантов одного изображения. <picture> идёт дальше и позволяет менять сам источник (формат, art direction) в зависимости от условий через несколько <source>. <video>/<audio> дают встроенный плеер с несколькими источниками и текстовыми дорожками без сторонних библиотек.
Подробный ответ
srcset + sizes (один и тот же кадр, разное разрешение):
srcsetперечисляет варианты файла с дескриптором ширины (480w) или плотности пикселей (2x).sizesсообщает браузеру, какую ширину на экране займёт изображение при разных условиях viewport — это нужно до загрузки, чтобы браузер посчитал, какой из файлов вsrcsetскачивать.- Решение о том, какой файл загрузить, браузер принимает сам на основе реального экрана и плотности пикселей (DPR), это разгружает верстальщика от ручных media query для картинок.
<picture> (разные источники, art direction / форматы):
- Содержит несколько
<source>с условиями (media,type) и обязательный<img>как fallback. - Используется, когда нужно не просто разное разрешение, а разный файл: например, WebP/AVIF с фоллбеком на JPEG через
type, либо другой кадр для мобильного и десктопа черезmedia(art direction — на мобильном показать более крупный план). - Браузер выбирает первый подходящий
<source>сверху вниз; если ни один не подошёл — рендерит<img>.
<video> / <audio>:
- Атрибуты
controls,autoplay,muted,loop,poster(только у video) управляют плеером «из коробки». - Несколько
<source>с разными форматами (mp4,webm) дают fallback для браузеров без поддержки конкретного кодека. <track kind="subtitles">добавляет субтитры/дорожки без JS.- Автовоспроизведение со звуком браузеры блокируют политикой — для гарантированного
autoplayвидео должно бытьmuted.
Пример
<!-- srcset + sizes: один кадр, разное разрешение -->
<img
src="cat-800.jpg"
srcset="cat-400.jpg 400w, cat-800.jpg 800w, cat-1200.jpg 1200w"
sizes="(max-width: 600px) 100vw, 50vw"
alt="Кот на подоконнике"
/>
<!-- picture: разные форматы + art direction -->
<picture>
<source srcset="banner.avif" type="image/avif" />
<source srcset="banner.webp" type="image/webp" />
<source media="(max-width: 600px)" srcset="banner-mobile.jpg" />
<img src="banner.jpg" alt="Баннер акции" loading="lazy" />
</picture>
<!-- video с несколькими форматами и субтитрами -->
<video controls poster="preview.jpg" width="640">
<source src="movie.webm" type="video/webm" />
<source src="movie.mp4" type="video/mp4" />
<track kind="subtitles" src="subs-ru.vtt" srclang="ru" label="Русский" />
Ваш браузер не поддерживает видео.
</video>
Дополнительные вопросы
- Чем дескриптор
wвsrcsetотличается от дескриптораx? - Как
loading="lazy"влияет на производительность загрузки страницы? - Почему
autoplayбезmutedне сработает в большинстве браузеров?