Hammer.js移动端触屏框架的使用

hammer.js是一个多点触摸手势库,能够为网页加入Tap、Double Tap、Swipe、Hold、Pinch、Drag等多点触摸事件,免去自己监听底层touchstart、touchmove、touchend事件并且写一大堆判断逻辑的痛苦。hammer.js不但支持触摸屏设备的浏览器,在桌面浏览器上,也能将鼠标的点击当做触摸,方便开发人员在桌面浏览器上调试。这是一个专为触摸手势而生的js库,对有需要的朋友非常有帮助,奉上常用的一些方法调用文档。

使用方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<script src="http://eightmedia.github.com/hammer.js/hammer.js"></script>
// 先要对监听的DOM进行一些初始化
var hammer = new Hammer(document.getElementById("container"));
// 然后加入相应的回调函数即可
hammer.ondragstart = function(ev) { };  // 开始拖动
hammer.ondrag = function(ev) { }; // 拖动中
hammer.ondragend = function(ev) { }; // 拖动结束
hammer.onswipe = function(ev) { }; // 滑动
hammer.ontap = function(ev) { }; // 单击
hammer.ondoubletap = function(ev) { }; //双击
hammer.onhold = function(ev) { }; // 长按
hammer.ontransformstart = function(ev) { }; // 双指收张开始
hammer.ontransform = function(ev) { }; // 双指收张中
hammer.ontransformend = function(ev) { }; // 双指收张结束
hammer.onrelease = function(ev) { }; // 手指离开屏幕

还支持jQuery插件的形式调用

1
2
3
4
5
6
7
8
9
<script src="http://eightmedia.github.com/hammer.js/jquery.hammer.js"></script>
$("#element")
   .hammer({
        // 对DOM进行一些初始化,这里可以加入一些参数。不是必须的
   })
   .bind("tap", function(ev) {
        console.log(ev);
   });

官网地址:http://eightmedia.github.com/hammer.js/  (带演示)
源码地址:https://github.com/EightMedia/hammer.js

一、前言

移动端框架当前还处在初级阶段,但相对于移动端的应用来说已经有很长时间了。虽然暂时还没有PC端开发的需求量大,但移动端的Web必然是一种趋 势,在接触移动端脚本的过程中,最开始想到的是juqery。Jquery2.0版本及以上已经开始偏向移动端,如对h5的支持,但支持还是不够完善,希 望jq在后面的版本能够逐渐支持起来。

最初在开发移动端Web的时候使用w3c标准的语法结构和原生的js开发,但相对来说开发量比较大,而且每一步都要考虑各移动端浏览器的兼容,像比 较让程序员头痛的大wp手机,很多事件都向w3c申请单独的标准。因此一个好的兼容性架构对于开发者来说可以节省很大一部分工作量。

刚开始接触移动端框架之初也问了一些一直搞前端的朋友,大部份都在百度阿里等工作。参考大家的建议后我们做项目使用了zepto.js(很多搞前端 的朋友应该并不陌生)。这个框架有个很大的问题就是不兼容wp手机,使用zepto.js开发完项目后,再针对wp手机兼容做调整总感觉有些“得不偿 失”,后来咨询了些朋友,他们所在的公司在开发的时候基本都放弃wp的兼容(我只能对wp说“呵呵”了)。后面就咨询到有用hammer.js进行开发 的。我们研究了下,hammer.js轻量级,封装的也比较好。用起来也很方便。兼容性也不错。但网上中文资料比较少,园子写hammer的就更少了。因 此有了这篇文章。

此文章基于hammer.js 官网:http://hammerjs.github.io/ ,版本基于v2.0.4。如果该文章的api已过期,请自行到官网查询最新api。此文章只做入门使用。

二、hammer.js是什么

hammer.js是一款开源的移动端脚本框架,他可以完美的实现在移端开发的大多数事件,如:点击、滑动、拖动、多点触控等事件。不需要依赖任何其他的框架,并且整个框架非常小,\在使用时非常简单,代码示例如下:

