HTML5滑动(swipe)事件

移动H5开发中经常用到滑动效果(页面上移、下移、向左滑动、向右滑动等),浏览器并没有内置swipe事件,可以通过touch事件(touchstart、touchmove和touchend)模拟swipe效果。jQuery mobile和zeptojs提供了swipe事件。jquery mobile只有swipeLeft和swipeRight,zeptojs提供了完整的tap和swipe事件。

  1 /**
  2 * @author [email protected]
  3 * http://git.oschina.net/accountwcx/rhui
  4 *
  5 * swipe事件,包括swipeLeft、swipeRight、swipeUp、swipeDown。
  6 * 调用方法
  7 * Rhui.mobile.swipeLeft(el, callback, options)
  8 * Rhui.mobile.swipeRight(el, callback, options)
  9 * Rhui.mobile.swipeUp(el, callback, options)
 10 * Rhui.mobile.swipeDown(el, callback, options)
 11 * 如果使用jQuery,调用方法
 12 * $(el).rhuiSwipe(‘swipeLeft‘, callback, options);
 13 * $(el).rhuiSwipe(‘swipeRight‘, callback, options);
 14 * $(el).rhuiSwipe(‘swipeUp‘, callback, options);
 15 * $(el).rhuiSwipe(‘swipeDown‘, callback, options);
 16 */
 17 (function(window, $){
 18     var Rhui = window.Rhui || {};
 19     window.Rhui = Rhui;
 20     Rhui.mobile = (function(){
 21         var touch = {
 22             distance: 30,  //滑动距离,超过该距离触发swipe事件,单位像素。
 23             duration: 1000 //滑动时长,超过该时间不触发swipe,单位毫秒。
 24         };
 25
 26         /**
 27         * 绑定事件
 28         * @param  el        触发事件的元素
 29         * @param  swipe     事件名称,可选值为swipeLeft,swipeRight,swipeUp,swipeDown
 30         * @param  callback  事件回调函数
 31         * @param  isStopPropagation   是否停止冒泡,true为停止冒泡
 32         * @param  isPreventDefault    是否阻止默认事件,true为阻止默认事件
 33         * @param  triggerOnMove       swipe事件有两种触发方式,一种是在touchmove过程中,只要满足滑动距离条件即触发。
 34         *                             一种是在touchend中,进入滑动距离判断,如果满足滑动距离触发。
 35         *                             默认是在touchend中触发。
 36         */
 37         function bindSwipe(el, swipe, callback, triggerOnMove, isStopPropagation, isPreventDefault){
 38             var startPoint, endPoint, timer;
 39
 40             /**
 41             * 计算滑动方向
 42             * 首先根据x方向和y方向滑动的长度决定触发x方向还是y方向的事件。
 43             * 然后再判断具体的滑动方向。
 44             * 如果滑动距离不够长,不判断方向。
 45             */
 46             function swipeDirection(x1, y1, x2, y2){
 47                 var diffX = x1 - x2,
 48                     diffY = y1 - y2,
 49                     absX = Math.abs(diffX),
 50                     absY = Math.abs(diffY),
 51                     swipe;
 52
 53                 if(absX >= absY){
 54                     if(absX >= touch.distance){
 55                         swipe = diffX > 0 ? ‘swipeLeft‘ : ‘swipeRight‘;
 56                     }
 57                 }else{
 58                     if(absY >= touch.distance){
 59                         swipe = diffY > 0 ? ‘swipeUp‘ : ‘swipeDown‘;
 60                     }
 61                 }
 62
 63                 return swipe;
 64             }
 65
 66             // 清除本次滑动数据
 67             function clearSwipe(){
 68                 startPoint = undefined;
 69                 endPoint = undefined;
 70
 71                 if(timer !== undefined){
 72                     clearTimeout(timer);
 73                     timer = undefined;
 74                 }
 75             }
 76
 77             /**
 78             * 判断是否符合条件,如果符合条件就执行swipe事件
 79             * @param  el     {HTMLElement}  元素
 80             * @param  event  {Event}        Touch原始事件
 81             * @param  return 如果执行了事件,就返回true。
 82             */
 83             function execSwipe(el, event){
 84                 if(startPoint && endPoint && swipeDirection(startPoint.x, startPoint.y, endPoint.x, endPoint.y) === swipe){
 85                     callback.call(el, event);
 86                     return true;
 87                 }
 88             }
 89
 90             el.addEventListener(‘touchstart‘, function(event){
 91                 var self = this, touchPoint = event.touches[0];
 92
 93                 if(isStopPropagation){
 94                     event.stopPropagation();
 95                 }
 96
 97                 if(isPreventDefault){
 98                     event.preventDefault();
 99                 }
100
101                 startPoint = {
102                     x: Math.floor(touchPoint.clientX),
103                     y: Math.floor(touchPoint.clientY)
104                 };
105
106                 timer = setTimeout(function(){
107                     //如果超时,清空本次touch数据
108                     clearSwipe();
109                 }, touch.duration);
110             });
111
112             el.addEventListener(‘touchmove‘, function(event){
113                 var self = this, touchPoint = event.touches[0];
114
115                 if(isStopPropagation){
116                     event.stopPropagation();
117                 }
118
119                 if(isPreventDefault){
120                     event.preventDefault();
121                 }
122
123                 if(startPoint){
124                     endPoint = {
125                         x: Math.floor(touchPoint.clientX),
126                         y: Math.floor(touchPoint.clientY)
127                     };
128
129                     //执行swipe事件判断,是否符合触发事件
130                     if(triggerOnMove){
131                         if(execSwipe(self, event)){
132                             clearSwipe();
133                         }
134                     }
135                 }
136             });
137
138             el.addEventListener(‘touchend‘, function(event){
139                 if(isStopPropagation){
140                     event.stopPropagation();
141                 }
142
143                 if(isPreventDefault){
144                     event.preventDefault();
145                 }
146
147                 execSwipe(self, event);
148                 //清除本次touch数据
149                 clearSwipe();
150             });
151         }
152
153         /**
154         * @param  el        {HTMLElement}  HTML元素
155         * @param  callback  {Function}     事件回调函数
156         * @param  options   {Object}       可选参数
157         *                   isStopPropagation  {Boolean}  是否停止冒泡,true为停止冒泡
158         *                   isPreventDefault   {Boolean}  是否阻止默认事件,true为阻止默认事件
159         *                   triggerOnMove      {Boolean}
160         *                                       swipe事件有两种触发方式,一种是在touchmove过程中,只要满足滑动距离条件即触发。
161         *                                       一种是在touchend中,进入滑动距离判断,如果满足滑动距离触发。
162         *                                       默认值为false,在touchend中触发。
163         */
164         touch.swipeLeft = function(el, callback, options){
165             if(options){
166                 bindSwipe(el, ‘swipeLeft‘, callback, options.triggerOnMove, options.isStopPropagation, options.isPreventDefault);
167             }else{
168                 bindSwipe(el, ‘swipeLeft‘, callback);
169             }
170
171         };
172
173         touch.swipeRight = function(el, callback, options){
174             if(options){
175                 bindSwipe(el, ‘swipeRight‘, callback, options.triggerOnMove, options.isStopPropagation, options.isPreventDefault);
176             }else{
177                 bindSwipe(el, ‘swipeRight‘, callback);
178             }
179         };
180
181         touch.swipeUp = function(el, callback, options){
182             if(options){
183                 bindSwipe(el, ‘swipeUp‘, callback, options.triggerOnMove, options.isStopPropagation, options.isPreventDefault);
184             }else{
185                 bindSwipe(el, ‘swipeUp‘, callback);
186             }
187         };
188
189         touch.swipeDown = function(el, callback, options){
190             if(options){
191                 bindSwipe(el, ‘swipeDown‘, callback, options.triggerOnMove, options.isStopPropagation, options.isPreventDefault);
192             }else{
193                 bindSwipe(el, ‘swipeDown‘, callback);
194             }
195         };
196
197         return touch;
198     })();
199
200     // 注册jquery方法
201     if($ && $.fn){
202         $.fn.extend({
203             /**
204             * 模拟touch swipe事件,支持链式调用。
205             * @param   name      {String}    swipe事件名称,值有swipLeft、swipeRight、swipeUp、swipeDown。
206             * @param   callback  {Function}  swipe事件回调函数
207             * @param   opts      {Object}    可选参数
208             *                                isStopPropagation  {Boolean}  是否停止冒泡,true为停止冒泡
209             *                                isPreventDefault   {Boolean}  是否阻止默认事件,true为阻止默认事件
210             *                                triggerOnMove      {Boolean}  swipe事件有两种触发方式,一种是在touchmove过程中,只要满足滑动距离条件即触发。
211             *                                                              一种是在touchend中,进入滑动距离判断,如果满足滑动距离触发。
212             *                                                              默认值为false,在touchend中触发。
213             */
214             rhuiSwipe: function(name, callback, opts){
215                 var fnSwipe = Rhui.mobile[name];
216
217                 if(this.length > 0 && fnSwipe){
218                     this.each(function(){
219                         fnSwipe(this, callback, opts);
220                     });
221                 }
222
223                 return this;
224             }
225         });
226     }
227 })(window, $);

