thumbs.js 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  1. import { isObject } from '../../shared/utils.js';
  2. import $ from '../../shared/dom.js';
  3. export default function Thumb(_ref) {
  4. let {
  5. swiper,
  6. extendParams,
  7. on
  8. } = _ref;
  9. extendParams({
  10. thumbs: {
  11. swiper: null,
  12. multipleActiveThumbs: true,
  13. autoScrollOffset: 0,
  14. slideThumbActiveClass: 'swiper-slide-thumb-active',
  15. thumbsContainerClass: 'swiper-thumbs'
  16. }
  17. });
  18. let initialized = false;
  19. let swiperCreated = false;
  20. swiper.thumbs = {
  21. swiper: null
  22. };
  23. function onThumbClick() {
  24. const thumbsSwiper = swiper.thumbs.swiper;
  25. if (!thumbsSwiper) return;
  26. const clickedIndex = thumbsSwiper.clickedIndex;
  27. const clickedSlide = thumbsSwiper.clickedSlide;
  28. if (clickedSlide && $(clickedSlide).hasClass(swiper.params.thumbs.slideThumbActiveClass)) return;
  29. if (typeof clickedIndex === 'undefined' || clickedIndex === null) return;
  30. let slideToIndex;
  31. if (thumbsSwiper.params.loop) {
  32. slideToIndex = parseInt($(thumbsSwiper.clickedSlide).attr('data-swiper-slide-index'), 10);
  33. } else {
  34. slideToIndex = clickedIndex;
  35. }
  36. if (swiper.params.loop) {
  37. let currentIndex = swiper.activeIndex;
  38. if (swiper.slides.eq(currentIndex).hasClass(swiper.params.slideDuplicateClass)) {
  39. swiper.loopFix(); // eslint-disable-next-line
  40. swiper._clientLeft = swiper.$wrapperEl[0].clientLeft;
  41. currentIndex = swiper.activeIndex;
  42. }
  43. const prevIndex = swiper.slides.eq(currentIndex).prevAll(`[data-swiper-slide-index="${slideToIndex}"]`).eq(0).index();
  44. const nextIndex = swiper.slides.eq(currentIndex).nextAll(`[data-swiper-slide-index="${slideToIndex}"]`).eq(0).index();
  45. if (typeof prevIndex === 'undefined') slideToIndex = nextIndex;else if (typeof nextIndex === 'undefined') slideToIndex = prevIndex;else if (nextIndex - currentIndex < currentIndex - prevIndex) slideToIndex = nextIndex;else slideToIndex = prevIndex;
  46. }
  47. swiper.slideTo(slideToIndex);
  48. }
  49. function init() {
  50. const {
  51. thumbs: thumbsParams
  52. } = swiper.params;
  53. if (initialized) return false;
  54. initialized = true;
  55. const SwiperClass = swiper.constructor;
  56. if (thumbsParams.swiper instanceof SwiperClass) {
  57. swiper.thumbs.swiper = thumbsParams.swiper;
  58. Object.assign(swiper.thumbs.swiper.originalParams, {
  59. watchSlidesProgress: true,
  60. slideToClickedSlide: false
  61. });
  62. Object.assign(swiper.thumbs.swiper.params, {
  63. watchSlidesProgress: true,
  64. slideToClickedSlide: false
  65. });
  66. } else if (isObject(thumbsParams.swiper)) {
  67. const thumbsSwiperParams = Object.assign({}, thumbsParams.swiper);
  68. Object.assign(thumbsSwiperParams, {
  69. watchSlidesProgress: true,
  70. slideToClickedSlide: false
  71. });
  72. swiper.thumbs.swiper = new SwiperClass(thumbsSwiperParams);
  73. swiperCreated = true;
  74. }
  75. swiper.thumbs.swiper.$el.addClass(swiper.params.thumbs.thumbsContainerClass);
  76. swiper.thumbs.swiper.on('tap', onThumbClick);
  77. return true;
  78. }
  79. function update(initial) {
  80. const thumbsSwiper = swiper.thumbs.swiper;
  81. if (!thumbsSwiper) return;
  82. const slidesPerView = thumbsSwiper.params.slidesPerView === 'auto' ? thumbsSwiper.slidesPerViewDynamic() : thumbsSwiper.params.slidesPerView;
  83. const autoScrollOffset = swiper.params.thumbs.autoScrollOffset;
  84. const useOffset = autoScrollOffset && !thumbsSwiper.params.loop;
  85. if (swiper.realIndex !== thumbsSwiper.realIndex || useOffset) {
  86. let currentThumbsIndex = thumbsSwiper.activeIndex;
  87. let newThumbsIndex;
  88. let direction;
  89. if (thumbsSwiper.params.loop) {
  90. if (thumbsSwiper.slides.eq(currentThumbsIndex).hasClass(thumbsSwiper.params.slideDuplicateClass)) {
  91. thumbsSwiper.loopFix(); // eslint-disable-next-line
  92. thumbsSwiper._clientLeft = thumbsSwiper.$wrapperEl[0].clientLeft;
  93. currentThumbsIndex = thumbsSwiper.activeIndex;
  94. } // Find actual thumbs index to slide to
  95. const prevThumbsIndex = thumbsSwiper.slides.eq(currentThumbsIndex).prevAll(`[data-swiper-slide-index="${swiper.realIndex}"]`).eq(0).index();
  96. const nextThumbsIndex = thumbsSwiper.slides.eq(currentThumbsIndex).nextAll(`[data-swiper-slide-index="${swiper.realIndex}"]`).eq(0).index();
  97. if (typeof prevThumbsIndex === 'undefined') {
  98. newThumbsIndex = nextThumbsIndex;
  99. } else if (typeof nextThumbsIndex === 'undefined') {
  100. newThumbsIndex = prevThumbsIndex;
  101. } else if (nextThumbsIndex - currentThumbsIndex === currentThumbsIndex - prevThumbsIndex) {
  102. newThumbsIndex = thumbsSwiper.params.slidesPerGroup > 1 ? nextThumbsIndex : currentThumbsIndex;
  103. } else if (nextThumbsIndex - currentThumbsIndex < currentThumbsIndex - prevThumbsIndex) {
  104. newThumbsIndex = nextThumbsIndex;
  105. } else {
  106. newThumbsIndex = prevThumbsIndex;
  107. }
  108. direction = swiper.activeIndex > swiper.previousIndex ? 'next' : 'prev';
  109. } else {
  110. newThumbsIndex = swiper.realIndex;
  111. direction = newThumbsIndex > swiper.previousIndex ? 'next' : 'prev';
  112. }
  113. if (useOffset) {
  114. newThumbsIndex += direction === 'next' ? autoScrollOffset : -1 * autoScrollOffset;
  115. }
  116. if (thumbsSwiper.visibleSlidesIndexes && thumbsSwiper.visibleSlidesIndexes.indexOf(newThumbsIndex) < 0) {
  117. if (thumbsSwiper.params.centeredSlides) {
  118. if (newThumbsIndex > currentThumbsIndex) {
  119. newThumbsIndex = newThumbsIndex - Math.floor(slidesPerView / 2) + 1;
  120. } else {
  121. newThumbsIndex = newThumbsIndex + Math.floor(slidesPerView / 2) - 1;
  122. }
  123. } else if (newThumbsIndex > currentThumbsIndex && thumbsSwiper.params.slidesPerGroup === 1) {// newThumbsIndex = newThumbsIndex - slidesPerView + 1;
  124. }
  125. thumbsSwiper.slideTo(newThumbsIndex, initial ? 0 : undefined);
  126. }
  127. } // Activate thumbs
  128. let thumbsToActivate = 1;
  129. const thumbActiveClass = swiper.params.thumbs.slideThumbActiveClass;
  130. if (swiper.params.slidesPerView > 1 && !swiper.params.centeredSlides) {
  131. thumbsToActivate = swiper.params.slidesPerView;
  132. }
  133. if (!swiper.params.thumbs.multipleActiveThumbs) {
  134. thumbsToActivate = 1;
  135. }
  136. thumbsToActivate = Math.floor(thumbsToActivate);
  137. thumbsSwiper.slides.removeClass(thumbActiveClass);
  138. if (thumbsSwiper.params.loop || thumbsSwiper.params.virtual && thumbsSwiper.params.virtual.enabled) {
  139. for (let i = 0; i < thumbsToActivate; i += 1) {
  140. thumbsSwiper.$wrapperEl.children(`[data-swiper-slide-index="${swiper.realIndex + i}"]`).addClass(thumbActiveClass);
  141. }
  142. } else {
  143. for (let i = 0; i < thumbsToActivate; i += 1) {
  144. thumbsSwiper.slides.eq(swiper.realIndex + i).addClass(thumbActiveClass);
  145. }
  146. }
  147. }
  148. on('beforeInit', () => {
  149. const {
  150. thumbs
  151. } = swiper.params;
  152. if (!thumbs || !thumbs.swiper) return;
  153. init();
  154. update(true);
  155. });
  156. on('slideChange update resize observerUpdate', () => {
  157. if (!swiper.thumbs.swiper) return;
  158. update();
  159. });
  160. on('setTransition', (_s, duration) => {
  161. const thumbsSwiper = swiper.thumbs.swiper;
  162. if (!thumbsSwiper) return;
  163. thumbsSwiper.setTransition(duration);
  164. });
  165. on('beforeDestroy', () => {
  166. const thumbsSwiper = swiper.thumbs.swiper;
  167. if (!thumbsSwiper) return;
  168. if (swiperCreated && thumbsSwiper) {
  169. thumbsSwiper.destroy();
  170. }
  171. });
  172. Object.assign(swiper.thumbs, {
  173. init,
  174. update
  175. });
  176. }