БонусБесплатный первый месяц абонентской поддержки при заказе разработки «под ключ»

Ленивая загрузка изображений (lazy load) в интернет-магазине

Ленивая загрузка изображений (lazy load) в интернет-магазине на 1С-Битрикс: loading=lazy, WebP, CLS, LCP

Каталог интернет-магазина — это десятки изображений на одном экране. Если браузер честно грузит их все сразу при открытии страницы, первая загрузка растягивается на секунды, а на мобильном интернете превращается в мучение. Пользователь видит белый экран, теряет терпение и уходит. Ленивая загрузка решает ровно эту проблему — но только если её настроить правильно, а не «повесить lazy на всё подряд».

В этой статье разберём, как настроить ленивую загрузку изображений (lazy load) в интернет-магазине на 1С-Битрикс: чем нативный механизм отличается от JS, что нельзя откладывать, как не сломать вёрстку и как связать всё это с WebP. Ленивая загрузка — часть общей работы над скоростью, поэтому мы опираемся на услугу оптимизации JavaScript, CSS и изображений (WebP, lazy load).

Коротко

  • Lazy load откладывает загрузку изображений ниже экрана — первая загрузка становится легче и быстрее.
  • Для большинства случаев хватает нативного loading="lazy" без JavaScript.
  • Главное изображение (LCP) откладывать нельзя — ему, наоборот, дают приоритет.
  • Без резервирования места под картинки ленивая загрузка ломает вёрстку и портит CLS.

Зачем магазину ленивая загрузка

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

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

Суть приёма: не грузить то, что пользователь пока не видит. На каталоге с 40 товарами на экран это может означать загрузку 6–8 изображений вместо всех сразу при первом рендере.

Как это работает технически

Механика ленивой загрузки сводится к простой идее: браузер определяет, находится ли изображение близко к видимой области, и грузит его только тогда. Реализуется это двумя способами:

Оба подхода делают одно и то же — откладывают загрузку, — но нативный проще, надёжнее и не зависит от выполнения скриптов. JS нужен там, где нативного механизма не хватает: фоновые изображения, тонкие пороги срабатывания, плейсхолдеры с плавным появлением.

От номенклатуры до витрины каталога Номенклатуратовары из 1ССвойства и SKUхарактеристикиКарточкафото, описаниеИндекспоиск и фильтрКаталогвитрина клиенту
Схема: номенклатура из 1С обрастает свойствами и торговыми предложениями, наполняется контентом карточки и индексируется — так формируется витрина, по которой ищут и фильтруют.

Нативный loading=lazy против JS

Выбор между нативным атрибутом и скриптом — первое решение при внедрении. Сравним.

КритерийНативный loading=lazyJS (IntersectionObserver)
Зависимость от JSНетДа
Простота внедренияОдин атрибутСкрипт + разметка
Фоновые изображенияНе поддерживаетПоддерживает
Плейсхолдеры и эффектыОграниченноГибко
Обработка роботамиКорректнаяЗависит от реализации

Практический вывод: начинайте с нативного loading="lazy" для тегов img — он покрывает 90% случаев в каталоге и карточке. JS добавляйте точечно для фоновых картинок и особых эффектов. Гнаться за тяжёлыми библиотеками ленивой загрузки, когда есть нативный механизм, нет смысла.

Что нельзя откладывать: LCP

Главная ошибка при внедрении — повесить lazy на все изображения без разбора. Так вы замедляете именно то, что должно появиться первым. Ключевое понятие здесь — LCP (Largest Contentful Paint), метрика появления самого крупного видимого элемента, которым на карточке товара обычно и является главное изображение.

Правило распределения простое:

То есть ленивая загрузка — это не «включить везде», а осознанное разделение: приоритет тому, что на экране, отсрочка тому, что вне его.

Резервирование места и CLS