使用实例:

<style type="text/css">
    .test{
        width: 400px;
        height: 400px;
    }
</style>
<div id="div1" class="test"></div>
<div class="test"></div>

<script type="text/javascript">
    Rhui.mobile.swipeUp(document.getElementById(‘div1‘), function(event){
        console.log(event);
    }, {
        // 可选参数
        isStopPropagation: true,
        isPreventDefault: true,
        triggerOnMove: true
    });

    $(‘.test‘).rhuiSwipe(‘swipeLeft‘, function(event){
        console.log(event);
    }, {
        // 可选参数
        isStopPropagation: true,
        isPreventDefault: true,
        triggerOnMove: true
    });
</script>

  实例展示:

<style type="text/css">
    .test{
        width: 400px;
        height: 400px;
    }
</style>
<div id="div1" class="test"></div>
<div class="test"></div>

<script type="text/javascript">
    Rhui.mobile.swipeUp(document.getElementById(‘div1‘), function(event){
        console.log(event);
    }, {
        // 可选参数
        isStopPropagation: true,
        isPreventDefault: true,
        triggerOnMove: true
    });

    $(‘.test‘).rhuiSwipe(‘swipeLeft‘, function(event){
        console.log(event);
    }, {
        // 可选参数
        isStopPropagation: true,
        isPreventDefault: true,
        triggerOnMove: true
    });
