123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240 |
- import {
- isObject
- } from '../../shared/utils.js';
- // import $ from '../../shared/dom.js';
- export default function Thumb({
- swiper,
- extendParams,
- on
- }) {
- extendParams({
- thumbs: {
- swiper: null,
- multipleActiveThumbs: true,
- autoScrollOffset: 0,
- slideThumbActiveClass: 'swiper-slide-thumb-active',
- thumbsContainerClass: 'swiper-thumbs',
- },
- });
- let initialized = false;
- let swiperCreated = false;
- swiper.thumbs = {
- swiper: null,
- };
- function onThumbClick() {
- const thumbsSwiper = swiper.thumbs.swiper;
- if (!thumbsSwiper) return;
- const clickedIndex = thumbsSwiper.clickedIndex;
- const clickedSlide = thumbsSwiper.clickedSlide;
- if (clickedSlide && clickedSlide.hasClass(swiper.params.thumbs.slideThumbActiveClass))
- return;
- if (typeof clickedIndex === 'undefined' || clickedIndex === null) return;
- let slideToIndex;
- if (thumbsSwiper.params.loop) {
- slideToIndex = parseInt($(thumbsSwiper.clickedSlide).attr('data-swiper-slide-index'), 10);
- } else {
- slideToIndex = clickedIndex;
- }
- if (swiper.params.loop) {
- let currentIndex = swiper.activeIndex;
- if (swiper.slides.eq(currentIndex).hasClass(swiper.params.slideDuplicateClass)) {
- swiper.loopFix();
- // eslint-disable-next-line
- swiper._clientLeft = swiper.$wrapperEl[0].clientLeft;
- currentIndex = swiper.activeIndex;
- }
- const prevIndex = swiper.slides
- .eq(currentIndex)
- .prevAll(`[data-swiper-slide-index="${slideToIndex}"]`)
- .eq(0)
- .index();
- const nextIndex = swiper.slides
- .eq(currentIndex)
- .nextAll(`[data-swiper-slide-index="${slideToIndex}"]`)
- .eq(0)
- .index();
- if (typeof prevIndex === 'undefined') slideToIndex = nextIndex;
- else if (typeof nextIndex === 'undefined') slideToIndex = prevIndex;
- else if (nextIndex - currentIndex < currentIndex - prevIndex) slideToIndex = nextIndex;
- else slideToIndex = prevIndex;
- }
- swiper.slideTo(slideToIndex);
- }
- function init() {
- const {
- thumbs: thumbsParams
- } = swiper.params;
- if (initialized) return false;
- initialized = true;
- const SwiperClass = swiper.constructor;
- if (thumbsParams.swiper instanceof SwiperClass) {
- swiper.thumbs.swiper = thumbsParams.swiper;
- Object.assign(swiper.thumbs.swiper.originalParams, {
- watchSlidesProgress: true,
- slideToClickedSlide: false,
- });
- Object.assign(swiper.thumbs.swiper.params, {
- watchSlidesProgress: true,
- slideToClickedSlide: false,
- });
- } else if (isObject(thumbsParams.swiper)) {
- const thumbsSwiperParams = Object.assign({}, thumbsParams.swiper);
- Object.assign(thumbsSwiperParams, {
- watchSlidesProgress: true,
- slideToClickedSlide: false,
- });
- swiper.thumbs.swiper = new SwiperClass(thumbsSwiperParams);
- swiperCreated = true;
- }
- swiper.thumbs.swiper.$el && swiper.thumbs.swiper.$el.addClass(swiper.params.thumbs.thumbsContainerClass);
- swiper.thumbs.swiper.on('slideClick', onThumbClick);
- return true;
- }
- function update(initial) {
- const thumbsSwiper = swiper.thumbs.swiper;
- if (!thumbsSwiper) return;
- const slidesPerView =
- thumbsSwiper.params.slidesPerView === 'auto' ?
- thumbsSwiper.slidesPerViewDynamic() :
- thumbsSwiper.params.slidesPerView;
- const autoScrollOffset = swiper.params.thumbs.autoScrollOffset;
- const useOffset = autoScrollOffset && !thumbsSwiper.params.loop;
- if (swiper.realIndex !== thumbsSwiper.realIndex || useOffset) {
- let currentThumbsIndex = thumbsSwiper.activeIndex;
- let newThumbsIndex;
- let direction;
- if (thumbsSwiper.params.loop) {
- if (
- thumbsSwiper.slides
- .eq(currentThumbsIndex)
- .hasClass(thumbsSwiper.params.slideDuplicateClass)
- ) {
- thumbsSwiper.loopFix();
- // eslint-disable-next-line
- thumbsSwiper._clientLeft = thumbsSwiper.$wrapperEl[0].clientLeft;
- currentThumbsIndex = thumbsSwiper.activeIndex;
- }
- // Find actual thumbs index to slide to
- const prevThumbsIndex = thumbsSwiper.slides
- .eq(currentThumbsIndex)
- .prevAll(`[data-swiper-slide-index="${swiper.realIndex}"]`)
- .eq(0)
- .index();
- const nextThumbsIndex = thumbsSwiper.slides
- .eq(currentThumbsIndex)
- .nextAll(`[data-swiper-slide-index="${swiper.realIndex}"]`)
- .eq(0)
- .index();
- if (typeof prevThumbsIndex === 'undefined') {
- newThumbsIndex = nextThumbsIndex;
- } else if (typeof nextThumbsIndex === 'undefined') {
- newThumbsIndex = prevThumbsIndex;
- } else if (nextThumbsIndex - currentThumbsIndex === currentThumbsIndex - prevThumbsIndex) {
- newThumbsIndex =
- thumbsSwiper.params.slidesPerGroup > 1 ? nextThumbsIndex : currentThumbsIndex;
- } else if (nextThumbsIndex - currentThumbsIndex < currentThumbsIndex - prevThumbsIndex) {
- newThumbsIndex = nextThumbsIndex;
- } else {
- newThumbsIndex = prevThumbsIndex;
- }
- direction = swiper.activeIndex > swiper.previousIndex ? 'next' : 'prev';
- } else {
- newThumbsIndex = swiper.realIndex;
- direction = newThumbsIndex > swiper.previousIndex ? 'next' : 'prev';
- }
- if (useOffset) {
- newThumbsIndex += direction === 'next' ? autoScrollOffset : -1 * autoScrollOffset;
- }
- if (
- thumbsSwiper.visibleSlidesIndexes &&
- thumbsSwiper.visibleSlidesIndexes.indexOf(newThumbsIndex) < 0
- ) {
- if (thumbsSwiper.params.centeredSlides) {
- if (newThumbsIndex > currentThumbsIndex) {
- newThumbsIndex = newThumbsIndex - Math.floor(slidesPerView / 2) + 1;
- } else {
- newThumbsIndex = newThumbsIndex + Math.floor(slidesPerView / 2) - 1;
- }
- } else if (
- newThumbsIndex > currentThumbsIndex &&
- thumbsSwiper.params.slidesPerGroup === 1
- ) {
- // newThumbsIndex = newThumbsIndex - slidesPerView + 1;
- }
- thumbsSwiper.slideTo(newThumbsIndex, initial ? 0 : undefined);
- }
- }
- // Activate thumbs
- let thumbsToActivate = 1;
- const thumbActiveClass = swiper.params.thumbs.slideThumbActiveClass;
- if (swiper.params.slidesPerView > 1 && !swiper.params.centeredSlides) {
- thumbsToActivate = swiper.params.slidesPerView;
- }
- if (!swiper.params.thumbs.multipleActiveThumbs) {
- thumbsToActivate = 1;
- }
- thumbsToActivate = Math.floor(thumbsToActivate);
- // thumbsSwiper.slides.removeClass(thumbActiveClass);
- thumbsSwiper.slides.forEach((item) => {
- item.addClass(swiper.params.slideThumbsClass);
- item.removeClass(thumbActiveClass);
- })
- if (
- thumbsSwiper.params.loop ||
- (thumbsSwiper.params.virtual && thumbsSwiper.params.virtual.enabled)
- ) {
- for (let i = 0; i < thumbsToActivate; i += 1) {
- thumbsSwiper.$wrapperEl
- .children(`[data-swiper-slide-index="${swiper.realIndex + i}"]`)
- .addClass(thumbActiveClass);
- }
- } else {
- for (let i = 0; i < thumbsToActivate; i += 1) {
- thumbsSwiper.slides[swiper.realIndex + i].addClass(thumbActiveClass);
- }
- }
- }
- on('beforeInit', () => {
- const {
- thumbs
- } = swiper.params;
- if (!thumbs || !thumbs.swiper) return;
- init();
- update(true);
- });
- on('slideChange update resize observerUpdate', () => {
- if (!swiper.thumbs.swiper) return;
- update();
- });
- on('setTransition', (_s, duration) => {
- const thumbsSwiper = swiper.thumbs.swiper;
- if (!thumbsSwiper) return;
- thumbsSwiper.setTransition(duration);
- });
- on('beforeDestroy', () => {
- const thumbsSwiper = swiper.thumbs.swiper;
- if (!thumbsSwiper) return;
- if (swiperCreated && thumbsSwiper) {
- thumbsSwiper.destroy();
- }
- });
- Object.assign(swiper.thumbs, {
- init,
- update,
- });
- }
|