1 | import { getDocument } from 'ssr-window';
|
2 | import $ from '../../shared/dom.js';
|
3 | import { now } from '../../shared/utils.js';
|
4 | export 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 |
|
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 |
|
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 |
|
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;
|
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 | }
|
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 | }
|
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;
|
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 | }
|
217 |
|
218 |
|
219 | swiper.updateProgress(data.currentTranslate);
|
220 |
|
221 | swiper.setTranslate(data.currentTranslate);
|
222 | } |
\ | No newline at end of file |