updateActiveIndex.js 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. import { preload } from '../../shared/process-lazy-preloader.js';
  2. export function getActiveIndexByTranslate(swiper) {
  3. const {
  4. slidesGrid,
  5. params
  6. } = swiper;
  7. const translate = swiper.rtlTranslate ? swiper.translate : -swiper.translate;
  8. let activeIndex;
  9. for (let i = 0; i < slidesGrid.length; i += 1) {
  10. if (typeof slidesGrid[i + 1] !== 'undefined') {
  11. if (translate >= slidesGrid[i] && translate < slidesGrid[i + 1] - (slidesGrid[i + 1] - slidesGrid[i]) / 2) {
  12. activeIndex = i;
  13. } else if (translate >= slidesGrid[i] && translate < slidesGrid[i + 1]) {
  14. activeIndex = i + 1;
  15. }
  16. } else if (translate >= slidesGrid[i]) {
  17. activeIndex = i;
  18. }
  19. }
  20. // Normalize slideIndex
  21. if (params.normalizeSlideIndex) {
  22. if (activeIndex < 0 || typeof activeIndex === 'undefined') activeIndex = 0;
  23. }
  24. return activeIndex;
  25. }
  26. export default function updateActiveIndex(newActiveIndex) {
  27. const swiper = this;
  28. const translate = swiper.rtlTranslate ? swiper.translate : -swiper.translate;
  29. const {
  30. snapGrid,
  31. params,
  32. activeIndex: previousIndex,
  33. realIndex: previousRealIndex,
  34. snapIndex: previousSnapIndex
  35. } = swiper;
  36. let activeIndex = newActiveIndex;
  37. let snapIndex;
  38. const getVirtualRealIndex = aIndex => {
  39. let realIndex = aIndex - swiper.virtual.slidesBefore;
  40. if (realIndex < 0) {
  41. realIndex = swiper.virtual.slides.length + realIndex;
  42. }
  43. if (realIndex >= swiper.virtual.slides.length) {
  44. realIndex -= swiper.virtual.slides.length;
  45. }
  46. return realIndex;
  47. };
  48. if (typeof activeIndex === 'undefined') {
  49. activeIndex = getActiveIndexByTranslate(swiper);
  50. }
  51. if (snapGrid.indexOf(translate) >= 0) {
  52. snapIndex = snapGrid.indexOf(translate);
  53. } else {
  54. const skip = Math.min(params.slidesPerGroupSkip, activeIndex);
  55. snapIndex = skip + Math.floor((activeIndex - skip) / params.slidesPerGroup);
  56. }
  57. if (snapIndex >= snapGrid.length) snapIndex = snapGrid.length - 1;
  58. if (activeIndex === previousIndex) {
  59. if (snapIndex !== previousSnapIndex) {
  60. swiper.snapIndex = snapIndex;
  61. swiper.emit('snapIndexChange');
  62. }
  63. if (swiper.params.loop && swiper.virtual && swiper.params.virtual.enabled) {
  64. swiper.realIndex = getVirtualRealIndex(activeIndex);
  65. }
  66. return;
  67. }
  68. // Get real index
  69. let realIndex;
  70. if (swiper.virtual && params.virtual.enabled && params.loop) {
  71. realIndex = getVirtualRealIndex(activeIndex);
  72. } else if (swiper.slides[activeIndex]) {
  73. realIndex = parseInt(swiper.slides[activeIndex].getAttribute('data-swiper-slide-index') || activeIndex, 10);
  74. } else {
  75. realIndex = activeIndex;
  76. }
  77. Object.assign(swiper, {
  78. previousSnapIndex,
  79. snapIndex,
  80. previousRealIndex,
  81. realIndex,
  82. previousIndex,
  83. activeIndex
  84. });
  85. if (swiper.initialized) {
  86. preload(swiper);
  87. }
  88. swiper.emit('activeIndexChange');
  89. swiper.emit('snapIndexChange');
  90. if (previousRealIndex !== realIndex) {
  91. swiper.emit('realIndexChange');
  92. }
  93. if (swiper.initialized || swiper.params.runCallbacksOnInit) {
  94. swiper.emit('slideChange');
  95. }
  96. }