UNPKG

6.67 kBJavaScriptView Raw
1import { getDocument } from 'ssr-window';
2import $ from '../../shared/dom.js';
3import { now } from '../../shared/utils.js';
4export default function onTouchMove(event) {
5 const document = getDocument();
6 const swiper = this;
7 const data = swiper.touchEventsData;
8 const {
9 params,
10 touches,
11 rtlTranslate: rtl,
12 enabled
13 } = swiper;
14 if (!enabled) return;
15 let e = event;
16 if (e.originalEvent) e = e.originalEvent;
17
18 if (!data.isTouched) {
19 if (data.startMoving && data.isScrolling) {
20 swiper.emit('touchMoveOpposite', e);
21 }
22
23 return;
24 }
25
26 if (data.isTouchEvent && e.type !== 'touchmove') return;
27 const targetTouch = e.type === 'touchmove' && e.targetTouches && (e.targetTouches[0] || e.changedTouches[0]);
28 const pageX = e.type === 'touchmove' ? targetTouch.pageX : e.pageX;
29 const pageY = e.type === 'touchmove' ? targetTouch.pageY : e.pageY;
30
31 if (e.preventedByNestedSwiper) {
32 touches.startX = pageX;
33 touches.startY = pageY;
34 return;
35 }
36
37 if (!swiper.allowTouchMove) {
38 // isMoved = true;
39 swiper.allowClick = false;
40
41 if (data.isTouched) {
42 Object.assign(touches, {
43 startX: pageX,
44 startY: pageY,
45 currentX: pageX,
46 currentY: pageY
47 });
48 data.touchStartTime = now();
49 }
50
51 return;
52 }
53
54 if (data.isTouchEvent && params.touchReleaseOnEdges && !params.loop) {
55 if (swiper.isVertical()) {
56 // Vertical
57 if (pageY < touches.startY && swiper.translate <= swiper.maxTranslate() || pageY > touches.startY && swiper.translate >= swiper.minTranslate()) {
58 data.isTouched = false;
59 data.isMoved = false;
60 return;
61 }
62 } else if (pageX < touches.startX && swiper.translate <= swiper.maxTranslate() || pageX > touches.startX && swiper.translate >= swiper.minTranslate()) {
63 return;
64 }
65 }
66
67 if (data.isTouchEvent && document.activeElement) {
68 if (e.target === document.activeElement && $(e.target).is(data.focusableElements)) {
69 data.isMoved = true;
70 swiper.allowClick = false;
71 return;
72 }
73 }
74
75 if (data.allowTouchCallbacks) {
76 swiper.emit('touchMove', e);
77 }
78
79 if (e.targetTouches && e.targetTouches.length > 1) return;
80 touches.currentX = pageX;
81 touches.currentY = pageY;
82 const diffX = touches.currentX - touches.startX;
83 const diffY = touches.currentY - touches.startY;
84 if (swiper.params.threshold && Math.sqrt(diffX ** 2 + diffY ** 2) < swiper.params.threshold) return;
85
86 if (typeof data.isScrolling === 'undefined') {
87 let touchAngle;
88
89 if (swiper.isHorizontal() && touches.currentY === touches.startY || swiper.isVertical() && touches.currentX === touches.startX) {
90 data.isScrolling = false;
91 } else {
92 // eslint-disable-next-line
93 if (diffX * diffX + diffY * diffY >= 25) {
94 touchAngle = Math.atan2(Math.abs(diffY), Math.abs(diffX)) * 180 / Math.PI;
95 data.isScrolling = swiper.isHorizontal() ? touchAngle > params.touchAngle : 90 - touchAngle > params.touchAngle;
96 }
97 }
98 }
99
100 if (data.isScrolling) {
101 swiper.emit('touchMoveOpposite', e);
102 }
103
104 if (typeof data.startMoving === 'undefined') {
105 if (touches.currentX !== touches.startX || touches.currentY !== touches.startY) {
106 data.startMoving = true;
107 }
108 }
109
110 if (data.isScrolling) {
111 data.isTouched = false;
112 return;
113 }
114
115 if (!data.startMoving) {
116 return;
117 }
118
119 swiper.allowClick = false;
120
121 if (!params.cssMode && e.cancelable) {
122 e.preventDefault();
123 }
124
125 if (params.touchMoveStopPropagation && !params.nested) {
126 e.stopPropagation();
127 }
128
129 if (!data.isMoved) {
130 if (params.loop && !params.cssMode) {
131 swiper.loopFix();
132 }
133
134 data.startTranslate = swiper.getTranslate();
135 swiper.setTransition(0);
136
137 if (swiper.animating) {
138 swiper.$wrapperEl.trigger('webkitTransitionEnd transitionend');
139 }
140
141 data.allowMomentumBounce = false; // Grab Cursor
142
143 if (params.grabCursor && (swiper.allowSlideNext === true || swiper.allowSlidePrev === true)) {
144 swiper.setGrabCursor(true);
145 }
146
147 swiper.emit('sliderFirstMove', e);
148 }
149
150 swiper.emit('sliderMove', e);
151 data.isMoved = true;
152 let diff = swiper.isHorizontal() ? diffX : diffY;
153 touches.diff = diff;
154 diff *= params.touchRatio;
155 if (rtl) diff = -diff;
156 swiper.swipeDirection = diff > 0 ? 'prev' : 'next';
157 data.currentTranslate = diff + data.startTranslate;
158 let disableParentSwiper = true;
159 let resistanceRatio = params.resistanceRatio;
160
161 if (params.touchReleaseOnEdges) {
162 resistanceRatio = 0;
163 }
164
165 if (diff > 0 && data.currentTranslate > swiper.minTranslate()) {
166 disableParentSwiper = false;
167 if (params.resistance) data.currentTranslate = swiper.minTranslate() - 1 + (-swiper.minTranslate() + data.startTranslate + diff) ** resistanceRatio;
168 } else if (diff < 0 && data.currentTranslate < swiper.maxTranslate()) {
169 disableParentSwiper = false;
170 if (params.resistance) data.currentTranslate = swiper.maxTranslate() + 1 - (swiper.maxTranslate() - data.startTranslate - diff) ** resistanceRatio;
171 }
172
173 if (disableParentSwiper) {
174 e.preventedByNestedSwiper = true;
175 } // Directions locks
176
177
178 if (!swiper.allowSlideNext && swiper.swipeDirection === 'next' && data.currentTranslate < data.startTranslate) {
179 data.currentTranslate = data.startTranslate;
180 }
181
182 if (!swiper.allowSlidePrev && swiper.swipeDirection === 'prev' && data.currentTranslate > data.startTranslate) {
183 data.currentTranslate = data.startTranslate;
184 }
185
186 if (!swiper.allowSlidePrev && !swiper.allowSlideNext) {
187 data.currentTranslate = data.startTranslate;
188 } // Threshold
189
190
191 if (params.threshold > 0) {
192 if (Math.abs(diff) > params.threshold || data.allowThresholdMove) {
193 if (!data.allowThresholdMove) {
194 data.allowThresholdMove = true;
195 touches.startX = touches.currentX;
196 touches.startY = touches.currentY;
197 data.currentTranslate = data.startTranslate;
198 touches.diff = swiper.isHorizontal() ? touches.currentX - touches.startX : touches.currentY - touches.startY;
199 return;
200 }
201 } else {
202 data.currentTranslate = data.startTranslate;
203 return;
204 }
205 }
206
207 if (!params.followFinger || params.cssMode) return; // Update active index in free mode
208
209 if (params.freeMode && params.freeMode.enabled && swiper.freeMode || params.watchSlidesProgress) {
210 swiper.updateActiveIndex();
211 swiper.updateSlidesClasses();
212 }
213
214 if (swiper.params.freeMode && params.freeMode.enabled && swiper.freeMode) {
215 swiper.freeMode.onTouchMove();
216 } // Update progress
217
218
219 swiper.updateProgress(data.currentTranslate); // Update translate
220
221 swiper.setTranslate(data.currentTranslate);
222}
\No newline at end of file