123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241 |
- import { getDocument } from 'ssr-window';
- import { now } from '../../shared/utils.js';
- export default function onTouchMove(event) {
- const document = getDocument();
- const swiper = this;
- const data = swiper.touchEventsData;
- const {
- params,
- touches,
- rtlTranslate: rtl,
- enabled
- } = swiper;
- if (!enabled) return;
- if (!params.simulateTouch && event.pointerType === 'mouse') return;
- let e = event;
- if (e.originalEvent) e = e.originalEvent;
- if (!data.isTouched) {
- if (data.startMoving && data.isScrolling) {
- swiper.emit('touchMoveOpposite', e);
- }
- return;
- }
- const pointerIndex = data.evCache.findIndex(cachedEv => cachedEv.pointerId === e.pointerId);
- if (pointerIndex >= 0) data.evCache[pointerIndex] = e;
- const targetTouch = data.evCache.length > 1 ? data.evCache[0] : e;
- const pageX = targetTouch.pageX;
- const pageY = targetTouch.pageY;
- if (e.preventedByNestedSwiper) {
- touches.startX = pageX;
- touches.startY = pageY;
- return;
- }
- if (!swiper.allowTouchMove) {
- if (!e.target.matches(data.focusableElements)) {
- swiper.allowClick = false;
- }
- if (data.isTouched) {
- Object.assign(touches, {
- startX: pageX,
- startY: pageY,
- prevX: swiper.touches.currentX,
- prevY: swiper.touches.currentY,
- currentX: pageX,
- currentY: pageY
- });
- data.touchStartTime = now();
- }
- return;
- }
- if (params.touchReleaseOnEdges && !params.loop) {
- if (swiper.isVertical()) {
- // Vertical
- if (pageY < touches.startY && swiper.translate <= swiper.maxTranslate() || pageY > touches.startY && swiper.translate >= swiper.minTranslate()) {
- data.isTouched = false;
- data.isMoved = false;
- return;
- }
- } else if (pageX < touches.startX && swiper.translate <= swiper.maxTranslate() || pageX > touches.startX && swiper.translate >= swiper.minTranslate()) {
- return;
- }
- }
- if (document.activeElement) {
- if (e.target === document.activeElement && e.target.matches(data.focusableElements)) {
- data.isMoved = true;
- swiper.allowClick = false;
- return;
- }
- }
- if (data.allowTouchCallbacks) {
- swiper.emit('touchMove', e);
- }
- if (e.targetTouches && e.targetTouches.length > 1) return;
- touches.currentX = pageX;
- touches.currentY = pageY;
- const diffX = touches.currentX - touches.startX;
- const diffY = touches.currentY - touches.startY;
- if (swiper.params.threshold && Math.sqrt(diffX ** 2 + diffY ** 2) < swiper.params.threshold) return;
- if (typeof data.isScrolling === 'undefined') {
- let touchAngle;
- if (swiper.isHorizontal() && touches.currentY === touches.startY || swiper.isVertical() && touches.currentX === touches.startX) {
- data.isScrolling = false;
- } else {
- // eslint-disable-next-line
- if (diffX * diffX + diffY * diffY >= 25) {
- touchAngle = Math.atan2(Math.abs(diffY), Math.abs(diffX)) * 180 / Math.PI;
- data.isScrolling = swiper.isHorizontal() ? touchAngle > params.touchAngle : 90 - touchAngle > params.touchAngle;
- }
- }
- }
- if (data.isScrolling) {
- swiper.emit('touchMoveOpposite', e);
- }
- if (typeof data.startMoving === 'undefined') {
- if (touches.currentX !== touches.startX || touches.currentY !== touches.startY) {
- data.startMoving = true;
- }
- }
- if (data.isScrolling || swiper.zoom && swiper.params.zoom && swiper.params.zoom.enabled && data.evCache.length > 1) {
- data.isTouched = false;
- return;
- }
- if (!data.startMoving) {
- return;
- }
- swiper.allowClick = false;
- if (!params.cssMode && e.cancelable) {
- e.preventDefault();
- }
- if (params.touchMoveStopPropagation && !params.nested) {
- e.stopPropagation();
- }
- let diff = swiper.isHorizontal() ? diffX : diffY;
- let touchesDiff = swiper.isHorizontal() ? touches.currentX - touches.previousX : touches.currentY - touches.previousY;
- if (params.oneWayMovement) {
- diff = Math.abs(diff) * (rtl ? 1 : -1);
- touchesDiff = Math.abs(touchesDiff) * (rtl ? 1 : -1);
- }
- touches.diff = diff;
- diff *= params.touchRatio;
- if (rtl) {
- diff = -diff;
- touchesDiff = -touchesDiff;
- }
- const prevTouchesDirection = swiper.touchesDirection;
- swiper.swipeDirection = diff > 0 ? 'prev' : 'next';
- swiper.touchesDirection = touchesDiff > 0 ? 'prev' : 'next';
- const isLoop = swiper.params.loop && !params.cssMode;
- if (!data.isMoved) {
- if (isLoop) {
- swiper.loopFix({
- direction: swiper.swipeDirection
- });
- }
- data.startTranslate = swiper.getTranslate();
- swiper.setTransition(0);
- if (swiper.animating) {
- const evt = new window.CustomEvent('transitionend', {
- bubbles: true,
- cancelable: true
- });
- swiper.wrapperEl.dispatchEvent(evt);
- }
- data.allowMomentumBounce = false;
- // Grab Cursor
- if (params.grabCursor && (swiper.allowSlideNext === true || swiper.allowSlidePrev === true)) {
- swiper.setGrabCursor(true);
- }
- swiper.emit('sliderFirstMove', e);
- }
- let loopFixed;
- if (data.isMoved && prevTouchesDirection !== swiper.touchesDirection && isLoop && Math.abs(diff) >= 1) {
- // need another loop fix
- swiper.loopFix({
- direction: swiper.swipeDirection,
- setTranslate: true
- });
- loopFixed = true;
- }
- swiper.emit('sliderMove', e);
- data.isMoved = true;
- data.currentTranslate = diff + data.startTranslate;
- let disableParentSwiper = true;
- let resistanceRatio = params.resistanceRatio;
- if (params.touchReleaseOnEdges) {
- resistanceRatio = 0;
- }
- if (diff > 0) {
- if (isLoop && !loopFixed && data.currentTranslate > (params.centeredSlides ? swiper.minTranslate() - swiper.size / 2 : swiper.minTranslate())) {
- swiper.loopFix({
- direction: 'prev',
- setTranslate: true,
- activeSlideIndex: 0
- });
- }
- if (data.currentTranslate > swiper.minTranslate()) {
- disableParentSwiper = false;
- if (params.resistance) {
- data.currentTranslate = swiper.minTranslate() - 1 + (-swiper.minTranslate() + data.startTranslate + diff) ** resistanceRatio;
- }
- }
- } else if (diff < 0) {
- if (isLoop && !loopFixed && data.currentTranslate < (params.centeredSlides ? swiper.maxTranslate() + swiper.size / 2 : swiper.maxTranslate())) {
- swiper.loopFix({
- direction: 'next',
- setTranslate: true,
- activeSlideIndex: swiper.slides.length - (params.slidesPerView === 'auto' ? swiper.slidesPerViewDynamic() : Math.ceil(parseFloat(params.slidesPerView, 10)))
- });
- }
- if (data.currentTranslate < swiper.maxTranslate()) {
- disableParentSwiper = false;
- if (params.resistance) {
- data.currentTranslate = swiper.maxTranslate() + 1 - (swiper.maxTranslate() - data.startTranslate - diff) ** resistanceRatio;
- }
- }
- }
- if (disableParentSwiper) {
- e.preventedByNestedSwiper = true;
- }
- // Directions locks
- if (!swiper.allowSlideNext && swiper.swipeDirection === 'next' && data.currentTranslate < data.startTranslate) {
- data.currentTranslate = data.startTranslate;
- }
- if (!swiper.allowSlidePrev && swiper.swipeDirection === 'prev' && data.currentTranslate > data.startTranslate) {
- data.currentTranslate = data.startTranslate;
- }
- if (!swiper.allowSlidePrev && !swiper.allowSlideNext) {
- data.currentTranslate = data.startTranslate;
- }
- // Threshold
- if (params.threshold > 0) {
- if (Math.abs(diff) > params.threshold || data.allowThresholdMove) {
- if (!data.allowThresholdMove) {
- data.allowThresholdMove = true;
- touches.startX = touches.currentX;
- touches.startY = touches.currentY;
- data.currentTranslate = data.startTranslate;
- touches.diff = swiper.isHorizontal() ? touches.currentX - touches.startX : touches.currentY - touches.startY;
- return;
- }
- } else {
- data.currentTranslate = data.startTranslate;
- return;
- }
- }
- if (!params.followFinger || params.cssMode) return;
- // Update active index in free mode
- if (params.freeMode && params.freeMode.enabled && swiper.freeMode || params.watchSlidesProgress) {
- swiper.updateActiveIndex();
- swiper.updateSlidesClasses();
- }
- if (params.freeMode && params.freeMode.enabled && swiper.freeMode) {
- swiper.freeMode.onTouchMove();
- }
- // Update progress
- swiper.updateProgress(data.currentTranslate);
- // Update translate
- swiper.setTranslate(data.currentTranslate);
- }
|