- html5css.dev
- SEO
- Мобильное SEO
- Скорость сайта
- Оптимизация изображений
Оптимизация изображений
Изображения — обычно самый тяжёлый ресурс страницы и почти всегда виновник плохого LCP. Разбираем форматы, адаптивную выдачу, приоритеты загрузки и то, как перестать ронять CLS.
srcset и управление
приоритетами загрузки — именно это определяет метрику LCP.
Форматы: что использовать сегодня
| Формат | Когда применять | Выигрыш к JPEG | Поддержка |
|---|---|---|---|
| AVIF | Основной формат для фотографий и сложных изображений | примерно 40–60 % | Chrome, Firefox, Safari 16.4+ |
| WebP | Запасной вариант, универсальная замена JPEG и PNG | примерно 25–35 % | Повсеместная |
| SVG | Логотипы, иконки, схемы, диаграммы | векторный, не зависит от размера | Повсеместная |
| JPEG | Последний запасной вариант | — | Повсеместная |
| PNG | Только там, где нужна точная прозрачность без потерь | — | Повсеместная |
| GIF | Не использовать: анимацию отдавать видео в MP4 или WebM | — | — |
Цепочка запасных вариантов строится через <picture>: браузер берёт
первый формат, который умеет показать.
<picture>
<source srcset="/img/hero.avif" type="image/avif">
<source srcset="/img/hero.webp" type="image/webp">
<img src="/img/hero.jpg" width="1200" height="675"
alt="Схема работы поискового робота" fetchpriority="high">
</picture>
Адаптивные изображения: srcset и sizes
Отдавать смартфону картинку шириной 2000 px — самая частая причина плохого мобильного LCP. Браузер сам выберет подходящий файл, если дать ему выбор.
<img src="/img/photo-800.webp"
srcset="/img/photo-400.webp 400w,
/img/photo-800.webp 800w,
/img/photo-1600.webp 1600w"
sizes="(max-width: 768px) 100vw, 800px"
width="800" height="450"
alt="Интерфейс отчёта Core Web Vitals"
loading="lazy" decoding="async">
srcsetс дескрипторомw— список доступных ширин файлов.sizes— какую ширину займёт картинка в макете. Без него браузер считает, что она во всю ширину экрана, и берёт файл крупнее нужного.widthиheight— всегда, это защита от CLS.decoding="async"— декодирование не блокирует отрисовку.
Приоритеты загрузки и LCP
LCP чаще всего измеряется по главной картинке первого экрана. Значит, у неё задача противоположная остальным: загрузиться как можно раньше.
| Изображение | loading | fetchpriority | preload |
|---|---|---|---|
| Главное, первый экран (кандидат в LCP) | не ставить | high | Полезен |
| Прочие на первом экране | не ставить | по умолчанию | Нет |
| Ниже первого экрана | lazy | по умолчанию | Нет |
| Декоративные фоны | средствами CSS | — | Нет |
<!-- в <head>, для картинки-героя -->
<link rel="preload" as="image"
href="/img/hero-800.avif"
imagesrcset="/img/hero-400.avif 400w, /img/hero-800.avif 800w"
imagesizes="(max-width: 768px) 100vw, 800px">
loading="lazy", проставленный всем изображениям разом плагином или
шаблоном. Картинка первого экрана начинает грузиться позже, и LCP уезжает
на секунду-полторы. Проверьте главную картинку вручную.
Изображения, которые рисует JavaScript
Самописные скрипты ленивой загрузки (подмена data-src на src
по скроллу) — источник двух проблем сразу: робот может не увидеть изображение,
а пользователь получает лишнюю задержку. Нативный loading="lazy"
поддерживается везде и работает лучше. Свои решения оставляйте только для
галерей со сложной логикой.
Атрибут alt
- Описывайте, что изображено, обычной фразой: «Отчёт Core Web Vitals в Search Console», а не «seo продвижение сайта заказать».
- Для декоративных изображений — пустой
alt="", чтобы скринридер их пропустил. - Для изображений-ссылок alt описывает назначение ссылки, а не картинку.
- Подпись
<figcaption>видна пользователю и работает лучше, чем длинный alt.
Подробнее о роли картинок в ранжировании — в уроке «Изображения как фактор ранжирования».
Практический процесс
- Определите реальные размеры под каждый контейнер макета — обычно хватает трёх ширин.
- Генерируйте варианты на сборке или на лету. Хорошо работает связка «оригинал в хранилище → обработчик по URL → кеш CDN».
- Сжимайте с проверкой глазами. Для AVIF качество около 50–60 обычно неотличимо от оригинала; для WebP — 75–80.
- Не масштабируйте вверх. Файл шире оригинала — только вес.
- Отдавайте с длинным кешем и версией в имени файла:
Cache-Control: public, max-age=31536000, immutable. - Проверьте LCP после изменений — в полевых данных, а не только в Lighthouse.
# подготовка вариантов, ImageMagick + avifenc/cwebp
magick photo.jpg -resize 400x photo-400.jpg
magick photo.jpg -resize 800x photo-800.jpg
magick photo.jpg -resize 1600x photo-1600.jpg
for f in photo-*.jpg; do
cwebp -q 78 "$f" -o "${f%.jpg}.webp"
avifenc --min 24 --max 32 "$f" "${f%.jpg}.avif"
done
width/height всем изображениям и убрать
lazy с картинки первого экрана. Это чинит CLS и заметную часть LCP
без изменения инфраструктуры.
Итог
Картинки оптимизируются не «сжатием», а связкой решений: правильный формат, несколько размеров под разные экраны, заданные габариты и осознанные приоритеты загрузки. Следующий урок главы — современные протоколы передачи.
Частые вопросы
Какой формат изображений выбрать в 2026 году?
AVIF как основной, WebP как запасной, JPEG или PNG в самом конце цепочки. AVIF даёт лучшее сжатие, WebP поддерживается везде, а исходный формат остаётся для совсем старых клиентов.
Нужно ли ставить loading="lazy" всем картинкам?
Нет. Изображению первого экрана ленивая загрузка вредит — она откладывает LCP. Ему нужен fetchpriority="high", а loading="lazy" ставится только тому, что ниже первого экрана.
Как изображения влияют на CLS?
Если у картинки не заданы размеры, браузер не знает, сколько места резервировать, и текст «прыгает» после загрузки. Достаточно указать width и height в разметке — CSS всё равно отмасштабирует.
Что писать в alt?
Описание того, что изображено, обычной фразой. Alt нужен для доступности и для поиска по картинкам, а не для ключевых слов: набивка ключами в alt — устаревшая и бесполезная практика.