Гид по технологиям

Ленивная загрузка изображений: как ускорить сайт

7 min read Оптимизация Обновлено 13 Apr 2026
Ленивая загрузка изображений для быстрой страницы
Ленивая загрузка изображений для быстрой страницы

Редактор кода открыт на ноутбуке

В современном вебе скорость и плавность интерфейса критичны. Одним из эффективных способов улучшить производительность страницы является оптимизация загрузки изображений. Ленивная загрузка — это недорогой в реализации и хорошо масштабируемый приём. Ниже вы найдёте как теорию, так и готовые фрагменты кода для внедрения.

Что такое ленивная загрузка?

Ленивная загрузка откладывает загрузку элементов (обычно изображений и iframe) до тех пор, пока они не понадобятся — то есть не окажутся в области просмотра пользователя или рядом с ней. Краткое определение: ленивная загрузка = загрузка по требованию. Это снижает первоначальную нагрузку на сеть и ускоряет отображение первого полезного контента.

Ключевые понятия:

  • Viewport — видимая область страницы в окне браузера.
  • Placeholder — временное низкокачественное изображение или сплошной фон, который отображается до подмены на финальный ресурс.
  • Intersection Observer — современный Web API для отслеживания появления элементов в viewport.

Зачем использовать ленивую загрузку?

  • Быстрая первая отрисовка: браузер не загружает все изображения одновременно.
  • Плавная прокрутка и отзывчивость интерфейса: ресурсы подгружаются по мере необходимости.
  • Экономия трафика: особенно критично для мобильных пользователей и пользователей с ограниченным трафиком.
  • Положительный эффект на SEO: скорость страницы — фактор ранжирования.

Важно: ленивую загрузку следует применять осмысленно. Для критичных «above the fold» изображений часто лучше обеспечить приоритетную загрузку.

Простая HTML-реализация

Самый быстрый способ — воспользоваться стандартным атрибутом loading, поддерживаемым большинством современных браузеров. Пример HTML:



  
Вид страницы с основным баннером
Галерея продукта
Иллюстрация процесса

Атрибут loading=”lazy” даёт браузеру указание отложить загрузку ресурса. Это простая и эффективная оптимизация для большинства сайтов.

Внешний вид страницы до применения прогрессивной подстановки изображений:

Начальная отрисовка страницы без ленивой загрузки

Ленивое улучшение качества: стратегия «LQIP → HQ»

Более продвинутый способ — подставлять сначала низкокачественный плейсхолдер (LQIP, low-quality image placeholder), а при появлении в viewport подгружать и заменять его на полноразмерный высококачественный ресурс.

HTML-пример с плейсхолдером и data-атрибутом для финального ресурса:

src="./image-one-low.webp" alt="Миниатюра: основной баннер" loading="lazy" data-src="./image-one-high.jpg" />
src="./image-two-low.webp" alt="Миниатюра: продукт" loading="lazy" data-src="./image-two-high.jpg" />
src="./image-three-low.webp" alt="Миниатюра: схема процесса" loading="lazy" data-src="./image-three-high.jpg" />

После такой разметки страница выглядит так:

Страница с низкокачественными изображениями как основными

Реализация через Intersection Observer

Intersection Observer позволяет отслеживать, когда элемент входит или выходит из области просмотра. Ниже — пошаговая структура кода и объяснение.

Выберите все изображения, помеченные для ленивой загрузки:

"use strict";
const lazyImages = document.querySelectorAll('img[loading="lazy"]');

Создайте экземпляр наблюдателя. Ниже — минимальная рабочая реализация с обработкой записей (entries):

const observer = new IntersectionObserver((entries, observer) => {
  entries.forEach((entry) => {
    if (entry.isIntersecting) {
      const lazyImage = entry.target;
      if (lazyImage.dataset && lazyImage.dataset.src) {
        lazyImage.src = lazyImage.dataset.src; // Подменяем источник на высококач. изображение
      }
      observer.unobserve(lazyImage); // Прекращаем наблюдение за этим элементом
    }
  });
});

