
Адаптивные изображения в HTML настраивают через набор файлов в srcset и описание ожидаемой ширины изображения в sizes. Браузер сопоставляет эти данные с размером области отображения и плотностью экрана, затем выбирает подходящий файл. Для разных кадрирований используют элемент picture. Такой подход помогает управлять загрузкой без JavaScript.
Короткий маршрут к корректному srcset
- Подготовьте несколько версий одного изображения с одинаковым кадрированием.
- Укажите ширину каждого файла в дескрипторе
wи не перечисляйте вsrcsetотсутствующие файлы. - Опишите в
sizes, какую ширину изображения ожидает макет на разных экранах. - Используйте
picture, если на разных экранах нужны разные кадрирование или композиция. - Проверьте результат при разных размерах окна и настройках сети в инструментах разработчика.
Подготовьте версии изображения под разные экраны
Этот способ подходит для фотографий, баннеров и других растровых изображений, которые занимают разную часть макета на телефоне и на широком экране. Он особенно полезен, если мобильной версии не требуется отдельное кадрирование, а меняется только размер отображения.
Не создавайте набор вариантов, если изображение всегда показывается в одном фиксированном размере и достаточно одного подходящего файла. Для логотипов и простых пиктограмм также проверьте, не лучше ли использовать SVG.
Подготовьте файлы с одинаковым содержанием и пропорциями, например photo-480.jpg, photo-960.jpg и photo-1440.jpg. Сохраняйте варианты в подходящем для проекта формате и убедитесь, что каждый файл открывается по указанному пути. Это практичная основа, если нужны адаптивные изображения для сайта и одновременно важна оптимизация изображений на сайте.
Соберите srcset с дескрипторами ширины
Понадобятся готовые файлы, доступ к HTML-шаблону и возможность проверить страницу в браузере. Убедитесь, что сервер отдаёт файлы по указанным URL и не заменяет их перенаправлением на одно изображение.
Для вариантов с разной шириной указывайте фактическую ширину файла в пикселях и дескриптор w:
<img
src="photo-960.jpg"
srcset="photo-480.jpg 480w,
photo-960.jpg 960w,
photo-1440.jpg 1440w"
sizes="100vw"
alt="Горный пейзаж">
В этом примере sizes="100vw" служит простым вариантом, когда изображение занимает всю ширину окна. Для карточки или колонки задайте размеры, соответствующие реальному макету, - подробнее это описано ниже.
Дескриптор плотности x используют для вариантов одного и того же отображаемого размера, например для экранов с разной плотностью пикселей:
<img
src="logo.png"
srcset="logo.png 1x, logo-2x.png 2x"
alt="Логотип компании">
Не смешивайте дескрипторы ширины w и плотности x в одном значении srcset. Для изображений, размеры которых меняются вместе с макетом, обычно удобнее набор с w и атрибут sizes.
Опишите размеры отображения через sizes
-
Определите ширину изображения в макете.
Посмотрите, какую часть контейнера занимает изображение на узком и широком экране. Учитывайте колонки, боковые поля и максимальную ширину контента. -
Запишите условия для контрольных ширин.
Вsizesперечислите медиавыражение и ожидаемую ширину слота. Значение указывают в CSS-единицах, напримерpxилиvw.- Для изображения во всю ширину окна подойдет
100vw. - Для изображения шириной половина окна можно указать
50vw, если это соответствует макету.
- Для изображения во всю ширину окна подойдет
-
Поставьте общее значение последним.
Браузер использует первое подходящее медиавыражение, а если ни одно не подошло - последнее значение без условия. Например:sizes="(max-width: 600px) 100vw, 50vw". -
Сверьте описание с реальной вёрсткой.
Подставьте ширину окна в условия и сравните получившуюся ширину слота с шириной изображения в макете. Если сайт создан с ограничением ширины контейнера, значение50vwможет переоценивать фактический размер на широких экранах. -
Проверьте связку srcset и sizes.
Убедитесь, что в наборе есть файл, подходящий для предполагаемого размера, а значениеsrcуказывает на рабочий резервный файл. Не рассчитывайте, что браузер обязательно выберет один и тот же кандидат при каждом тесте: на выбор могут влиять условия загрузки и настройки браузера.
Быстрый режим
- Экспортируйте несколько файлов одинакового кадрирования.
- Добавьте их в
srcsetс корректными дескрипторамиw. - Укажите в
sizesширину слота для мобильного и широкого макета. - Проверьте адреса файлов и выбранный браузером вариант.
Добавьте art direction с помощью picture
Если для мобильного экрана требуется другой кадр, используйте picture с отдельным источником для нужного условия. Элемент img внутри остаётся обязательным: он содержит резервный вариант и текст альтернативы.
<picture>
<source
media="(max-width: 600px)"
srcset="photo-portrait.jpg">
<img
src="photo-landscape.jpg"
alt="Путешественник у горного озера">
</picture>
Перед публикацией пройдите этот чек-лист:
- Для мобильной и широкой версии подготовлены файлы с нужным кадрированием.
- Условия
mediaсоответствуют контрольным ширинам макета. - Последовательность элементов
sourceпозволяет браузеру выбрать подходящее условие. - У каждого файла в разметке корректный путь.
- У элемента
imgесть осмысленныйaltили пустойalt="", если изображение декоративное. - В варианте для узкого экрана важное содержимое кадра не обрезано.
Проверьте выбор файла в браузере и DevTools
Откройте страницу на разных ширинах окна и проверьте изображение во вкладке с сетевыми запросами инструментов разработчика. Если браузер уже загрузил крупный файл, изменение ширины окна не всегда вызывает повторный запрос меньшего кандидата; для чистой проверки перезагрузите страницу.
Частые ошибки при проверке:
- Дескриптор
wне совпадает с фактической шириной файла. - В
srcsetуказан файл, которого нет на сервере, или путь отличается регистром символов. sizesописывает размер окна вместо ширины изображения в макете.- Для изображения с дескрипторами
wпропущен атрибутsizes. - В одном наборе смешаны дескрипторы
wиx. - В мобильном условии
pictureуказан другой файл, но его кадрирование не проверено. - В тесте оценивают только визуальную чёткость, не проверяя, какой файл действительно запрошен.
Устраните ошибки в дескрипторах и медиазапросах
Выберите подход, соответствующий задаче:
- Набор по ширине (
w). Используйте его, когда размер изображения меняется в макете. Укажите фактическую ширину каждого файла и согласуйтеsizesс вёрсткой. - Набор по плотности (
x). Подходит, если изображение отображается в одном размере, а нужны варианты для экранов с разной плотностью пикселей. Для таких кандидатовsizesне требуется. pictureс медиазапросами. Выбирайте этот способ, когда на разных экранах меняется композиция или кадрирование, а не только разрешение.- Один файл. Оставьте один источник, если размер и кадрирование не меняются и набор вариантов не даёт практической пользы.
Включая адаптивные изображения HTML в проект, проверьте также разметку на странице целиком: атрибуты должны быть у нужного элемента, а изображения - сохранять доступную альтернативу и корректно отображаться при отключённой загрузке дополнительных вариантов. Это особенно удобно учитывать при создании сайта на HTML.
Нюансы адаптивной загрузки изображений
Нужно ли указывать sizes вместе с srcset?
Для набора с дескрипторами ширины w укажите sizes, чтобы браузер оценил ожидаемую ширину изображения. Для набора с дескрипторами плотности x этот атрибут не нужен.
Можно ли смешивать w и x в одном srcset?
Нет, используйте один тип дескрипторов в конкретном наборе. Для ширин макета выбирайте w, для вариантов одного фиксированного размера - x.
Что указать в sizes, если изображение занимает всю ширину окна?
Укажите 100vw. Если ширина ограничена контейнером или зависит от колонок, опишите фактический размер слота с помощью медиавыражений.
Обязательно ли добавлять src к img?
Да, задайте src как резервный источник. Он также помогает обеспечить изображение в случаях, когда браузер не использует кандидаты из srcset.
Когда нужен picture вместо обычного img с srcset?
Используйте picture, если для разных условий нужны разные кадрирования или форматы изображения. Когда меняется только разрешение одного и того же изображения, обычно достаточно img с srcset и sizes.
Почему браузер загрузил не самый маленький подходящий файл?
Браузер учитывает размер слота, плотность экрана и условия загрузки, поэтому выбор не всегда совпадает с ожиданием по одной только ширине окна. Проверьте sizes, дескрипторы и фактический запрос в инструментах разработчика.
Автор: Виктор Егоров.