Налаштування галереї зображень товару (swiper/slider) 1С-Бітрікс

Налаштування галереї зображень товару (swiper/slider) 1С-Бітрікс Ми часто стикаємося з ситуацією, коли стандартний шаблон `catalog.element` рендерить додаткові зображення (`MORE_PHOTO`) як простий список `<img>`, без галерейної логіки. Клієнт підключає Swiper, але слайдер не працює — ініціалізаці
Послуги, які ми пропонуємо
Показано 1 з 1Усі 1626 послуг
Налаштування галереї зображень товару (swiper/slider) 1С-Бітрікс
Простий
~1 день

Наші компетенції:

Часті запитання

Останні роботи

  • Розробка сайту компанії B2B ADVANCE
    Розробка сайту компанії B2B ADVANCE
    1460
  • Розробка веб-сайту для компанії ФІКСПЕР
    Розробка веб-сайту для компанії ФІКСПЕР
    1019
  • Розробка на базі Бітрікс, Бітрікс24, 1С для компанії Development of an Online
    Розробка на базі Бітрікс, Бітрікс24, 1С для компанії Development of an Online
    764
  • Розробка на базі 1С Підприємство для компанії МИРСАНБЕЛ
    Розробка на базі 1С Підприємство для компанії МИРСАНБЕЛ
    882
  • Розробка сайту на CRM Бітрікс24 для компанії DOLBIMBY
    Розробка сайту на CRM Бітрікс24 для компанії DOLBIMBY
    809
  • Розробка на базі Бітрікс24 для компанії ТЕХНОТОРГКОМПЛЕКС
    Розробка на базі Бітрікс24 для компанії ТЕХНОТОРГКОМПЛЕКС
    1165

Налаштування галереї зображень товару (swiper/slider) 1С-Бітрікс

Ми часто стикаємося з ситуацією, коли стандартний шаблон catalog.element рендерить додаткові зображення (MORE_PHOTO) як простий список <img>, без галерейної логіки. Клієнт підключає Swiper, але слайдер не працює — ініціалізація відбувається до того, як компонент віддав HTML. Ця типова помилка порядку виконання скриптів: скрипт у <head> виконується до рендерингу компонента. Результат: порожній контейнер, помилка в консолі, втрата конверсії. Розберемо коректне налаштування на основі 10+ років досвіду розробки.

Чому стандартна галерея в Бітріксі не працює?

Компонент catalog.element збирає зображення в масив $arResult['MORE_PHOTO'], але не надає готову розмітку для слайдера. Swiper вимагає строгу структуру .swiper > .swiper-wrapper > .swiper-slide. Якщо скрипт підключений у <head>, а компонент рендериться в <body>, то new Swiper() виконується на порожній контейнер. Помилка №1: ініціалізація до завантаження DOM. Помилка №2: відсутність кешування даних "MORE_PHOTO" — при кожному запиті перестворюються файли, що сповільнює сторінку на 30%.

Як правильно ініціалізувати Swiper у картці товару?

Рішення — відкласти ініціалізацію до повного завантаження DOM. Використовуємо DOMContentLoaded або розміщуємо скрипт в епілогу шаблону. Swiper самодостатній, не вимагає jQuery, що спрощує інтеграцію. За нашими вимірами, такий підхід скорочує LCP на 200–300 мс порівняно з підключенням у <head>. Приклад правильного коду:

document.addEventListener('DOMContentLoaded', function () { const thumbsSwiper = new Swiper('#productThumbsSwiper', { slidesPerView: 4, spaceBetween: 8, watchSlidesProgress: true, }); new Swiper('#productMainSwiper', { spaceBetween: 0, thumbs: { swiper: thumbsSwiper }, keyboard: { enabled: true }, }); }); 

Дані зображень у компоненті catalog.element

Компонент віддає масив $arResult['PROPERTIES']['MORE_PHOTO']['FILE_VALUE']. Ми готуємо два розміри: мініатюру (80×80) та повнорозмірне (800×800). Це оптимально для швидкості та якості. У шаблоні template.php:

<?php $slides = []; foreach ($arResult['PROPERTIES']['MORE_PHOTO']['FILE_VALUE'] as $fileArr) { $thumb = \CFile::ResizeImageGet($fileArr['ID'], ['width' => 80, 'height' => 80], BX_RESIZE_IMAGE_PROPORTIONAL); $full = \CFile::ResizeImageGet($fileArr['ID'], ['width' => 800, 'height' => 800], BX_RESIZE_IMAGE_PROPORTIONAL); $slides[] = [ 'thumb' => $thumb['src'], 'full' => $full['src'], 'alt' => htmlspecialcharsEx($fileArr['DESCRIPTION'] ?: $arResult['NAME']), ]; } ?> 