</script>

zeptojs touch事件

zeptojs也提供了滑动事件,该滑动事件需要引用额外的touch.js。

事件 描述
tap 类似PC端浏览器的鼠标点击事件,由于移动浏览器点击事件有延迟,tap提供了无延迟的点击效果。
singleTap 效果和tap一样
doubleTap 类似PC端浏览器的鼠标双击事件
longTap 长按事件,在元素上长按超过0.75秒触发。有些浏览器有默认的长按事件,可能会被覆盖。
swipe 滑动事件,该事件不考虑滑动方向。
swipeLeft 向左滑动
swipeRight 向右滑动
swipeUp 向上滑动
swipeDown 向下滑动

实例展示:

 1 <style>.delete { display: none; }</style>
 2
 3 <ul id=items>
 4   <li>List item 1 <span class=delete>DELETE</span></li>
 5   <li>List item 2 <span class=delete>DELETE</span></li>
 6 </ul>
 7
 8 <script>
 9 // show delete buttons on swipe
10 $(‘#items li‘).swipe(function(){
11   $(‘.delete‘).hide()
12   $(‘.delete‘, this).show()
13 })
14
15 // delete row on tapping delete button
16 $(‘.delete‘).tap(function(){
17   $(this).parent(‘li‘).remove()
18 })
19 </script>

本文摘自死神的丧钟 http://blog.csdn.net/accountwcx/article/details/49334091

时间: 2024-10-10 11:09:57

HTML5滑动(swipe)事件的相关文章

手机站建设HTML5触摸屏touch事件使用介绍

