Lazy loading (ленивая загрузка) — это техника оптимизации веб-страниц, при которой изображения загружаются не сразу при открытии страницы, а только в момент, когда пользователь прокручивает контент до их видимой области экрана (viewport). Это снижает начальное время загрузки страницы и уменьшает нагрузку на сервер.
- Зачем использовать lazy loading
- Нативный lazy loading через атрибут loading
- Lazy loading через Intersection Observer API
- Параметры Intersection Observer
- Lazy loading для фоновых изображений CSS
- Готовые библиотеки для lazy loading
- Lazy loading в WordPress и CMS
- Типичные ошибки при реализации
- Техника LQIP — Low Quality Image Placeholder
- Проверка корректности работы lazy loading
Зачем использовать lazy loading
Производительность сайта напрямую влияет на поведение пользователей и позиции в поисковой выдаче. Ленивая загрузка изображений решает сразу несколько задач:
- Сокращает объём передаваемых данных при первом открытии страницы
- Ускоряет метрику LCP (Largest Contentful Paint) — один из ключевых Core Web Vitals
- Снижает количество HTTP-запросов при первой загрузке
- Экономит трафик пользователей на мобильных устройствах
- Уменьшает нагрузку на хостинг и CDN
| Метрика | Без lazy loading | С lazy loading |
|---|---|---|
| Время первой загрузки (среднее) | 3,5–6 сек | 1,5–2,5 сек |
| Объём загружаемых данных | 100% ресурсов страницы | 30–50% ресурсов при открытии |
| Показатель отказов (bounce rate) | повышается на 32% при задержке >3 сек | снижается за счёт быстрого рендера |
Нативный lazy loading через атрибут loading
Самый простой способ реализации — использование встроенного HTML-атрибута loading="lazy". Он поддерживается всеми современными браузерами без подключения дополнительных библиотек.
Пример кода:
<img src="photo.jpg" alt="Описание" loading="lazy" width="800" height="600">
Атрибут loading="lazy" поддерживается в Chrome 76+, Firefox 75+, Edge 79+, Safari 15.4+ — это покрывает более 93% пользователей по данным 2025–2026 года.
- lazy — изображение загружается при приближении к зоне видимости
- eager — изображение загружается немедленно (поведение по умолчанию)
- auto — браузер сам решает стратегию загрузки
Важно всегда указывать атрибуты width и height, чтобы браузер резервировал место под изображение и избегал скачков контента (CLS — Cumulative Layout Shift).
Lazy loading через Intersection Observer API
Для более тонкого контроля над поведением ленивой загрузки применяется JavaScript API — Intersection Observer. Он позволяет задавать отступы до момента загрузки, работать с фоновыми изображениями CSS и управлять логикой вручную.
Базовый пример реализации:
const images = document.querySelectorAll('img[data-src]');
const observer = new IntersectionObserver((entries) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
const img = entry.target;
img.src = img.dataset.src;
img.removeAttribute('data-src');
observer.unobserve(img);
}
});
}, { rootMargin: '200px' });
images.forEach(img => observer.observe(img));
В HTML изображения размечаются следующим образом:
<img data-src="photo.jpg" src="placeholder.jpg" alt="Описание" width="800" height="600">
Параметры Intersection Observer
| Параметр | Описание | Рекомендуемое значение |
|---|---|---|
| rootMargin | Отступ до границы viewport, при котором начинается загрузка | 100px–300px |
| threshold | Процент видимости элемента для срабатывания | 0 (любое появление) |
| root | Контейнер для наблюдения (по умолчанию — весь viewport) | null |
Lazy loading для фоновых изображений CSS
Нативный атрибут loading не работает с фоновыми изображениями, заданными через CSS-свойство background-image. Для них необходимо использовать JavaScript.
Подход с классом-триггером:
/* CSS */
.lazy-bg {
background-image: none;
}
.lazy-bg.loaded {
background-image: url('bg-photo.jpg');
}
// JavaScript
const bgElements = document.querySelectorAll('.lazy-bg');
const bgObserver = new IntersectionObserver((entries) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
entry.target.classList.add('loaded');
bgObserver.unobserve(entry.target);
}
});
});
bgElements.forEach(el => bgObserver.observe(el));
Готовые библиотеки для lazy loading
Если нужна поддержка устаревших браузеров или расширенный функционал, можно использовать проверенные библиотеки:
| Библиотека | Размер (минифицированный) | Особенности |
|---|---|---|
| lazysizes | ~3,4 КБ | Без зависимостей, поддержка srcset, iframe, video |
| lozad.js | ~1 КБ | На основе Intersection Observer, минималистичная |
| vanilla-lazyload | ~7 КБ | Поддержка фоновых изображений, video, iframe |
| yall.js | ~1,4 КБ | Поддержка CSS-переменных, анимаций |
Lazy loading в WordPress и CMS
Начиная с WordPress 5.5 (2020), атрибут loading="lazy" добавляется к изображениям автоматически через функцию wp_lazy_loading_enabled. В 2026 году это поведение остаётся стандартным для всех новых установок.
- Плагин Smush — lazy loading + сжатие изображений
- Плагин WP Rocket — комплексная оптимизация с поддержкой lazy loading для фонов
- Плагин a3 Lazy Load — расширенные настройки отступов и плейсхолдеров
- В Shopify и Webflow lazy loading включён по умолчанию для изображений через платформенные оптимизации
Типичные ошибки при реализации
Наиболее распространённая ошибка — применение lazy loading к изображениям, которые находятся в верхней части страницы (above the fold). Это ухудшает LCP и снижает оценку в Google PageSpeed Insights.
- Ошибка 1: Применение
loading="lazy"к логотипу, баннеру или первому экрану — замедляет LCP - Ошибка 2: Отсутствие атрибутов
widthиheight— вызывает CLS (смещение контента) - Ошибка 3: Использование слишком маленького значения
rootMargin— изображение загружается прямо при попадании в экран, без упреждения - Ошибка 4: Подключение тяжёлых библиотек, когда достаточно нативного атрибута
- Ошибка 5: Отсутствие placeholder-изображения или блюра — пользователь видит пустое место
Техника LQIP — Low Quality Image Placeholder
Для улучшения пользовательского опыта при lazy loading применяют технику LQIP: вместо пустого места показывается размытая миниатюра изображения (обычно 20–40 пикселей шириной, закодированная в base64), которая заменяется оригиналом после загрузки.
<img
src="data:image/jpeg;base64,/9j/4AAQSkZJRgAB..."
data-src="full-image.jpg"
alt="Описание"
class="lazy"
width="800"
height="600"
style="filter: blur(10px); transition: filter 0.3s;"
>
Использование LQIP совместно с Intersection Observer — оптимальное решение для сайтов с большим количеством изображений (интернет-магазины, фотогалереи, блоги), так как снижает воспринимаемое время загрузки без ущерба для UX.
Проверка корректности работы lazy loading
После реализации необходимо убедиться в корректной работе. Для этого используют:
- Chrome DevTools → Network → Images — фильтрация запросов к изображениям при прокрутке
- Google PageSpeed Insights — проверка метрик LCP, CLS, рекомендации по оптимизации
- Lighthouse (встроен в DevTools) — аудит производительности страницы
- WebPageTest.org — визуализация загрузки ресурсов на водопадной диаграмме