Вторая частая беда — прыгающая вёрстка. Когда ленивое изображение подгружается, а место под него не было зарезервировано, контент внезапно сдвигается вниз. Это ухудшает метрику CLS (Cumulative Layout Shift) и раздражает пользователя, который уже начал читать или тянулся к кнопке.

  1. Задайте размеры. Атрибуты width и height на теге img дают браузеру знать пропорции заранее.
  2. Или aspect-ratio. Через CSS зафиксируйте соотношение сторон контейнера изображения.
  3. Плейсхолдер. Фон или размытая миниатюра на месте будущей картинки убирают «пустоту».
  4. Проверьте CLS. После внедрения убедитесь, что сдвиг макета не вырос.

Ленивая загрузка без резервирования места часто вредит больше, чем помогает: вы выиграли на скорости, но проиграли на стабильности макета. Эти две вещи всегда идут в паре.

Связка с WebP и адаптивными картинками

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

Про то, как скорость каталога складывается из этих приёмов в целом, — в статье про скорость каталога и lazy load в Битрикс. Корректные размеры изображений товаров удобно генерировать средствами ресайза Битрикс на этапе вывода.

Фоновые изображения

Нативный loading="lazy" работает только для тегов img и picture — фоновые изображения, заданные через CSS background-image, он не откладывает. А в магазинах фоном часто выводят баннеры, промо-блоки и декоративные изображения категорий.

Для них нужен JS на IntersectionObserver: скрипт отслеживает приближение блока к экрану и добавляет класс или подставляет фон только тогда. Альтернатива — по возможности переводить значимые изображения с фона на теги img, чтобы задействовать нативный механизм и корректную индексацию. Декоративный фон, не несущий смысла, часто проще просто облегчить, чем откладывать.

Внедрение в шаблоны 1С-Битрикс

Изображения товаров в 1С-Битрикс выводятся в шаблонах компонентов каталога — списка (bitrix:catalog.section) и карточки (bitrix:catalog.element). Внедрение ленивой загрузки — это правка этих шаблонов.

  1. Разделите приоритеты. Главному изображению карточки — eager и приоритет, остальным img — loading="lazy".
  2. Добавьте размеры. Выводите width/height или задайте aspect-ratio в CSS плитки.
  3. Подключите WebP. Отдавайте изображения через picture с WebP-источником и ресайзом под место вывода.
  4. Обработайте фон. Для фоновых баннеров подключите JS-ленивость на IntersectionObserver.
  5. Проверьте кэш. Убедитесь, что композитный сайт и кэш компонентов не мешают корректной отдаче.

Если ленивая загрузка и оптимизация изображений оформляются как переиспользуемый функционал для нескольких проектов, полезен подход из статьи про разработку модуля на Битрикс, а вопросы деплоя таких правок — в материале про CI/CD и деплой Битрикс.

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

Частый страх — «а не пропадут ли картинки из поиска?». При правильной реализации нет. Нативный loading="lazy" корректно обрабатывается поисковыми роботами, и изображения индексируются как обычно.

Измерение эффекта

Оптимизацию нельзя делать вслепую — эффект измеряют до и после.

Частые ошибки

Чек-лист внедрения

  1. Приоритеты разделены. LCP-изображение грузится сразу, остальное — lazy.
  2. Нативный механизм. loading="lazy" на тегах img, JS — только для фона и эффектов.
  3. Место зарезервировано. width/height или aspect-ratio у всех ленивых изображений.
  4. WebP и srcset. Лёгкие форматы и адаптивные размеры под устройство.
  5. Ресайз настроен. Изображения генерируются под фактическое место вывода.
  6. Фон обработан. Для фоновых баннеров подключена JS-ленивость или они облегчены.
  7. SEO проверено. Alt на месте, картинки индексируются, робот видит src.
  8. Эффект измерен. Вес загрузки, LCP и CLS проверены до и после.

Вывод

Ленивая загрузка — одна из самых эффективных оптимизаций магазина при минимальных затратах, но только при аккуратном внедрении. Смысл не в том, чтобы «включить lazy везде», а в осознанном разделении: приоритет тому, что на экране (особенно LCP-изображению), и отсрочка тому, что вне его, с обязательным резервированием места под картинки.

Максимальный эффект даёт связка ленивой загрузки с WebP, адаптивными размерами и корректным ресайзом. Внедрите это в шаблоны каталога и карточки, измерьте Core Web Vitals до и после — и магазин начнёт открываться заметно быстрее, особенно на мобильных, где скорость решает больше всего.

