⚡ Веб-оптимизация

Адаптивные изображения: srcset и sizes

⏱ 7 мин чтения 📅 Обновлено март 2026

Фото, отображаемое шириной 400 пикселей на мобильном, не должно быть 1600 пикселей в ширину. Но без разметки адаптивных изображений каждый пользователь скачивает один и тот же большой файл. Атрибуты srcset и sizes решают эту проблему: они сообщают браузеру, какие варианты изображений доступны и насколько широко каждый из них будет отображаться, позволяя ему выбрать оптимальный файл для загрузки.

Проблема: одно изображение для всех экранов

Без адаптивных изображений вы стоите перед выбором: отдавать большой файл (быстро на десктопе, медленно на мобильных) или маленький файл (быстро на мобильных, размытый на Retina-десктопе). Ни то, ни другое не оптимально. Разметка адаптивных изображений позволяет отдавать оба варианта и предоставлять выбор браузеру.

srcset с дескрипторами ширины (w)

Самый распространённый паттерн. Укажите несколько ширин изображения, и браузер выберет на основе ширины экрана и плотности пикселей:

<img
  srcset="photo-400.webp 400w,
          photo-800.webp 800w,
          photo-1200.webp 1200w,
          photo-1600.webp 1600w"
  src="photo-800.webp"
  alt="Description"
  width="800" height="600"
>

Дескриптор w. это фактическая ширина в пикселях данного файла изображения, а не точка останова CSS. Браузер использует это значение вместе с шириной экрана и соотношением пикселей устройства для выбора наиболее эффективного варианта.

Атрибут sizes

Без sizes браузер считает, что изображение занимает 100% ширины окна просмотра. Для изображения в боковой панели шириной 300 пикселей на десктопе это заставляет браузер скачивать файл, намного больший, чем нужно. sizes сообщает браузеру, какой ширины будет изображение на каждой точке останова:

<img
  srcset="photo-300.webp 300w,
          photo-600.webp 600w,
          photo-900.webp 900w"
  sizes="(max-width: 768px) 100vw,
         (max-width: 1200px) 50vw,
         300px"
  src="photo-600.webp"
  alt="Description"
  width="600" height="400"
>

Читайте sizes сверху вниз: на экранах уже 768 пикселей изображение занимает 100% окна просмотра. На экранах до 1200 пикселей, 50% окна просмотра. На всех остальных (более широких) экранах. ровно 300 пикселей.

srcset с дескрипторами плотности пикселей (x)

Для изображений фиксированного размера (логотипы, аватары, иконки) используйте дескрипторы плотности пикселей:

<img
  srcset="logo.webp 1x, [email protected] 2x, [email protected] 3x"
  src="logo.webp"
  alt="Company logo"
  width="200" height="60"
>

Браузер скачивает версию 2x на Retina-дисплеях, 3x на экранах с очень высокой плотностью пикселей и 1x везде остальном.

Комбинирование с <picture> для согласования форматов

Объедините <picture> для переключения форматов с srcset для адаптивного изменения размеров:

<picture>
  <source
    type="image/avif"
    srcset="photo-400.avif 400w, photo-800.avif 800w, photo-1200.avif 1200w"
    sizes="(max-width: 768px) 100vw, 800px"
  >
  <source
    type="image/webp"
    srcset="photo-400.webp 400w, photo-800.webp 800w, photo-1200.webp 1200w"
    sizes="(max-width: 768px) 100vw, 800px"
  >
  <img
    src="photo-800.jpg"
    srcset="photo-400.jpg 400w, photo-800.jpg 800w, photo-1200.jpg 1200w"
    sizes="(max-width: 768px) 100vw, 800px"
    alt="Description"
    width="800" height="600"
    loading="lazy"
  >
</picture>

Какие размеры изображений генерировать?

Практический стартовый набор для большинства контентных изображений:

  • 400 пикселей: мобильные устройства (маленькие экраны, 1x)
  • 800 пикселей: мобильные Retina (2x), небольшие планшеты
  • 1200 пикселей: десктоп, планшеты Retina
  • 1600 пикселей: большой десктоп, широкие изображения

Для баннеров и полноширинных изображений добавьте вариант 2400 пикселей для больших Retina-дисплеев.

Автоматизация: Создавать все эти варианты вручную непрактично. Используйте CDN для изображений (Cloudinary, Imgix, Cloudflare Images) для генерации размеров по запросу через параметры URL или плагин для инструментов сборки (next/image, gatsby-image, astro:assets), который делает это автоматически.
Главный вывод: Используйте srcset с дескрипторами w для контентных изображений и добавьте атрибут sizes, соответствующий вашему CSS-макету. Это одно изменение может вдвое сократить объём загружаемых изображений у мобильных пользователей. Комбинируйте с <picture> для согласования форматов, чтобы отдавать AVIF современным браузерам и JPEG в качестве запасного варианта.

Попробуйте инструменты imgpact

Бесплатные инструменты в браузере. без загрузки, без регистрации.