封装的一个手机端全屏滑动方法

最近做了一个手机端的微信分享领红包的项目,在这个项目中需要用到一个全屏滑动的功能,所以自己就根据网上查找的相关资料再通过自己的改造,封装了一个滑动的插件,这个插件可以实现以下几个功能:

  •   指定水平/垂直滑动
  •   指定滑动的回调函数

下面是具体的代码:

复制代码
  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  */
posted @ 2019-03-21 21:29  啊睦  阅读(235)  评论(0编辑  收藏  举报