复制代码
 1  <div id="test" class="test"></div>  2 <script type="text/javascript">  3 //创建一个新的hammer对象并且在初始化时指定要处理的dom元素  4 var hammertime = new Hammer(document.getElementById("test"));  5 //为该dom元素指定触屏移动事件  6  hammertime.on("pan", function (ev) {  7 //控制台输出  8  console.log(ev);  9  }); 10 </script>
复制代码

三事件架构

hammer.js主要针对触屏的6大事件进行监听。如下图所示:

1、  Pan事件:在指定的dom区域内,一个手指放下并移动事件,即触屏中的拖动事件。这个事件在屏触开发中比较常用,如:左拖动、右拖动等,如手要上使用QQ时向右滑动出现功能菜单的效果。该事件还可以分别对以下事件进行监听并处理:

Panstart:拖动开始、Panmove:拖动过程、Panend:拖动结束、Pancancel:拖动取消、Panleft:向左拖动、Panright:向右拖动、Panup:向上拖动、Pandown:向下拖动

2、  Pinch事件:在指定的dom区域内,两个手指(默认为两个手指,多指触控需要单独设置)或多个手指相对(越来越近)移动或相向(越来越远)移动时事件。该事件事以分别对以下事件进行监听并处理:

Pinchstart:多点触控开始、Pinchmove:多点触控过程、Pinchend:多点触控结束、Pinchcancel:多点触控取消、Pinchin:多点触控时两手指距离越来越近、Pinchout:多点触控时两手指距离越来越远

3、  Press事件:在指定的dom区域内触屏版本的点击事件,这个事件相当于PC端的Click事件,该不能包含任何的移动,最小按压时间为500毫秒,常用于我们在手机上用的“复制、粘贴”等功能。该事件分别对以下事件进行监听并处理:

Pressup:点击事件离开时触发

4、  Rotate事件:在指定的dom区域内,当两个手指或更多手指成圆型旋转时触发(就像两个手指拧螺丝一样)。该事件分别对以下事件进行监听并处理:

Rotatestart:旋转开始、Rotatemove:旋转过程、Rotateend:旋转结束、Rotatecancel:旋转取消

5、  Swipe事件:在指定的dom区域内,一个手指快速的在触屏上滑动。即我们平时用到最多的滑动事件。

Swipeleft:向左滑动、Swiperight:向右滑动、Swipeup:向上滑动、Swipedown:向下滑动

6、Tap事件:在指定的dom区域内,一个手指轻拍或点击时触发该事件(类似PC端的click)。该事件最大点击时间为250毫秒,如果超过250毫秒则按Press事件进行处理。

经验分享:写到这个事件的时候有人必然要问了,在触屏中我们使用Click事件不也可以吗?这个Tap事件与Click事件有什么区别呢?博主也曾 经有过这样的疑惑,起初在触屏上处理点击的时候也一直用的click事件,并且没也有出现任何问题,直到有一天为一个公司做了微信版本的“连连看”小游 戏,连连看的业务简单来说就是屏幕上有很多图片,当点击两个相同图案的图片时可以在中间产生连接线,并且产生爆破效果后消失。这个游戏刚开始做的时候是在 ff浏览器上做的测试,鼠标点击后效果非常流畅,但当游戏部署到服务器上并用手机端操作时,iphone和wp都非常流畅,安卓下不管怎么调都是有卡顿。 起初以为是手机性能的问题,但换了高配手机后仍然会有卡顿,游戏也不是不能玩,就是反应慢。经过多次的测试后排除了手机配置的硬件原因,开始怀疑 click事件。经过网上查阅后才得知,在安卓触屏上,Tap事件和click事件可以同时触发,但click事件会有几百毫秒的延迟,即先触发Tap事 件,过一段时间再触发click事件。后来把游戏的所有click事件修改成Tap事件问题就自然解决了。

四、 使用实例

1、 Pan

代码如下:

