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

Наша компанія займається розробкою, підтримкою та обслуговуванням рішень на Бітрікс та Бітрікс24 будь-якої складності. Від простих односторінкових сайтів до складних інтернет-магазинів, CRM систем з інтеграцією 1С та телефонії. Досвід розробників підтверджено сертифікатами від вендора.
Пропоновані послуги
Показано 1 з 1 послугУсі 1626 послуг
Налаштування галереї зображень товару (swiper/slider) 1С-Бітрікс
Проста
~1 робочий день
Часті питання

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

Етапи розробки

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

  • image_website-b2b-advance_0.png
    Розробка сайту компанії B2B ADVANCE
    1262
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Розробка веб-сайту для компанії ФІКСПЕР
    851
  • image_bitrix-bitrix-24-1c_development_of_an_online_appointment_booking_widget_for_a_medical_center_594_0.webp
    Розробка на базі Бітрікс, Бітрікс24, 1С для компанії Development of an Online
    585
  • image_bitrix-bitrix-24-1c_mirsanbel_458_0.webp
    Розробка на базі 1С Підприємство для компанії МИРСАНБЕЛ
    751
  • image_crm_dolbimby_434_0.webp
    Розробка сайту на CRM Бітрікс24 для компанії DOLBIMBY
    657
  • image_crm_technotorgcomplex_453_0.webp
    Розробка на базі Бітрікс24 для компанії ТЕХНОТОРГКОМПЛЕКС
    989

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

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

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

Компонент збирає всі зображення товара в $arResult['MORE_PHOTO'] — масив шляхів до вже ресайзених картинок. Оригіналі зберігаються в b_iblock_element.DETAIL_PICTURE та властивості MORE_PHOTO (тип F, множественное). Для слайдера зазвичай потрібні два розміри: мініатюра для превью-смуги та повнорозмірна для основного слайду.

У шаблоні 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 очікує строгу структуру .swiper > .swiper-wrapper > .swiper-slide. Будь-яке відхилення — і бібліотека не знайде слайди. Основний слайдер та слайдер мініатюр — два окремі екземпляри Swiper, пов'язані через параметр thumbs.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>

Ініціалізація та порядок скриптів

Ключова проблема Бітрікса: $APPLICATION->AddHeadScript() додає скрипти в <head>, а компонент рендерится пізніше в <body>. Swiper підключений в head, але new Swiper() викликається в inline-скрипті шаблону — DOM ще не готів.

Правильне рішення — відкладена ініціалізація через DOMContentLoaded або через пролог/епілог. У шаблоні компонента:

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 },
    });
});

Lazy loading та LCP

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

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

Також варто додати fetchpriority="high" на перший слайд — це підказка браузеру підвищити приоритет запросу.

Зміна зображень при виборі SKU

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