Розмітка для Swiper

Swiper очікує строгу структуру. Нижче приклад розмітки для основного слайдера та мініатюр:

<div class="swiper product-main-swiper" id="productMainSwiper"> <div class="swiper-wrapper"> <?php foreach ($slides as $slide): ?> <div class="swiper-slide"> <img src="<?= $slide['full'] ?>" alt="Зображення товару: <?= $slide['alt'] ?>" loading="lazy"> </div> <?php endforeach; ?> </div> <div class="swiper-button-prev"></div> <div class="swiper-button-next"></div> </div> <div class="swiper product-thumbs-swiper" id="productThumbsSwiper"> <div class="swiper-wrapper"> <?php foreach ($slides as $slide): ?> <div class="swiper-slide"> <img src="<?= $slide['thumb'] ?>" alt="Мініатюра: галерея" loading="lazy"> </div> <?php endforeach; ?> </div> </div> 

Lazy loading та LCP

loading="lazy" на першому слайді вбиває LCP — браузер відкладає завантаження головного зображення товару. Перший слайд повинен завантажуватися без lazy:

foreach ($slides as $i => $slide): $loading = $i === 0 ? 'eager' : 'lazy'; 

Також варто додати fetchpriority="high" на перший слайд — це підказка браузеру підвищити пріоритет запиту. За нашими вимірами, така оптимізація скорочує LCP на 200–300 мс.

Як синхронізувати галерею з вибором SKU?

Коли користувач вибирає торгову пропозицію, Бітрікс через AJAX оновлює блок ціни та наявності. Галерея при цьому не змінюється — вона прив'язана до батьківського елемента. Щоб синхронізувати: слухати подію onSaleComponentOfferSelect (стандартна подія Бітрікса), отримувати offerId, запитувати фото пропозиції через кастомний AJAX-екшн і перестворювати слайдер з новими даними через swiper.destroy() + реініціалізацію. Ми реалізували це на 50+ проектах — алгоритм відпрацьований.

Покрокова інструкція з налаштування

  1. Аналітика: перевірити поточний шаблон catalog.element, знайти MORE_PHOTO та розміри зображень.
  2. Підготовка розмітки: створити структуру Swiper, прописати два розміри (80×80 та 800×800).
  3. Ініціалізація: помістити скрипт в епілог або обгорнути в DOMContentLoaded.
  4. Кешування: застосувати теговане кешування для MORE_PHOTO — це прискорює рендеринг на 30%.
  5. Обробка SKU: підписатися на подію onSaleComponentOfferSelect, реалізувати AJAX-запит.
  6. Оптимізація: встановити loading='eager' на перше зображення, додати fetchpriority='high'.
  7. Тестування: перевірити на мобільних та десктопі, виміряти LCP.

Що входить в роботу

Етап Деталі
Аналітика Аудит поточного шаблону, визначення точок інтеграції, замір поточних метрик продуктивності
Проектування Прототип розмітки, вибір стратегії кешування (теговане кешування для MORE_PHOTO)
Розробка Реалізація шаблону, підключення Swiper, обробка SKU, оптимізація зображень
Тестування Перевірка на мобільних пристроях, швидкість завантаження, коректна робота з кешем
Деплой Викладення на бойовий сервер, моніторинг, передача документації

Порівняння підходів до ініціалізації

Підхід LCP (приблизне значення) Складність реалізації
Ініціалізація в <head> 1200–1500 ms Низька, але нестабільна
Ініціалізація в епілогу (DOMContentLoaded) 900–1100 ms Середня, надійна
Ініціалізація після AJAX-запиту SKU 1000–1200 ms Висока, гнучка

Терміни: від 1 до 3 робочих днів залежно від складності каталогу. Вартість розраховується індивідуально — пишіть, оцінимо проект.

Гарантуємо, що галерея буде працювати без помилок і відповідати сучасним вимогам Core Web Vitals. Наш досвід — 10+ років розробки на Бітріксі, понад 50 успішних проектів.

Типові помилки при налаштуванні

  • Ініціалізація Swiper до готовності DOM (рішення вище).
  • Неправильна структура .swiper-slide (порожні або вкладені елементи).
  • Одночасне підключення двох версій Swiper (конфлікт).
  • Ігнорування подій оновлення SKU.
  • loading="lazy" на першому слайді (погіршує LCP).

Офіційна документація Swiper рекомендує ініціалізацію після повного завантаження DOM.

Залиште заявку — ми налаштуємо галерею за 1-3 дні. Отримайте консультацію інженера з 10-річним досвідом.