Инициализация наблюдения для каждого изображения:

lazyImages.forEach((lazyImage) => {
  observer.observe(lazyImage);
});

Дополнительные улучшения:

  • Добавьте обработчики загрузки (onload) для плавного перехода (fade-in) после подмены src.
  • Используйте srcset и sizes для адаптивных изображений и экономии трафика.
  • Для фоновых изображений (CSS background-image) подойдёт аналогичный подход: ставим data-атрибут и затем устанавливаем стиль background-image.

Стили для плавного появления

CSS-переходы помогают скрыть резкую подмену изображения:

.lazy-img {
  filter: blur(8px);
  transition: filter 400ms, opacity 400ms;
}
.lazy-img.loaded {
  filter: blur(0);
  opacity: 1;
}

В JS после установки src назначаем класс “loaded” в обработчике onload.

Важные соображения

  • Доступность: всегда заполняйте alt для смысловых изображений. Для декоративных изображений используйте alt=”” (пустой alt), чтобы скринридеры пропускали их.
  • Критичные изображения: логотипы и ключевые баннеры “above the fold” иногда следует исключить из ленивой загрузки, чтобы не ухудшать UX.
  • Совместимость: не все старые браузеры поддерживают Intersection Observer или атрибут loading. Для них используйте полифилл.
  • Тестирование: проверяйте поведение на разных устройствах, скоростях сети и при эмуляции медленных соединений.

Когда ленивую загрузку применять не стоит

  • Страницы, где важна каждая деталь изображения при первой загрузке (например, страницы редактирования изображений).
  • В случаях, когда вы заранее знаете, что пользователь скорее всего сразу прокрутит до конца страницы (например, бесконечный лентоподобный интерфейс с предзагрузкой).
  • Для критичных «above the fold» изображений, где задержка загрузки может ухудшить первые впечатления.

Альтернативные подходы

  • Предзагрузка (preload) для ключевых изображений: .
  • Использование адаптивных изображений через srcset и picture для подгрузки оптимального размера.
  • CDN с оптимизацией изображений на лету (WebP, AVIF, автоматический ресайз).

Ментальные модели и эвристики

  • Heuristic 1: Если изображение в верхней части страницы — не лениво; если ниже — лениво.
  • Heuristic 2: Используйте LQIP, если экономите >1–2 сетевых запроса на страницу (оцените по весу страницы).
  • Heuristic 3: Комбинируйте loading=”lazy” и Intersection Observer для покрытия разных браузеров.

Матрица совместимости (обзор)

ФункцияСовременные десктоп-браузерыМобильные браузерыСтарые браузеры / IE
Атрибут loading=”lazy”Поддерживается большинствомПоддерживается большинствомМожет не поддерживаться — нужен fallback
Intersection ObserverПоддерживаетсяПоддерживаетсяПолифилл часто необходим
srcset / pictureПолная поддержкаПолная поддержкаОграничения возможны

Совет: проверяйте актуальность поддерживаемых функций на caniuse.com перед развёртыванием.

Плейбук внедрения (короткий SOP)

  1. Проанализируйте страницу: какие изображения критичны для первого впечатления.
  2. Добавьте loading=”lazy” для некритичных img.
  3. Если нужен более контролируемый подход — внедрите LQIP + data-src и Intersection Observer.
  4. Добавьте плавные CSS-переходы и обработчики onload.
  5. Проведите кросс-браузерное тестирование, включая медленные сети.
  6. Мониторьте метрики (LCP, CLS, TTFB) и корректируйте.

Чеклист для ролей

Для разработчика:

  • Выбрать стратегию: loading атрибут или Intersection Observer.
  • Реализовать подмену src и обработчики onload.
  • Обеспечить поддержку srcset и sizes.