Частые вопросы

Что такое ленивая загрузка изображений простыми словами?

Ленивая загрузка (lazy load) — это подход, при котором изображения ниже видимой части экрана не грузятся сразу, а подгружаются по мере прокрутки страницы. Браузер сначала отдаёт то, что пользователь видит, а картинки в глубине страницы откладывает. Для каталога с десятками товаров на экране это резко снижает объём загрузки при первом открытии и ускоряет появление страницы.

Нужен ли отдельный скрипт или хватает нативного loading=lazy?

В большинстве случаев хватает нативного атрибута loading="lazy" — он поддерживается современными браузерами и не требует JavaScript. Отдельный JS-скрипт (на IntersectionObserver) нужен для более тонкого контроля: подгрузка фоновых изображений, плейсхолдеры, разные пороги срабатывания. Начинать стоит с нативного варианта и добавлять скрипт только там, где нативного механизма не хватает.

Почему нельзя вешать lazy load на все изображения подряд?

Изображения в видимой части экрана, особенно главное изображение (LCP-элемент), нельзя откладывать — иначе вы замедляете именно то, что должно появиться первым. Ленивую загрузку применяют только к картинкам ниже первого экрана. Для приоритетного изображения, наоборот, используют loading="eager" и подсказку fetchpriority="high", чтобы браузер загрузил его раньше остального.

Как ленивая загрузка связана с CLS и вёрсткой?

Если под ленивое изображение не зарезервировать место, при его подгрузке контент прыгает вниз — это ухудшает метрику CLS (сдвиг макета). Чтобы этого избежать, у изображений задают атрибуты width и height или aspect-ratio через CSS, чтобы браузер заранее знал размеры и оставил место. Ленивая загрузка без резервирования места часто вредит больше, чем помогает.

Как сочетать lazy load с форматом WebP?

Это две разные оптимизации, которые работают вместе: WebP уменьшает вес каждого изображения, а lazy load сокращает число изображений, загружаемых сразу. В Битрикс WebP можно отдавать через тег picture с несколькими источниками или на уровне сервера, а lazy load вешать на теги img. Максимальный эффект даёт связка: лёгкие WebP-картинки плюс отложенная загрузка тех, что вне экрана.

Влияет ли ленивая загрузка на SEO и индексацию картинок?

Нативный loading="lazy" корректно обрабатывается поисковыми роботами, и изображения индексируются. Проблемы возникают, если картинки грузятся только сложным JS, который робот не выполняет, или если реальный src подставляется скриптом без разметки. При нативном подходе и корректных атрибутах alt ленивая загрузка не вредит поиску по картинкам, а ускорение страницы, наоборот, помогает ранжированию.

Как включить ленивую загрузку в шаблоне 1С-Битрикс?

Изображения товаров выводятся в шаблонах компонентов каталога (список и карточка). В шаблоне к тегам img ниже первого экрана добавляют loading="lazy" и размеры, а к главному изображению карточки — loading="eager" и приоритет. Если вёрстка использует фоновые изображения, для них подключают JS на IntersectionObserver. Массовую генерацию нужных размеров изображений удобно завязать на ресайз Битрикс.

Как проверить, что ленивая загрузка реально ускорила магазин?

Измеряйте до и после по Core Web Vitals: LCP (появление главного контента), CLS (сдвиг макета) и общий вес страницы. Инструменты вроде Lighthouse и PageSpeed показывают число и вес загруженных изображений при первом рендере. Если после внедрения падает вес первой загрузки и улучшается LCP на мобильных, а CLS остаётся низким, значит, ленивая загрузка настроена правильно.

Поделиться:

Магазин долго грузится и теряет покупателей?

Настроим ленивую загрузку, WebP и приоритеты LCP, уберём тяжёлый JS и CSS — ускорим каталог и карточки. Рассчитаем работу по вашему сайту.

Редакция B2Bsite

Команда B2Bsite. С 2014 года разрабатываем и ускоряем интернет-магазины на 1С-Битрикс: ленивая загрузка, WebP, оптимизация фронтенда и Core Web Vitals для быстрых каталогов и карточек.

← Все статьи блога