Mobile · CWV

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

lazy loading

Ленивая загрузка (lazy loading) — это техника, при которой изображения, видео и iframe подгружаются только при приближении к области видимости. Ускоряет первую отрисовку и экономит трафик.

Ленивая загрузка (lazy loading) — это техника отложенной подгрузки изображений, видео и iframe только при приближении к области видимости. Простыми словами, браузер не тянет всё сразу, а ждёт, пока пользователь доскроллит до элемента. Нативная поддержка через атрибут loading="lazy" появилась в Chrome 76 (2019), затем в Firefox 75 и Safari 15.4.

Отложенная загрузка напрямую влияет на Core Web Vitals: ускоряется первая отрисовка, экономится трафик мобильных пользователей. Что это значит на практике — LCP падает на 20–40%, а вес стартовой страницы снижается в 2–3 раза. Проверить эффект можно в PageSpeed Insights и отчёте CrUX.

§ 01Зачем нужен

Ленивая загрузка решает задачу экономии ресурсов: на странице с 50 фото браузер скачивает только 5–7 видимых, остальные — по мере скролла. Зачем это нужно — мобильный трафик дорогой, а Google с июня 2021 учитывает LCP ≤ 2.5 с как фактор ранжирования. Как работает механизм: браузер использует IntersectionObserver и подгружает ресурс при подходе к viewport за 1250 px (порог Chrome).

§ 02Как настраивается

Нативный способ — атрибут loading="lazy" на тегах <img> и <iframe>. Для видео используют preload="none". Что делает разработчик дополнительно:

  • задаёт width и height — иначе CLS вырастет;
  • для первого экрана ставит loading="eager" и fetchpriority="high";
  • через библиотеку lazysizes покрывает старые браузеры.

Отложенная загрузка LCP-картинки — частая ошибка, John Mueller предупреждал об этом в 2022.

Кейс e-commerce

LCP 3.8 → 1.9 c — Интернет-магазин одежды на Shopify подключил native lazy-loading через loading='lazy' для карточек товара ниже первого экрана. LCP упал с 3.8 до 1.9 с за 4 недели, трафик с мобильных +12%. Замер через PSI и CrUX-75th.

Замер до и после

вес страницы −58% — Медиа-портал про автомобили на WordPress внедрил IntersectionObserver для 40+ изображений и YouTube-iframe в лонгридах. Вес первой загрузки упал с 4.6 до 1.9 МБ за 3 недели, отказы −18%. Динамика по GA4 и WebPageTest.

§ 03Где смотреть результат

Эффект ленивой загрузки виден в трёх инструментах. PageSpeed Insights показывает LCP, Total Blocking Time и вес страницы до и после. Search Console → Core Web Vitals агрегирует полевые данные за 28 дней. Chrome DevTools → вкладка Network с фильтром Img покажет, какие картинки реально отложились. Что это значит для аудита — если после внедрения LCP не снизился, значит, отложен сам hero-баннер.

§ 04Подводные камни

Отложенная загрузка ломает SEO, если применить её к LCP-элементу — Google в 2023 явно указал на это в документации web.dev. Другие грабли: отсутствие width/height даёт CLS > 0.1, а скрипты-полифиллы на старых проектах конфликтуют с нативным loading="lazy". Зачем это знать — Screaming Frog и Ahrefs Site Audit отдельно флагают изображения без размеров и lazy-LCP как ошибки приоритета 1.

Частые ошибки
01
Применение loading='lazy' к LCP-картинке первого экрана. Браузер откладывает запрос ключевого изображения, пока не рассчитает viewport. LCP уезжает на 500–1500 мс, а Google смотрит на CrUX-перцентиль 75 — позиции и трафик с мобильных проседают. Как правильно: Указывайте loading='eager' и fetchpriority='high' для героя первого экрана. Lazy ставьте только ниже фолда.
02
Замер эффекта в Lighthouse сразу после деплоя. Lighthouse даёт лабораторные данные одной сессии, а CrUX собирает поле за 28 дней. Через 3 дня видно ложное улучшение, реальный пользовательский LCP подтверждается только спустя месяц — решения принимаются вслепую. Как правильно: Сравнивайте поле в PageSpeed Insights и BigQuery CrUX через 28 дней после релиза. Lab используйте только для отладки.
03
Самописный IntersectionObserver вместо нативного атрибута. JS-решение блокирует main thread, ломается при отключённых скриптах и не учитывает приоритеты браузера. Нативный loading='lazy' поддержан с Chrome 77 и Safari 15.4 — кастом тратит бюджет разработки и режет совместимость. Как правильно: Используйте нативные loading='lazy' и decoding='async' для img и iframe. Полифилл подключайте только для legacy-аудитории по данным аналитики.
Часто спрашивают

Ленивая загрузка — частые вопросы

Ленивая загрузка простыми словами — что это?

+

Ленивая загрузка — это отложенная подгрузка картинок, видео и iframe до момента, когда пользователь приближается к ним при скролле. Технически реализуется атрибутом loading='lazy' в HTML5 или через Intersection Observer API. Поддержка в Chrome — с версии 76 (2019), в Safari — с 15.4.

Самый простой способ — добавить атрибут loading='lazy' к тегам <img> и <iframe>. Для фоновых изображений и старых браузеров используют JS-библиотеки вроде lazysizes (≈7 КБ). Важно: к LCP-картинке (первого экрана) lazy применять нельзя — это замедлит отрисовку на 200–500 мс.

Eager — загружает ресурс сразу при парсинге HTML, lazy — откладывает до приближения к viewport (обычно за 1250–2500 пикселей). Для контента первого экрана выбирают loading='eager', для остального — lazy. По умолчанию браузер использует eager, если атрибут не указан.

Да, косвенно через Core Web Vitals: техника улучшает LCP и FID, экономит до 30–70% трафика на длинных страницах. Google официально рекомендует её с 2020 года и сам индексирует lazy-изображения, если они реализованы через нативный атрибут или IntersectionObserver.

Да, особенно если на странице больше 5–7 изображений или есть встроенные YouTube-плееры (каждый весит ~500 КБ). Внедрение занимает 10–30 минут — достаточно прописать один атрибут в шаблоне. Исключение делают только для первой картинки на экране и LCP-элементов.

Не нашли ответ?

Спросите Андрея Гусарова — отвечаю в течение 1-2 рабочих дней.

Нажимая, вы соглашаетесь с обработкой данных.