Ответы пользователя по тегу Swiper
  • Как подружить lightGallery + swiper loop?

    nelliel
    @nelliel Автор вопроса
    В общем то сам придумал как решить задачку. Опишу, может пригодится кому-то.

    Нужно использовать параметр dynamic: true, в lightgalleryjs. ( https://www.lightgalleryjs.com/demos/dynamic-mode/ )

    ШАГ 1. Ищем все наши изображения внутри слайдера и записываем их url в массив с объектами.
    let itemGallery = document.getElementById('product-tab-gallery');
    	let itemGalleryImages = itemGallery.getElementsByTagName('img');
    	let realIndexSlider;
    	let itemGalleryDynamic = [];
    	for (let i = 0; i < itemGalleryImages.length; i++) {
    		const img = itemGalleryImages[i];
    		itemGalleryDynamic[i] = {
    			src: img.getAttribute('src'),
    			thumb: img.getAttribute('src'),
    		};
    	}


    ШАГ 2. Инициализируем lightgalleryjs и передаем в параметр dynamicEl - массив с объектами из найденных изображений: dynamicEl: itemGalleryDynamic,
    let itemGalleryLight = lightGallery(itemGallery, {
    		dynamic: true,
    		autoplayFirstVideo: false,
    		pager: false,
    		galleryId: "nature",
    		plugins: [lgZoom, lgThumbnail, lgAutoplay, lgVideo, lgFullscreen, lgHash],
    		mobileSettings: {
    			controls: true,
    			showCloseIcon: true,
    			download: true,
    			rotate: false
    		},
    		dynamicEl: itemGalleryDynamic,
    	});


    ШАГ 3. Инициализируем SWIPER.
    let imgSlider = new Swiper('#product-tab-gallery', {
    		speed: 800,
    		spaceBetween: 30,
    		watchOverflow: true,
    		autoHeight: true,
    		loop: true,
    	});


    ШАГ 4. Вешаем событие при клике на контейнер галереи. Ищем активный слайд по классу (swiper-slide-active), и в этом активной слайде узнаем атрибут [data-swiper-slide-index]. Этот индекс передаем методу lightgalleryjs.
    itemGallery.addEventListener('click', function (e) {
    		realIndexSlider = itemGallery.getElementsByClassName('swiper-slide-active');
    		realIndexSlider = Number(realIndexSlider[0].getAttribute('data-swiper-slide-index'));
    		console.log(realIndexSlider);
    		itemGalleryLight.openGallery(realIndexSlider);
    	});


    Всё целиком будет выглядеть так:
    HTML
    <div id="product-tab-gallery" class="swiper-container">
    
    	<div class="static-thumbnails swiper-wrapper">
    		<a data-src="img/images/choose/01.jpg" class="imageitem swiper-slide">
    			<img src="img/images/choose/01.jpg" />
    		</a>
    
    		<a data-src="img/images/choose/02.jpg" class="imageitem swiper-slide">
    			<img src="img/images/choose/02.jpg" />
    		</a>
    
    	</div>
    </div>


    JS
    let itemGallery = document.getElementById('product-tab-gallery');
    	let itemGalleryImages = itemGallery.getElementsByTagName('img');
    	let realIndexSlider;
    	let itemGalleryDynamic = [];
    	for (let i = 0; i < itemGalleryImages.length; i++) {
    		const img = itemGalleryImages[i];
    		itemGalleryDynamic[i] = {
    			src: img.getAttribute('src'),
    			thumb: img.getAttribute('src'),
    		};
    	}
    
    
    	let itemGalleryLight = lightGallery(itemGallery, {
    		dynamic: true,
    		autoplayFirstVideo: false,
    		pager: false,
    		galleryId: "nature",
    		plugins: [lgZoom, lgThumbnail, lgAutoplay, lgVideo, lgFullscreen, lgHash],
    		mobileSettings: {
    			controls: true,
    			showCloseIcon: true,
    			download: true,
    			rotate: false
    		},
    		dynamicEl: itemGalleryDynamic,
    	});
    
    	let imgSlider = new Swiper('#product-tab-gallery', {
    		speed: 800,
    		spaceBetween: 30,
    		watchOverflow: true,
    		autoHeight: true,
    		loop: true,
    	});
    
    	itemGallery.addEventListener('click', function (e) {
    		realIndexSlider = itemGallery.getElementsByClassName('swiper-slide-active');
    		realIndexSlider = Number(realIndexSlider[0].getAttribute('data-swiper-slide-index'));
    		itemGalleryLight.openGallery(realIndexSlider);
    	});


    Наверняка код можно как-то сократить и оптимизировать, но главное что и так работает)
    Ответ написан
    Комментировать