复制代码
 1 <!DOCTYPE html>2 <html>  3 <head>  4 <meta name="viewport" content="width=device-width" />  5 <title>Pan</title>  6 <script src="/Script/hammer.js"></script>  7 <style type="text/css">  8  html, body {  9  width: 100%; 10  height: 100%; 11  margin: 0px; 12  padding: 0px; 13 } 14 15  .test { 16  width: 100%; 17  height: 50%; 18  background: #ffd800; 19  text-align: left; 20 } 21 22  .result { 23  width: 100%; 24  height: 50%; 25  background: #b6ff00; 26  text-align: left; 27 } 28 </style> 29 </head> 30 <body> 31 <div id="test" class="test">事件区域</div> 32 <div id="result" class="result">事件结果<br /></div> 33 <script type="text/javascript"> 34 //创建一个新的hammer对象并且在初始化时指定要处理的dom元素 35 var hammertime = new Hammer(document.getElementById("test")); 36 //添加事件 37  hammertime.on("pan", function (e) { 38  document.getElementById("result").innerHTML += "X偏移量:【" + e.deltaX + "】,Y偏移量:【" + e.deltaY + "】<br />"; 39 //控制台输出 40  console.log(e); 41  }); 42 </script> 43 </body> 44 </html>
复制代码

效果如下:

2、Pinch

代码如下:

复制代码
 1 <!DOCTYPE html>2 <html>  3 <head>  4 <meta name="viewport" content="width=device-width" />  5 <title>Pinch</title>  6 <script src="/Script/hammer.js"></script>  7 <style type="text/css">  8  html, body {  9  width: 100%; 10  height: 100%; 11  margin: 0px; 12  padding: 0px; 13 } 14 15  .test { 16  width: 100%; 17  height: 50%; 18  background: #ffd800; 19  text-align: left; 20 } 21 22  .result { 23  width: 100%; 24  height: 50%; 25  background: #b6ff00; 26  text-align: left; 27 } 28 </style> 29 </head> 30 <body> 31 <div id="test" class="test">事件区域</div> 32 <div id="result" class="result">事件结果:捏合触发<br /></div> 33 <script type="text/javascript"> 34 //创建一个新的hammer对象并且在初始化时指定要处理的dom元素 35 var hammertime = new Hammer(document.getElementById("test")); 36 //为该dom元素指定触屏移动事件 37  hammertime.add(new Hammer.Pinch()); 38 //添加事件 39  hammertime.on("pinchin", function (e) { 40  document.getElementById("result").innerHTML += "捏合初触发<br />"; 41 //控制台输出 42  console.log(e); 43  }); 44 </script> 45 </body> 46 </html>
复制代码

效果如下:

3、Press

代码如下:

复制代码
 1 <!DOCTYPE html>2 <html>  3 <head>  4 <meta name="viewport" content="width=device-width" />  5 <title>Press</title>  6 <script src="/Script/hammer.js"></script>  7 <style type="text/css">  8  html, body {  9  width: 100%; 10  height: 100%; 11  margin: 0px; 12  padding: 0px; 13 } 14 15  .test { 16  width: 100%; 17  height: 50%; 18  background: #ffd800; 19  text-align: left; 20 } 21 22  .result { 23  width: 100%; 24  height: 50%; 25  background: #b6ff00; 26  text-align: left; 27 } 28 </style> 29 </head> 30 <body> 31 <div id="test" class="test">事件区域</div> 32 <div id="result" class="result">事件结果:按压超过500ms触发<br /></div> 33 <script type="text/javascript"> 34 //创建一个新的hammer对象并且在初始化时指定要处理的dom元素 35 var hammertime = new Hammer(document.getElementById("test")); 36 //添加事件 37  hammertime.on("press", function (e) { 38  document.getElementById("result").innerHTML += "超过500ms了<br />"; 39 //控制台输出 40  console.log(e); 41  }); 42 </script> 43 </body> 44 </html>
复制代码

效果如下:

4、Rotate

代码如下:

复制代码
 1 <!DOCTYPE html>2 <html>  3 <head>  4 <meta name="viewport" content="width=device-width" />  5 <title>Rotate</title>  6 <script src="/Script/hammer.js"></script>  7 <style type="text/css">  8  html, body {  9  width: 100%; 10  height: 100%; 11  margin: 0px; 12  padding: 0px; 13 } 14 15  .test { 16  width: 100%; 17  height: 50%; 18  background: #ffd800; 19  text-align: left; 20 } 21 22  .result { 23  width: 100%; 24  height: 50%; 25  background: #b6ff00; 26  text-align: left; 27 } 28 </style> 29 </head> 30 <body> 31 <div id="test" class="test">事件区域</div> 32 <div id="result" class="result">事件结果:旋转触发<br /></div> 33 <script type="text/javascript"> 34 //创建一个新的hammer对象并且在初始化时指定要处理的dom元素 35 var hammertime = new Hammer(document.getElementById("test")); 36 //为该dom元素指定触屏移动事件 37  hammertime.add(new Hammer.Rotate()); 38 //添加事件 39  hammertime.on("rotate", function (e) { 40  document.getElementById("result").innerHTML += "X偏移量:【" + e.deltaX + "】,Y偏移量:【" + e.deltaY + "】<br />"; 41 //控制台输出 42  console.log(e); 43  }); 44 </script> 45 </body> 46 </html>
复制代码

效果如下:

5、Swipe

代码如下:

复制代码
 1 <!DOCTYPE html>2 <html>  3 <head>  4 <meta name="viewport" content="width=device-width" />  5 <title>Swipe</title>  6 <script src="/Script/hammer.js"></script>  7 <style type="text/css">  8  html, body {  9  width: 100%; 10  height: 100%; 11  margin: 0px; 12  padding: 0px; 13 } 14 15  .test { 16  width: 100%; 17  height: 50%; 18  background: #ffd800; 19  text-align: left; 20 } 21 22  .result { 23  width: 100%; 24  height: 50%; 25  background: #b6ff00; 26  text-align: left; 27 } 28 </style> 29 </head> 30 <body> 31 <div id="test" class="test">事件区域</div> 32 <div id="result" class="result">事件结果:向左滑动触发<br /></div> 33 <script type="text/javascript"> 34 //创建一个新的hammer对象并且在初始化时指定要处理的dom元素 35 var hammertime = new Hammer(document.getElementById("test")); 36 //添加事件 37  hammertime.on("swipeleft", function (e) { 38  document.getElementById("result").innerHTML += "X偏移量:【" + e.deltaX + "】,Y偏移量:【" + e.deltaY + "】<br />"; 39 //控制台输出 40  console.log(e); 41  }); 42 </script> 43 </body> 44 </html>
复制代码

效果如下:

6、Tab

代码如下:

复制代码
 1 <!DOCTYPE html>2 <html>  3 <head>  4 <meta name="viewport" content="width=device-width" />  5 <title>Tap</title>  6 <script src="/Script/hammer.js"></script>  7 <style type="text/css">  8  html, body {  9  width: 100%; 10  height: 100%; 11  margin: 0px; 12  padding: 0px; 13 } 14 15  .test { 16  width: 100%; 17  height: 50%; 18  background: #ffd800; 19  text-align: left; 20 } 21 22  .result { 23  width: 100%; 24  height: 50%; 25  background: #b6ff00; 26  text-align: left; 27 } 28 </style> 29 </head> 30 <body> 31 <div id="test" class="test">事件区域</div> 32 <div id="result" class="result">事件结果:点击触发<br /></div> 33 <script type="text/javascript"> 34 //创建一个新的hammer对象并且在初始化时指定要处理的dom元素 35 var hammertime = new Hammer(document.getElementById("test")); 36 //添加事件 37  hammertime.on("tap", function (e) { 38  document.getElementById("result").innerHTML += "点击触发了,长按无效<br />"; 39 //控制台输出 40  console.log(e); 41  }); 42 </script> 43 </body> 44 </html>
复制代码

效果如下:

上述的实例还是有所区别的。在Pinch事件和Rotate事件中,我们用了hammertime.add(new Hammer.Pinch());和hammertime.add(new Hammer.Rotate ());而其他四个事件没有用,而是直接添加了事件的监听程序。原因在于,我们在new Hammer(htmlElement)的时候,Hammer.js默认对Pan、Press、Swipe和Tab事件进行了监听。但没有对Pinch和 Rotate事件进行监听。

转载于:https://www.cnblogs.com/3body/p/5416919.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/257334.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android实现笔记本修改功能,安卓12第二个开发者预览版推出:UI、功能有所改进...

最近谷歌正式推出了Android 12的第二个开发者预览版&#xff0c;带来了很多UI和功能上的改进。首先最明显的变化应该是锁屏界面和下拉通知栏的音乐播放器。此前这部分UI的配色一直采用的是音乐专辑的主色调&#xff0c;但在Android 12上&#xff0c;这个配色变成了系统的强调色…

Delphi编译报错对照表

; not allowed before ‘ELSE’ → ElSE前不允许有“;” ” clause not allowed in OLE automation section → 在OLE自动区段不允许“”子句 ” is not a type identifier → 不是类型标识符 ” not previously declared as a PROPERTY → 前面没有说明PROPERTY ‘GOTO ‘ lea…

C语言中Union类型的使用方法

转自&#xff1a;http://blog.csdn.net/feimor/article/details/6858103 使用C语言时&#xff0c;常常使用struct&#xff0c;对于union类型却几乎没有用过&#xff0c;只知道它是联合类型&#xff0c;各字段共享一块内存&#xff0c;实际应用中却不知道它的具体用途。 今天读《…

android 点对点语音,使用Android SIP Stack进行点对点SIP呼叫?

我一直被困在同样的问题上.如果你可以在没有android sip api的情况下制作它,你可以查看rtp api,它为你提供了一些较低级别的工具来制作P2P VOIP应用程序,而无需服务器.To support audio conferencing and similar usages, you need toinstantiate two classes as endpoints for…

拓扑排序

用两种方式来实现 1、 深度优先搜索&#xff08;DFS&#xff09; 对有向图采取深度优先搜索&#xff0c;并且在postVist处&#xff0c;打印所访问的节点。最后打印出的字符序列的反序列正好满足拓扑排序。&#xff08;可以在postVist&#xff08;&#xff09;方法中&#xff0c…

阿里启动NASA计划创造新经济核心科技

本文讲的是阿里启动"NASA"计划创造新经济核心科技【IT168 资讯】2017年3月9日&#xff0c;阿里巴巴集团在杭州召开首届技术大会&#xff0c;动员全球两万多名科学家和工程师投身“新技术战略”。会议透露&#xff0c;阿里巴巴正在启动一项代号“NASA”的计划&#xf…

ORACLE创建表空间和用户

--表空间 CREATE TABLESPACE sdt DATAFILE F:\tablespace\demo size 800M EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO; --索引表空间 CREATE TABLESPACE sdt_Index DATAFILE F:\tablespace\demo size 512M EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AU…

PHP-CGI, FastCGI, PHP-FPM的关系和区别

Web server(apache, nginx) 接受到一个php请求后要解析php文件, 怎么解析呢, web server是C语言写的, 所以需要一个协议, 一个php解释器, 也就是CGI. FastCGI是用来提高CGI性能的, 可以说是CGI的升级版. CGI每当一个请求过来都要开启一个进程, 访问结束再关闭一个进程, 太累. F…

android 6关闭防火墙,安卓手机如何关闭防火墙

我的安卓手机不想使用防火墙了!该如何关闭呢?下面由小编给你做出详细的安卓手机关闭防火墙介绍!希望对你有帮助!安卓手机关闭防火墙方法一1、如果该防火墙不是系统自带的&#xff0c;是你下载安装的&#xff0c;就直接在设置选项中&#xff0c;选择应用程序--管理应用程序&…

Powershell命令中的 CommonParameters是指什么

因为在命令中经常遇到这个参数&#xff0c;后来找了一下&#xff0c;有一个微软的官方文档&#xff0c;就不翻译了&#xff0c;英文好的自己读吧。https://docs.microsoft.com/zh-cn/powershell/module/microsoft.powershell.core/about/about_commonparameters?viewpowershel…

java日志之slf4j与logback简单使用

最近在开发遇到日志是使用slf4j与logback.xml的配置&#xff0c;所以就记录下来了。 1、导入这几个jar包&#xff1a; Logback 分为三个模块&#xff1a;logback-core&#xff0c;logback-classic&#xff0c;logback-access logback-core 是核心&#xff1b; logback-classic …

android one x3怎么样,618旗舰手机怎么选,看完这篇文章,你就会知道

转眼间&#xff0c;2021年即将过半&#xff0c;一年一度的年中购物狂欢节618就要到来了。我已经迫不及待了。毕竟在618年中大促的时候&#xff0c;各家厂商都有力度非常大的活动。而且也有很多小伙伴一直在观望&#xff0c;想要在618的时候给自己换一款手机。说实话&#xff0c…

字符设备驱动程序框架

via&#xff1a;http://blog.chinaunix.net/uid-20672257-id-3142809.html 1、写出open、write函数 2、告诉内核 1&#xff09;、定义一个struct file_operations结构并填充好 static struct file_operations first_drv_fops {.owner THIS_MODULE, /* 这是一个宏&…

华为鸿蒙与magic,如果荣耀Magic3搭载了屏下镜头和鸿蒙系统,你会做第一批吗?...

华为荣耀在目前的手机市场中&#xff0c;荣耀手机的人气还是蛮高的&#xff0c;从高端旗舰市场到中低端市场&#xff0c;我们都能够看到荣耀手机的踪影&#xff0c;这已经可以代表荣耀手机的优势了。要知道华为荣耀这两年的发展速度非常快&#xff0c;产品的布局速度也是如此&a…

第十九章 我国农村资金筹集

农村改革解说&#xff08;专著&#xff09;第十九章 第十九章 我国农村资金筹集 1、农村公共事业统筹经费怎样确定&#xff1f; 总的原则是&#xff1a;制止对农民的不合理摊派&#xff0c;减轻农民的额外负担&#xff0c;保证农村合理的公共事业经费。具体要求如下&#xff1a…

两个Python web框架:Django Tornado比较

就是说它作为 web 框架比 Django 简单&#xff0c;又支援异步 IO&#xff0c;且更不需要前端的 webserver ? 我已经混乱了&#xff0c; Tornado是 Nginx、Django、Node.js 的结合体&#xff1f;又或是 Nginx * 20% Django * 40% Node.js * 40% &#xff1f;你需要搞清楚几个…

广义动量定理之速度V的应用分析

广义动量定理之速度V的应用分析 从广义动量定理FαtnmV的角度说&#xff0c;改变速度V&#xff0c;就可以改变成果nmV。速度派以改变速度V作为其主要目的。 速度V应用于兵贵神速 理论简介&#xff1a;三国时期曹操的谋士郭嘉说&#xff1a;“兵贵神速”。 孙子在九地篇中说“兵…

云安全联盟发布更新版安全应用指南

本文讲的是云安全联盟发布更新版安全应用指南【IT168 资讯】云安全联盟(CSA)本周四发布了云计算服务的第二版安全应用指南。这一非营利性质的联盟正式成立于四月份&#xff0c;其目的是推进云计算安全的最佳实践。他们在2009 RSA会议(全球信息安全领域最具权威的年度峰会)上发布…

[BZOJ1026] [SCOI2009] windy数 (数位dp)

Description windy定义了一种windy数。不含前导零且相邻两个数字之差至少为2的正整数被称为windy数。 windy想知道&#xff0c;在A和B之间&#xff0c;包括A和B&#xff0c;总共有多少个windy数&#xff1f; Input 包含两个整数&#xff0c;A B。 Output 一个整数 Sample Input…

JQuery ajax()实例

前端页面&#xff1a; <!doctype html><html><head><meta charset"utf-8"><title>搜索</title></head> <body><div class"zgz">请输入(A-Z):<input type"text" value"GET"&…