手机站建设HTML5触摸屏touch事件使用介绍技术 maybe yes 发表于2015-01-05 14:42 原文链接 : http://blog.lmlphp.com/archives/56  来自 : LMLPHP后院 市面上手机种类繁多,在触屏手机上运行的网页跟传统PC网页相比还是有很大差别的.由于设备的不同浏览器的事件的设计也不同.传统PC站的 click 和 onmouseover 等事件在一般触屏的手机上也可以使用,但是效果不够好.PC上还没有哪个事件是可以与触屏手机的触摸事件对

html5的键盘事件

html5的键盘事件,主要的有三个: onkeydown 当按下按键时运行脚本 onkeypress 当按下并松开按键时运行脚本 onkeyup 当松开按键时运行脚本 <!DOCTYPE HTML> <html> <body> <script type="text/javascript"> function check(){ alert("aaa"); } </script> <form action

HTML5服务器发送事件(Server-Send Events)

HTML5服务器发送事件是允许获得来自服务器的更新. server-sent事件-单向传递消息,表示网页自动获取来自服务器的更新. 其中有一个重要的对象,eventsource对象是用来接收服务器发送事件的通知. 实例: <!DOCTYPE html><html><head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> &l

H5案例分享:html5重力感应事件

html5重力感应事件 一.手机重力感应图形分析 1.设备围绕z轴的旋转角度为α,α角度的取值范围在[0,360). 设备在初始位置,与地球(XYZ)和身体(XYZ)某个位置对齐. 设备围绕z轴的旋转角度为α,并与先前的x和y轴位置对比,显示x,y轴新坐标为x0和y0. 2.设备围绕x轴的旋转角度为β,β角度的取值范围在(-180,180). 设备围绕x轴的旋转角度为β,并与先前的y和z轴的位置对比,显示y,z轴新坐标为y0和z0. 3.设备围绕y轴的旋转角度为γ,γ角度的取值范围在(-90,9

Zepto中的Swipe事件失效

需要阻止浏览器默认滑动的事件 document.addEventListener('touchmove', function (event) { event.preventDefault(); }, false); $('body').swipeUp(function(){ console.log('上滑'); });

HTML5: HTML5 服务器发送事件(Server-Sent Events)

ylbtech-HTML5: HTML5 服务器发送事件(Server-Sent Events) 1.返回顶部 1. HTML5 服务器发送事件(Server-Sent Events) HTML5 服务器发送事件(server-sent event)允许网页获得来自服务器的更新. Server-Sent 事件 - 单向消息传递 Server-Sent 事件指的是网页自动获取来自服务器的更新. 以前也可能做到这一点,前提是网页不得不询问是否有可用的更新.通过服务器发送事件,更新能够自动到达. 例子

js监听网页页面滑动滚动事件,实现导航栏自动显示或隐藏

/** * 页面滑动滚动事件 * @param e *///0为隐藏,1为显示var s = 1; function scrollFunc(e) { // e存在就用e不存在就用windon.event e = e || window.event;// 先判断是什么浏览器 if (e.wheelDelta) { // 浏览器IE,谷歌 if (e.wheelDelta > 0) {//当滑轮向上滚动时// console.log("滑轮向上滚动"); if (s == 0) {

HTML5 服务器发送事件(Server-Sent Events)

沈阳SEO:HTML5 服务器发送事件(server-sent event)允许网页获得来自服务器的更新. Server-Sent 事件 - 单向消息传递 Server-Sent 事件指的是网页自动获取来自服务器的更新. 以前也可能做到这一点,前提是网页不得不询问是否有可用的更新.通过服务器发送事件,更新能够自动到达. 例子:Facebook/Twitter 更新.股价更新.新的博文.赛事结果等. 浏览器支持 所有主流浏览器均支持服务器发送事件,除了 Internet Explorer. 接收

移动端项目 添加 触屏 swipe事件[记录]

avalon 触屏 事件 tap, longtap, doubletap swipe, swipeleft, swiperight,swipedown,swipeup pinch, pinchstart,pinchend,pinchin,pinchout drag,dragstart,dragend, rotate,rotatestart,rotateend 移动端 触屏事件添加 测试  (https://segmentfault.com/a/1190000006012676) 挑选用到的模块加