封装的一个手机端全屏滑动方法
最近做了一个手机端的微信分享领红包的项目,在这个项目中需要用到一个全屏滑动的功能,所以自己就根据网上查找的相关资料再通过自己的改造,封装了一个滑动的插件,这个插件可以实现以下几个功能:
- 指定水平/垂直滑动
- 指定滑动的回调函数
下面是具体的代码:
1 ;(function(root){
2 'use strict';
3 function touch(opts){
4
5 this.canvas = opts.dom;
6 this.section = opts.section;
7 this.direc = opts.direc || 'vertical';
8 this.fn = opts.fn || null;
9 this.canvas && this.bindEvent();
10 this.section && this.init();
11 }
12
13 touch.prototype.init=function(){
14
15 this.width = (window.innerWidth > 640)? 640:window.innerWidth;
16 this.height = window.innerHeight;
17 this.boundary = this.height/6;
18 this.index = 0;
19
20 this.canvas.style.cssText = 'position:relative';
21 if(this.direc != 'horiz')
22 for(var i=0,l=this.section.length;i<l;i++){
23 this.section[i].style.cssText='position:absolute;';
24 this.section[i].style.webkitTransform = "translate3d(0,"+i*this.height+"px,0)";
25 }
26 else{
27 for(var i=0,l=this.section.length;i<l;i++){
28 this.section[i].style.cssText='position:absolute;';
29 this.section[i].style.webkitTransform = "translate3d("+i*this.width+"px,0,0)";
30 }
31 }
32
33 };
34
35 touch.prototype.bindEvent=function(){
36
37 var _this = this;
38 var startx=0,starty=0,startTime=0,endTime=0,offset=0,offsety = 0;
39
40 function start(e){
41
42 startx = e.touches[0].pageX;
43 starty = e.touches[0].pageY;
44 startTime = new Date()*1;
45
46 }
47
48 function move(e){
49
50 _this.offsetx = e.touches[0].pageX - startx;
51 _this.offsety = e.touches[0].pageY - starty;
52 var i = _this.index -1,
53 m = i +3;
54 if(_this.direc != 'horiz'){
55 for(;i<m;i++){
56 _this.section[i] && (_this.section[i].style.webkitTransform = 'translate3d(0,'+ ((i - _this.index)*_this.height + _this.offsety) +'px,0)');
57 _this.section[i] && (_this.section[i].style.webkitTransition = 'none');
58 }
59 }else{
60 for(;i<m;i++){
61 _this.section[i] && (_this.section[i].style.webkitTransform = 'translate3d('+ ((i - _this.index)*_this.width + _this.offsetx) +'px,0,0)');
62 _this.section[i] && (_this.section[i].style.webkitTransition = 'none');
63 }
64 }
65 e.preventDefault();
66 e.stopPropagation();
67
68 }
69
70 function end(){
71
72 endTime = new Date()*1;
73
74 function handle(value){
75 if(endTime - startTime > 800){
76
77 if(value > _this.boundary){
78 _this.go('-1');
79 }else if(value < -_this.boundary){
80 _this.go('+1');
81 }else{
82 _this.go('0');
83 }
84 }else{
85
86 if(value>50){
87
88 _this.go('-1');
89 }else if(value <-50){
90 _this.go('+1');
91 }else{
92 _this.go('0');
93 }
94 _this.offsetx = 0;
95 _this.offsety = 0;
96 }
97 }
98
99 (_this.direc != 'horiz')?handle(_this.offsety):handle(_this.offsetx);
100
101
102 }
103
104 this.canvas.addEventListener('touchstart',start,false);
105 this.canvas.addEventListener('touchmove',move,false);
106 this.canvas.addEventListener('touchend',end,false);
107 };
108
109
110 touch.prototype.go=function(n){
111
112 var index = this.index+n*1,
113 len = this.section.length,
114 _this = this;
115
116 if(index>len-1){
117 index = len-1;
118 }else if(index <=0){
119 index = 0
120 }
121
122 function callBack(){
123 _this.fn(index,_this.section[index],_this.section,_this.canvas);
124 this.removeEventListener('webkitTransitionEnd',callBack,false);
125 }
126
127 this.section[index].style.webkitTransition = '-webkit-transform .4s ease-out';
128 this.section[index-1] && (this.section[index-1].style.webkitTransition = '-webkit-transform .4s ease-out');
129 this.section[index+1] && (this.section[index+1].style.webkitTransition = '-webkit-transform .4s ease-out');
130 this.section[index].style.webkitTransform = 'translate3d(0,0,0)';
131
132 if(this.direc != 'horiz'){
133 this.section[index-1] && (this.section[index-1].style.webkitTransform = 'translate3d(0,'+-this.height+'px,0)');
134 this.section[index+1] && (this.section[index+1].style.webkitTransform = 'translate3d(0,'+this.height +'px,0)');
135 }else{
136 this.section[index-1] && (this.section[index-1].style.webkitTransform = 'translate3d('+-this.width+'px,0,0)');
137 this.section[index+1] && (this.section[index+1].style.webkitTransform = 'translate3d('+this.width +'px,0,0)');
138 }
139
140 this.index = index;
141 this.section[index].addEventListener('webkitTransitionEnd',callBack,false);
142 };
143
144 root.touch = function(p){
145 new touch(p);
146 };
147
148 })(window);
调用方法:
1 touch({
2 'dom':document.querySelector('.box'),
3 'section': document.querySelector('section'),
4 'direc':'horiz',
5 'fn':function(i,t,s,box){}
6 });
7 /* {} 一个对象,用于提供设置的参数。
8 |— dom : 所有分屏的外层包裹盒子。
9 |— section : 所有分屏。
10 |— direc : 滑屏的方向:horiz(水平滑动,最大宽度为640)、vertical(垂直滑动)。默认值为vertical。
11 |- fn : 滑动后的回调函数,i(索引)、t(当前分屏)、s(所有的分屏)、box(分屏的外层包裹盒子)
12 */
本文来自博客园,作者:啊睦,转载请注明原文链接:https://www.cnblogs.com/fe32/p/10574781.html


浙公网安备 33010602011771号