UNPKG

swiper

Version:

Most modern mobile touch slider and framework with hardware accelerated transitions

172 lines (137 loc) 5.45 kB
export default function slideTo(index, speed, runCallbacks, internal) { if (index === void 0) { index = 0; } if (speed === void 0) { speed = this.params.speed; } if (runCallbacks === void 0) { runCallbacks = true; } if (typeof index !== 'number' && typeof index !== 'string') { throw new Error("The 'index' argument cannot have type other than 'number' or 'string'. [" + typeof index + "] given."); } if (typeof index === 'string') { /** * The `index` argument converted from `string` to `number`. * @type {number} */ var indexAsNumber = parseInt(index, 10); /** * Determines whether the `index` argument is a valid `number` * after being converted from the `string` type. * @type {boolean} */ var isValidNumber = isFinite(indexAsNumber); if (!isValidNumber) { throw new Error("The passed-in 'index' (string) couldn't be converted to 'number'. [" + index + "] given."); } // Knowing that the converted `index` is a valid number, // we can update the original argument's value. index = indexAsNumber; } var swiper = this; var slideIndex = index; if (slideIndex < 0) slideIndex = 0; var params = swiper.params, snapGrid = swiper.snapGrid, slidesGrid = swiper.slidesGrid, previousIndex = swiper.previousIndex, activeIndex = swiper.activeIndex, rtl = swiper.rtlTranslate, wrapperEl = swiper.wrapperEl; if (swiper.animating && params.preventInteractionOnTransition) { return false; } var skip = Math.min(swiper.params.slidesPerGroupSkip, slideIndex); var 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'); } var translate = -snapGrid[snapIndex]; // Update progress swiper.updateProgress(translate); // Normalize slideIndex if (params.normalizeSlideIndex) { for (var 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; } } var 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) { var isH = swiper.isHorizontal(); var 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) { var _wrapperEl$scrollTo; wrapperEl.scrollTo((_wrapperEl$scrollTo = {}, _wrapperEl$scrollTo[isH ? 'left' : 'top'] = t, _wrapperEl$scrollTo.behavior = 'smooth', _wrapperEl$scrollTo)); } 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; }