Для тестировщика:

  • Проверить на эмуляции 3G/2G.
  • Проверить работу с отключённым JavaScript (доступность).
  • Проверить корректность alt-атрибутов и фокусируемость элементов.

Для продукта/UX:

  • Убедиться, что ключевые изображения не ухудшают первый экран.
  • Проверить визуальные артефакты при подмене изображений.

Критерии приёмки

  • Все некритичные изображения загружаются только при появлении в viewport.
  • Ключевые показатели страницы (LCP, First Contentful Paint) улучшились или не ухудшились.
  • Нет регрессий в доступности: скринридеры читают alt корректно.
  • Тесты на мобильных устройствах проходят (низкая скорость сети).

Тест-кейсы и приёмка

  • Тест 1: Открыть страницу на эмуляции 3G — проверить, что initial payload уменьшился.
  • Тест 2: Прокрутить страницу вниз медленно — каждое изображение должно подгружаться при появлении.
  • Тест 3: Отключить JS — важные изображения должны быть доступны (если это требование).
  • Тест 4: Измерить LCP до и после внедрения.

Приватность и GDPR

Ленивая загрузка сама по себе не обрабатывает персональные данные. Однако при подгрузке изображений с внешних CDN/трекеров убедитесь, что ссылки на ресурсы не раскрывают персональные идентификаторы и что вы соблюдаете правила хранения и передачи данных.

Короткие полезные сниппеты

Добавление класса loaded после загрузки:

observer = new IntersectionObserver((entries, observer) => {
  entries.forEach((entry) => {
    if (entry.isIntersecting) {
      const img = entry.target;
      if (img.dataset && img.dataset.src) {
        img.onload = () => img.classList.add('loaded');
        img.src = img.dataset.src;
      }
      observer.unobserve(img);
    }
  });
});

CSS для плавного появления уже показан выше.

Короткая методология принятия решения

  1. Оцените вес страницы и долю изображений в payload.
  2. Решите, какие изображения критичны для первого экрана.
  3. Примените loading=”lazy” для остальных или LQIP+Intersection Observer для более контролируемого UX.
  4. Тестируйте и мониторьте метрики производительности.

Быстрый глоссарий (1 строка на термин)

  • LQIP — низкокачественный плейсхолдер изображения.
  • HQ — высококачественное изображение.
  • Intersection Observer — Web API для отслеживания пересечения элементов с viewport.
  • srcset / picture — механизмы адаптивной подгрузки изображений.

Заключение

Ленивая загрузка — простой и эффективный инструмент оптимизации производительности. Для типичных сайтов достаточно добавить loading=”lazy”; для лучшего UX используйте LQIP и Intersection Observer, добавьте плавные переходы и адаптивные изображения через srcset. Обязательно протестируйте поведение на разных устройствах и сетях и не забывайте про доступность.

Важное: всегда тестируйте на реальных устройствах и в условиях низкой скорости сети, чтобы убедиться, что оптимизация даёт реальную выгоду.

Краткое резюме:

  • Ленивую загрузку можно быстро включить через loading=”lazy”.
  • Для лучших визуальных результатов — LQIP + Intersection Observer.
  • Проверьте совместимость и тестируйте UX и доступность.
Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Как открыть файлы WPS в Windows
Руководство

Как открыть файлы WPS в Windows

Скриншот всей страницы в Chrome и Firefox
Инструменты

Скриншот всей страницы в Chrome и Firefox

Исправить «Disk Unknown, Not Initialized» в Windows
Техподдержка

Исправить «Disk Unknown, Not Initialized» в Windows

Удаление игр PS5 через приложение PlayStation
Игры

Удаление игр PS5 через приложение PlayStation

Перезагрузка и выключение ПК через правила Outlook
Автоматизация

Перезагрузка и выключение ПК через правила Outlook

Идеальное резюме в Canva — пошагово
Карьера

Идеальное резюме в Canva — пошагово