AntonLitvinenko
@AntonLitvinenko
HTML coder

Swiper slider создает дубликаты слайдов, что делать при использовании лайтбокса?

Всем привет. попытаюсь объяснить суть вопроса.
Мне очень нравится Swiper slider, много где использую. Но возникла проблема при совмещении слайдера в режиме Loop с лайтбоксом Magnific Popup
https://dimsemenov.com/plugins/magnific-popup/
Тут есть режим галереи, код типа такой:
$(document).ready(function() {
	$('.popup-gallery').magnificPopup({
		delegate: 'a',
		type: 'image',
		tLoading: 'Loading image #%curr%...',
		mainClass: 'mfp-img-mobile',
		gallery: {
			enabled: true,
			navigateByImgClick: true,
			preload: [0,1] // Will preload 0 - before current, and 1 after the current image
		},
		image: {
			tError: '<a href="%url%">The image #%curr%</a> could not be loaded.',
			titleSrc: function(item) {
				return item.el.attr('title') + '<small>by Marsel Van Oosten</small>';
			}
		}
	});
});

Проблема в том, что в режиме Loop Swiper создает дубликаты слайдов, тоесть, слайдов 4, а создается например 8. И при использовании Magnific Popup я просматриваю 8 фото, которые повторяются, вместо 4х.
Пример слайдера из верстки, блок Our exclusive deals:
https://antonlitvin.github.io/royal-yacht/dist/
Тут слайдов 3, а по факту 5 (почему 5 а не 6 тоже кстати непонятно)
В документации
https://swiperjs.com/demos/
в блоке Loop Mode / Infinite Loop их тоже не 10, но и не в 2 раза больше.

Решением для галереи работает отключить Loop mode, но не во всех случаях мне это подходит.

Может кто сталкивался или есть идеи, я в свое время гуглил и не нагуглил, а вот сейчас снова стал вопрос.

Использовать другой слайдер вариант, но верстка уже есть.
  • Вопрос задан
  • 4234 просмотра
Решения вопроса 1
AntonLitvinenko
@AntonLitvinenko Автор вопроса
HTML coder
Мне данное решение немного не подошло (я не смог прикрутить к нему опции для видео итд), но в принципе оно рабочее, по крайней мере из того что смог найти, может кому пригодится:
$('.product-tab-gallery').each(function() {

  var items = [];
  var $gallery = $(this);
  // Get links
  $gallery.find('a.imageitem').each(function() {
    items.push($(this).attr('href'));
  });

  var uniqueItems = [];

  // Remove duplicates
  $.each(items, function(i, el) {
    if($.inArray(el, uniqueItems) === -1) {
      uniqueItems.push(el);
    }
  });

  items = [];

  // Put in Magnific format
  $.each(uniqueItems, function(i, el) {
    items.push({
      src: el,
      type: 'image'
    });
  });

  // Assign an index to each link so the clicked one is shown first
  $gallery.find('a.imageitem').each(function() {
    var $a = $(this);
    $.each(items, function(i, el) {
      if (el.src == $a.attr('href')) {
        $a.data('index', i);
        return;
      }
    });
  });

  $gallery.on('click', 'a.imageitem', function(e) {
    e.preventDefault();
    var $a = $(this);
    $.magnificPopup.open({
      type: 'image',
      items: items,
      gallery: {
        enabled: true
      }
    });

    $.magnificPopup.instance.goTo($a.data('index'));

  });

});
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
@wyzemind
Я в похожей ситуации создавал скрытый блок со ссылками на галерею и связывал его data-атрибутами со слайдером. Клацаешь на картинку в слайдере - открывается ссылка из скрытого блока, в котором нет никаких дубликатов.
Ответ написан
@EA-EKB
Я просто в инициализации magnific'а, в delegate использовал :not(.swiper-slide-duplicate).

Типа этого:
delegate: '.tile.swiper-slide:not(.swiper-slide-duplicate) a, *:not(.swiper-slide) > a',

Так просто все дубликаты отсеивает и всё. Не надо никаких скрытых блоков с нужными ссылками
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы