export default function (index = 0, speed = this.params.speed, runCallbacks = true, internal) {
|
const swiper = this;
|
let slideIndex = index;
|
if (slideIndex < 0) slideIndex = 0;
|
|
const {
|
params, snapGrid, slidesGrid, previousIndex, activeIndex, rtlTranslate: rtl, wrapperEl,
|
} = swiper;
|
if (swiper.animating && params.preventInteractionOnTransition) {
|
return false;
|
}
|
|
const skip = Math.min(swiper.params.slidesPerGroupSkip, slideIndex);
|
let snapIndex = skip + Math.floor((slideIndex - skip) / swiper.params.slidesPerGroup);
|
if (snapIndex >= snapGrid.length) snapIndex = snapGrid.length - 1;
|
|
if ((activeIndex || params.initialSlide || 0) === (previousIndex || 0) && runCallbacks) {
|
swiper.emit('beforeSlideChangeStart');
|
}
|
|
const translate = -snapGrid[snapIndex];
|
|
// Update progress
|
swiper.updateProgress(translate);
|
|
// Normalize slideIndex
|
if (params.normalizeSlideIndex) {
|
for (let i = 0; i < slidesGrid.length; i += 1) {
|
if (-Math.floor(translate * 100) >= Math.floor(slidesGrid[i] * 100)) {
|
slideIndex = i;
|
}
|
}
|
}
|
// Directions locks
|
if (swiper.initialized && slideIndex !== activeIndex) {
|
if (!swiper.allowSlideNext && translate < swiper.translate && translate < swiper.minTranslate()) {
|
return false;
|
}
|
if (!swiper.allowSlidePrev && translate > swiper.translate && translate > swiper.maxTranslate()) {
|
if ((activeIndex || 0) !== slideIndex) return false;
|
}
|
}
|
|
let direction;
|
if (slideIndex > activeIndex) direction = 'next';
|
else if (slideIndex < activeIndex) direction = 'prev';
|
else direction = 'reset';
|
|
|
// Update Index
|
if ((rtl && -translate === swiper.translate) || (!rtl && translate === swiper.translate)) {
|
swiper.updateActiveIndex(slideIndex);
|
// Update Height
|
if (params.autoHeight) {
|
swiper.updateAutoHeight();
|
}
|
swiper.updateSlidesClasses();
|
if (params.effect !== 'slide') {
|
swiper.setTranslate(translate);
|
}
|
if (direction !== 'reset') {
|
swiper.transitionStart(runCallbacks, direction);
|
swiper.transitionEnd(runCallbacks, direction);
|
}
|
return false;
|
}
|
if (params.cssMode) {
|
const isH = swiper.isHorizontal();
|
let t = -translate;
|
if (rtl) {
|
t = wrapperEl.scrollWidth - wrapperEl.offsetWidth - t;
|
}
|
if (speed === 0) {
|
wrapperEl[isH ? 'scrollLeft' : 'scrollTop'] = t;
|
} else {
|
// eslint-disable-next-line
|
if (wrapperEl.scrollTo) {
|
wrapperEl.scrollTo({
|
[isH ? 'left' : 'top']: t,
|
behavior: 'smooth',
|
});
|
} else {
|
wrapperEl[isH ? 'scrollLeft' : 'scrollTop'] = t;
|
}
|
}
|
return true;
|
}
|
|
if (speed === 0) {
|
swiper.setTransition(0);
|
swiper.setTranslate(translate);
|
swiper.updateActiveIndex(slideIndex);
|
swiper.updateSlidesClasses();
|
swiper.emit('beforeTransitionStart', speed, internal);
|
swiper.transitionStart(runCallbacks, direction);
|
swiper.transitionEnd(runCallbacks, direction);
|
} else {
|
swiper.setTransition(speed);
|
swiper.setTranslate(translate);
|
swiper.updateActiveIndex(slideIndex);
|
swiper.updateSlidesClasses();
|
swiper.emit('beforeTransitionStart', speed, internal);
|
swiper.transitionStart(runCallbacks, direction);
|
if (!swiper.animating) {
|
swiper.animating = true;
|
if (!swiper.onSlideToWrapperTransitionEnd) {
|
swiper.onSlideToWrapperTransitionEnd = function transitionEnd(e) {
|
if (!swiper || swiper.destroyed) return;
|
if (e.target !== this) return;
|
swiper.$wrapperEl[0].removeEventListener('transitionend', swiper.onSlideToWrapperTransitionEnd);
|
swiper.$wrapperEl[0].removeEventListener('webkitTransitionEnd', swiper.onSlideToWrapperTransitionEnd);
|
swiper.onSlideToWrapperTransitionEnd = null;
|
delete swiper.onSlideToWrapperTransitionEnd;
|
swiper.transitionEnd(runCallbacks, direction);
|
};
|
}
|
swiper.$wrapperEl[0].addEventListener('transitionend', swiper.onSlideToWrapperTransitionEnd);
|
swiper.$wrapperEl[0].addEventListener('webkitTransitionEnd', swiper.onSlideToWrapperTransitionEnd);
|
}
|
}
|
|
return true;
|
}
|