Адаптивная графика

Адаптивные изображения: srcset и picture, форматы WebP/AVIF, sizes, aspect-ratio, ленивая загрузка и резервные варианты для любого экрана.

Уровень: средний 11 разделов 1,5 часа

1. Зачем нужна адаптивная графика

Одна и та же картинка смотрится на 27-дюймовом мониторе и на телефоне. Если отдавать всем один и тот же файл максимального качества, телефон скачает 300 КБ ради картинки, которую покажет в 100 раз меньше. Адаптивность графики — о том, чтобы каждый экран получал подходящий размер и формат без потери качества.

Правило «одного файла на все случаи» стоит дорого: современные сайты теряют до половины веса страницы на картинках, которые никто не рассматривает в полном размере.

2. srcset с x-дескрипторами

Простой случай: один размер изображения, но разная плотность пикселей экрана (обычный против retina). Для этого в srcset перечисляют версии с дескрипторами 1x, 2x — браузер сам выбирает подходящую.

<img src="photo-1x.jpg"
     srcset="photo-1x.jpg 1x, photo-2x.jpg 2x"
     alt="Городской пейзаж">
Дескриптор x подходит, когда размер картинки в CSS фиксирован. Если изображение растягивается на всю ширину колонки — используйте подход w и sizes из следующего раздела, иначе телефон получит тяжёлую 2x-версию.

3. srcset с w-дескрипторами и sizes

Когда размер картинки зависит от ширины экрана, браузеру нужно знать и ширины файлов (w-дескрипторы), и занимаемую картинкой ширину (sizes). Тогда он посчитает, какой файл качать, учитывая плотность экрана.

<img src="city-800.jpg"
     srcset="city-400.jpg 400w,
             city-800.jpg 800w,
             city-1600.jpg 1600w"
     sizes="(min-width: 1024px) 50vw, 100vw"
     alt="Панорама города">

sizes — это строки медиаусловий и ширин: «на широком экране картинка занимает половину вьюпорта, на узком — всю ширину». Браузер берёт актуальную ширину, умножает на плотность 2x и выбирает ближайший файл из srcset.

Для типовой блоговой картинки «полная ширина → половина ширины» удобно: sizes="(min-width: 768px) 50vw, 100vw", а srcset с файлами 400/800/1200/1600w покрывает всё.

4. picture: формат и art direction

Тег picture решает две задачи, которые srcset не может: отдать разный формат (WebP/AVIF вместо JPEG) и показать другое кадрирование на разных экранах (art direction). Внутри — source и обычный img как резерв.

<picture>
  <source type="image/avif" srcset="hero.avif">
  <source type="image/webp" srcset="hero.webp">
  <img src="hero.jpg" alt="Отдых на природе">
</picture>

<picture>
  <source media="(min-width: 768px)" srcset="wide.jpg">
  <source media="(max-width: 767px)" srcset="crop.jpg">
  <img src="wide.jpg" alt="Комната с письменным столом">
</picture>
art direction («разный кадр») — случай, когда на телефоне не хочется показывать панораму целиком: лицо или продукт должны быть крупнее. Это меняет содержание кадра — и это то, что srcset не делает.

5. Форматы изображений

Выбор формата — половина скорости страницы. Каждый формат отвечает своему типу контента: фотография, графика с резкими краями, иконка или экран страницы.

ФорматДля чегоКогда обычно
AVIFфото без потерь при малом весесовременные браузеры, дефолт в picture
WebPфото и несложная графикаширокая поддержка (2009+)
JPEGфото с плавными градиентамирезерв повсюду
PNGграфика с прозрачностьюлоготипы, скриншоты
SVGвектор, масштабируется без потерьиконки, логотипы, иллюстрации
GIFкороткая анимациялучше уступить видео или APNG
<picture>
  <source type="image/avif" srcset="img.avif">
  <source type="image/webp" srcset="img.webp">
  <img src="img.jpg" alt="Товар в интернет-магазине">
</picture>
Инструмент: ImageMagick или онлайн-конвертеры (Squoosh, CloudConvert) умеют выжать и AVIF, и WebP. Для десятков картинок подходят сценарии и сборщики вроде Vite.

6. width, height и aspect-ratio

Когда браузер знает размеры картинки заранее, он оставляет под неё место и страница не «прыгает» во время загрузки — это главный приём защиты от смещения макета (CLS). Всегда задавайте width и height, а CSS растягивает картинку с сохранением пропорций.

<img src="photo.jpg" width="1200" height="800"
     alt="Пример" class="photo">

      .photo {
        max-width: 100%;
        height: auto;   /* пропорция сохраняется */
      }
У картинки, которая потом загружается медленно, место уже занято: текст не съезжает, кнопки не скачут. CLS измеряется в долях вьюпорта — избавьтесь от «прыжков» заранее, а не после замеров LightHouse.

7. Ленивая загрузка

Картинки ниже первого экрана не нужны мгновенно: браузер может подождать, пока пользователь доскроллит. Атрибут loading="lazy" включает это поведение нативно — без скриптов. Первый экран остаётся быстрым: loading="eager" по умолчанию, fetchpriority помогает главной картинке.

<!-- в зоне видимости сразу: eager + приоритет -->
<img src="cover.jpg" alt="Обложка статьи" fetchpriority="high">

<!-- ниже первого экрана: догрузится при прокрутке -->
<img src="photo-1.jpg" alt="Галерея" loading="lazy">
<img src="photo-2.jpg" alt="Галерея" loading="lazy">

8. Адаптивные фоны CSS

Картинка как фон background не умеет требовать srcset, но умеет брать разные файлы по медиаусловиям через image-set() и @media. Формат — как обычно, через список.

.hero {
  background-image: -webkit-image-set(
    url("hero-1x.jpg") 1x,
    url("hero-2x.jpg") 2x
  );
  background-image: image-set(
    "hero-1x.jpg" 1x,
    "hero-2x.jpg" 2x
  );
  background-size: cover;
}

@media (min-width: 768px) {
  .hero { background-image: image-set("hero-wide.jpg" 1x, "hero-wide-2x.jpg" 2x); }
}

9. Иконки и фавиконки

Иконки интерфейса почти всегда векторные: одна SVG-иконка отображается на любом экране с идеальной чёткостью и весит байты. Фавиконки — отдельная история: размеры и форматы задаются в link rel="icon".

<!-- SVG-иконка масштабируется идеально -->
<svg class="icon" width="24" height="24" viewBox="0 0 24 24">
  <path d="M3 12h18M12 3v18" stroke="currentColor" stroke-width="2"/>
</svg>

<link rel="icon" href="favicon.ico" sizes="32x32">
<link rel="icon" type="image/svg+xml" href="favicon.svg">

10. Проверка реальной отдачи

Адаптивность графики проверяется во вкладке Network — той же, что показывает любой ответ сервера. Скачанный файл должен «соответствовать» тому, что видно на экране.

Если сайт отдаёт только исходный src (JPEG 2 МБ) и игнорирует srcset — браузер так и работает: без поддержки picture/sizes резервный img. Проверяйте поддержку и, при регрессах, наличие обоих путей — srcset и picture одновременно лучшие практики, а не альтернативы.

11. Чек-лист адаптивной графики

Статья о растровой сетке лучше готова при коротком контроле. Прогоните страницу с картинками по пунктам один раз после вёрстки.

Быстрая победа: конвертация всех фото в AVIF с WebP-резервом обычно снижает вес страницы вдвое — клиенты это замечают по скорости, а метрики — по LCP и CLS.

Что дальше

Курс завершён.

← Вернуться к курсам