JS封装移动端触摸滑动插件应用于导航banner【精装版】

自己封装了一个小插件,一个小尝试。 可用于类似于京东导航等效果,效果多样化,很方便。 欢迎大家提点意见。

mrChenSwiper(  {parent, child, type, parentN, childN, goli,lisname}  );

mrChenSwipe({

parent  :  父盒子 [父盒子的高度会继承父级] ,  必填

child  :  子盒子 [ul,子盒子需要用ul>li>a],  必填

type  :  滑动方向 [vertical || level],  必填

parentN  :  垂直-父盒子宽度  ~ 默认值200  ||  水平-父盒子高度 ~ 默认值200,  选填

childN  :  垂直-li高度  ~ 默认值40  ||  水平-li宽度  ~  默认值80,  选填

goli  :  是否开启点击导航  [true || false],  选填

lisname  :  选中标签类名  ~  默认值 'current' 选填

})

注意:请传入原生DOM对象。   

0 function mrChenSwipe(obj) {
1/*
2 startD   //开始的坐标
3 moveD    //滑动时的坐标
4 goD //改变的距离
5 lis    //获取所有li
6 distance        //吸附距离
7 maxPosition     //最小定位区间
8 minSwipe //滑动最小定位区间
9 maxSwipe //滑动最大定位区间
10 currSwipe //当前定位
11 xy //XY
12 */
13 
14 var parent = obj.parent,
15 child = obj.child,
16 type = obj.type,
17 goli = obj.goli,
18 lisname = obj.lisname || 'current',
19 startD = 0,
20 moveD = 0,
21 goD = 0,
22 lis = child.querySelectorAll('li'),
23 lisLength = lis.length,
24 distance = 100,
25 maxPosition = 0,
26 minSwipe, maxSwipe, currSwipe = 0,
27 xy;
28 
29 
30 /*加过渡*/
31 var addTransition = function(elm) {
32 
33 elm.style.webkitTransition = 'all 0.2s'; /*兼容*/
34 
35 elm.style.transition = 'all 0.2s';
36 
37 };
38 
39 /*删除过渡*/
40 var removeTransition = function(elm) {
41 
42 elm.style.webkitTransition = 'none'; /*兼容*/
43 
44 elm.style.transition = 'none';
45 
46 };
47 
48 //设置定位
49 var setTranslate = function(elm, direction, num) {
50 
51 if (direction == 'y') {
52 
53 elm.style.webkitTransform = 'translateY(' + num + 'px)'; /*兼容*/
54 
55 elm.style.transform = 'translateY(' + num + 'px)';
56 
57 }
58 
59 if (direction == 'x') {
60 
61 elm.style.webkitTransform = 'translateX(' + num + 'px)'; /*兼容*/
62 
63 elm.style.transform = 'translateX(' + num + 'px)';
64 
65 }
66 
67 };
68 
69 
70 
71 //判断如果为上下滑动,获取宽高
72 //垂直
73 if (type == 'vertical') {
74 
75 //默认宽度
76 parentN = obj.parentN || 200;
77 
78 //li默认高度
79 childN = obj.childN || 40;
80 
81 parent.style.width = parentN + 'px';
82 
83 parent.style.height = '100%';
84 
85 var parentWH = parent.offsetHeight;
86 
87 var childWH = childN * lisLength;
88 
89 //获取定位最小区间
90 minPosition = parentWH - childWH;
91 
92 minSwipe = minPosition - distance;
93 
94 maxSwipe = maxPosition + distance;
95 
96 setTranslate(child, 'y', 0);
97 
98 goV();
99 
100 }
101 
102 //水平
103 if (type == 'level') {
104 
105 //默认高度
106 parentN = obj.parentN || 200;
107 
108 //li默认宽度
109 childN = obj.childN || 80;
110 
111 //父盒子默认100%宽度
112 parent.style.width = document.documentElement.clientWidth + 'px';
113 
114 parent.style.height = parentN + 'px';
115 
116 //子盒子宽度
117 child.style.width = lisLength * childN + 'px';
118 
119 child.style.height = parentN + 'px';
120 
121 var parentWH = parent.offsetWidth;
122 
123 var childWH = childN * lisLength;
124 
125 //获取定位最小区间
126 minPosition = parentWH - childWH;
127 
128 minSwipe = minPosition - distance;
129 
130 maxSwipe = maxPosition + distance;
131 
132 setTranslate(child, 'x', 0);
133 
134 goL();
135 
136 }
137 
138 //水平初始化
139 
140 function goL() {
141 
142 var i = 0;
143 
144 for (i; i < lisLength; i += 1) {
145 
146 lis[i].style.width = childN + 'px';
147 
148 lis[i].style.height = '100%';
149 
150 lis[i].style.textAlign = 'center';
151 
152 lis[i].style.lineHeight = parentN + 'px';
153 
154 lis[i].style.float = 'left';
155 
156 aStyle(lis[i]);
157 
158 }
159 
160 }
161 
162 //垂直初始化
163 
164 function goV() {
165 
166 var i = 0;
167 
168 for (i; i < lisLength; i += 1) {
169 
170 lis[i].style.width = '100%';
171 
172 lis[i].style.height = childN + 'px';
173 
174 lis[i].style.textAlign = 'center';
175 
176 lis[i].style.lineHeight = childN + 'px';
177 
178 aStyle(lis[i]);
179 
180 }
181 }
182 
183 //给a设置style
184 
185 function aStyle(dom) {
186 
187 dom.querySelector('a').style.display = 'block';
188 
189 dom.querySelector('a').style.height = '100%';
190 
191 dom.querySelector('a').style.color = '#333';
192 
193 dom.querySelector('a').style.textDecoration = 'none';
194 
195 }
196 
197 //子盒子绑定滑动事件
198 child.addEventListener('touchstart', function(e) {
199 
200 if (type == 'vertical') {
201 
202 startD = e.touches[0].clientY;
203 
204 }
205 
206 if (type == 'level') {
207 
208 startD = e.touches[0].clientX;
209 
210 }
211 
212 })
213 
214 
215 //滑动中
216 child.addEventListener('touchmove', function(e) {
217 
218 if (type == 'vertical') {
219 
220 moveD = e.touches[0].clientY;
221 
222 xy = 'y';
223 
224 }
225 
226 if (type == 'level') {
227 
228 moveD = e.touches[0].clientX;
229 
230 xy = 'x';
231 }
232 
233 goD = moveD - startD + currSwipe;
234 
235 removeTransition(child);
236 
237 if (goD > minSwipe && goD < maxSwipe) {
238 
239 setTranslate(child, xy, goD);
240 
241 }
242 
243 })
244 
245 //滑动结束
246 window.addEventListener('touchend', function() {
247 
248 //最终定位
249 if (goD > maxPosition) {
250 
251 currSwipe = maxPosition;
252 
253 addTransition(child);
254 
255 setTranslate(child, xy, currSwipe);
256 
257 } else if (goD < minPosition) {
258 
259 currSwipe = minPosition;
260 
261 console.log(minPosition);
262 
263 addTransition(child);
264 
265 setTranslate(child, xy, currSwipe);
266 } else {
267 
268 currSwipe = goD;
269 
270 }
271 
272 startD = 0;
273 moveD = 0;
274 goD = 0;
275 
276 })
277 
278 
279 //如果开启单机索引
280 if (goli) {
281 
282 //循环绑定点击事件
283 for (var j = 0; j < lisLength; j += 1) {
284 
285 lis[j].index = j;
286 
287 tap(lis[j], function(e) {
288 
289 if (type == 'level') {
290 xy = 'x';
291 }
292 
293 if (type == 'vertical') {
294 xy = 'y';
295 }
296 
297 //找到父元素
298 var li = e.target.parentNode;
299 
300 for (var n = 0; n < lisLength; n += 1) {
301 
302 lis[n].className = '';
303 
304 }
305 
306 li.className = lisname;
307 
308 //计算位置
309 var tapGoD = -li.index * childN;
310 
311 if (tapGoD > minPosition) {
312 
313 currSwipe = tapGoD;
314 
315 addTransition(child);
316 
317 setTranslate(child, xy, currSwipe);
318 
319 } else {
320 
321 currSwipe = minPosition;
322 
323 setTranslate(child, xy, currSwipe);
324 
325 }
326 
327 })
328 
329 }
330 
331 }
332 
333 //封装单机事件
334 
335 function tap(dom, callback) {
336 
337 /*判断dom是不是一个对象 如果是才给他绑定事件*/
338 if (typeof dom == 'object') {
339 
340 /*判断是否滑动过*/
341 var isMove = false;
342 
343 /*记录刚刚触摸到屏幕的时候的时间*/
344 var time = 0;
345 
346 dom.addEventListener('touchstart', function(e) {
347 
348 /*刚刚触摸到屏幕的时候的时间*/
349 time = Date.now();
350 
351 });
352 
353 dom.addEventListener('touchmove', function(e) {
354 
355 /*设置为true*/
356 isMove = true;
357 
358 });
359 
360 window.addEventListener('touchend', function(e) {
361 
362 /*
363  * tap事件的要求
364  *1.没有滑动过
365  *2.响应时间在150ms以内
366  * */
367 if (!isMove && (Date.now() - time) < 150) {
368 
369 /*为了提高响应的速度*/
370 callback && callback(e);
371 
372 }
373 
374 isMove = false;
375 time = 0;
376 
377 });
378 
379 }
380 };
381 }

   插件下载地址:百度网盘 欢迎共同探讨!

 

查看原文-摘自大公爵ddamy.com

转载于:https://www.cnblogs.com/webhb/p/5755712.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值