translateTo.js 2.13 KB
Newer Older
xhw committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90
import {
	animateCSSModeScroll
} from '../../shared/utils.js';
export default function translateTo(translate = 0, speed = this.params.speed, runCallbacks = true, translateBounds =
	true, internal) {
	const swiper = this;
	let timer;
	const {
		params,
		wrapperEl
	} = swiper;

	if (swiper.animating && params.preventInteractionOnTransition) {
		return false;
	}

	const minTranslate = swiper.minTranslate();
	const maxTranslate = swiper.maxTranslate();
	let newTranslate;
	if (translateBounds && translate > minTranslate) newTranslate = minTranslate;
	else if (translateBounds && translate < maxTranslate) newTranslate = maxTranslate;
	else newTranslate = translate; // Update progress

	swiper.updateProgress(newTranslate);

	if (params.cssMode) {
		const isH = swiper.isHorizontal();

		if (speed === 0) {
			wrapperEl[isH ? 'scrollLeft' : 'scrollTop'] = -newTranslate;
		} else {
			if (!swiper.support.smoothScroll) {
				animateCSSModeScroll({
					swiper,
					targetPosition: -newTranslate,
					side: isH ? 'left' : 'top'
				});
				return true;
			}

			wrapperEl.scrollTo({
				[isH ? 'left' : 'top']: -newTranslate,
				behavior: 'smooth'
			});
		}

		return true;
	}

	if (speed === 0) {
		swiper.setTransition(0);
		swiper.setTranslate(newTranslate);

		if (runCallbacks) {
			swiper.emit('beforeTransitionStart', speed, internal);
			swiper.emit('transitionEnd');
		}
	} else {
		swiper.setTransition(speed);
		swiper.setTranslate(newTranslate);

		if (runCallbacks) {
			swiper.emit('beforeTransitionStart', speed, internal);
			swiper.emit('transitionStart');
		}

		if (!swiper.animating) {
			swiper.animating = true;

			if (!swiper.onTranslateToWrapperTransitionEnd) {
				swiper.onTranslateToWrapperTransitionEnd = function transitionEnd(e) {
					if (!swiper || swiper.destroyed) return;
					if (e.target !== this) return;
					clearTimeout(timer)
					swiper.onTranslateToWrapperTransitionEnd = null;
					delete swiper.onTranslateToWrapperTransitionEnd;

					if (runCallbacks) {
						swiper.emit('transitionEnd');
					}
				};
			}
			timer = setTimeout(() => {
				swiper.onTranslateToWrapperTransitionEnd();
			}, speed)
		}
	}

	return true;
}