Lazy loading — это техника отложенной загрузки ресурсов веб-страницы, которая позволяет загружать изображения, видео и другие тяжелые элементы только тогда, когда они становятся видимыми пользователю. Эта практика снижает время первоначальной загрузки страницы, уменьшает потребление сетевого трафика и повышает показатели Core Web Vitals.
Lazy loading реализуется на уровне браузера или с помощью JavaScript. Основные подходы:
Native lazy loading Современные браузеры
поддерживают атрибут loading="lazy" для элементов
<img> и <iframe>. Пример:
<img src="example.jpg" loading="lazy" alt="Пример изображения">
<iframe src="video.html" loading="lazy"></iframe>
При этом браузер автоматически откладывает загрузку ресурса до момента, когда он появится в видимой области.
JavaScript lazy loading Использование Intersection Observer API для отслеживания появления элемента в viewport:
const lazyImages = document.querySelectorAll('img[data-src]');
const observer = new IntersectionObserver((entries, observer) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
const img = entry.target;
img.src = img.dataset.src;
observer.unobserve(img);
}
});
});
lazyImages.forEach(img => observer.observe(img));
Здесь изображение загружается только тогда, когда пользователь прокручивает страницу до него.
Lighthouse анализирует использование ленивой загрузки для изображений, видео и других медиа-ресурсов. Метрики, на которые ориентируется Lighthouse:
Приоритизация видимых элементов Критически важные изображения выше сгиба должны загружаться сразу, без lazy loading. Например, логотип и главный баннер.
Использование placeholder’ов Для элементов, которые загружаются лениво, можно использовать низкокачественные версии изображений или сплошные блоки с фоном. Это предотвращает «скачки» контента при загрузке.
Атрибут loading="lazy" для совместимых
браузеров Он снижает зависимость от скриптов и упрощает
поддержку. Для старых браузеров можно предусмотреть полифиллы.
Оптимизация Intersection Observer
Тестирование с Lighthouse
Ленивая загрузка выше сгиба Когда важные элементы лениво загружаются, это увеличивает LCP (Largest Contentful Paint).
Неправильное использование Intersection Observer Элемент может никогда не загрузиться, если наблюдение не настроено корректно или rootMargin слишком маленький.
Отсутствие поддержки fallback Старые браузеры
могут игнорировать loading="lazy". Без полифилла
пользователи получают медленную загрузку всех изображений.
Скрытые элементы загружаются Если элемент
невидим (например, через display: none), а скрипт загружает
его лениво, это может увеличить нагрузку на сеть без пользы.
Lazy loading в связке с корректными аудиторскими инструментами позволяет не просто экономить ресурсы, но и улучшать показатели Core Web Vitals, что напрямую влияет на SEO и пользовательский опыт.