Как сделать lazy loading для картинок на сайте ⋆ GifFun.ru

Как сделать lazy loading для картинок на сайте

Lazy loading (ленивая загрузка) — это техника оптимизации веб-страниц, при которой изображения загружаются не сразу при открытии страницы, а только в момент, когда пользователь прокручивает контент до их видимой области экрана (viewport). Это снижает начальное время загрузки страницы и уменьшает нагрузку на сервер.

Зачем использовать 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');

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 — визуализация загрузки ресурсов на водопадной диаграмме