码迷,mamicode.com
首页 > 移动开发 > 详细

移动端Touch事件

时间:2017-09-23 19:05:34      阅读:222      评论:0      收藏:0      [点我收藏+]

标签:触摸   absolute   bottom   bre   移动   doctype   lan   没有   one   

技术分享

技术分享

案例1:

 1 <!doctype html>
 2 <html lang="en">
 3 <head>
 4 <meta charset="UTF-8">
 5 <meta name="viewport" content="width=device-width,initial-scale=1,user-scalable=no">
 6 <title>Test Tap</title>
 7 <style>
 8     .touchpad{
 9         width: 100%;
10         height: 200px;
11         font-size: 40px;
12         text-align: center;
13         line-height: 200px;
14         background: rgba(0,0,0,0.5);
15         position: relative;
16         color: #ddd;
17     }
18 
19     .ball{
20         display: none;
21         position: absolute;
22         width: 25px;
23         height: 25px;
24         border-radius: 15px;
25         background-color: #7AE6FF;
26         top: 0;
27         left: 0;
28     }
29     p{
30         height: 30px;
31     }
32 
33 </style>
34 </head>
35 <body>
36 
37 <p id="desc"></p>
38 <div id="touchPad" class="touchpad">触摸板</div>
39 <div id="ball" class="ball"></div>
40 
41 <script src="../js/zepto.js"></script>
42 <script type="text/javascript">
43     var touchpad = document.querySelector(#touchPad),
44         ball = document.querySelector(#ball),
45         desc = document.querySelector(#desc);
46 
47     //简单的touch事件(废弃)
48     var touchHandler = function(e){
49         var type = e.type;
50 
51 
52         //注意touchend的touches和targetTouches为空,只偶有changeTouches获取上次一的touchTlist
53         if(type != touchend){
54             var pos = {
55                 x : e.touches[0].clientX,
56                 y : e.touches[0].clientY
57             }
58 
59             ball.style.left = pos.x + px;
60             ball.style.top = pos.y + px;
61             desc.innerHTML = e.type + (clienX:+pos.x+, clientY:+ pos.y+);
62         }else{
63             desc.innerHTML = e.type ;
64         }
65         
66         switch(type){
67             case touchstart:
68                 ball.style.display = block; 
69                 break;
70             case touchmove: 
71                 //android的4.4,4.0的bug:只触发touchstart,和一次的touchmove,touchend不触发
72                 //加入evnt.preventDefault
73                 event.preventDefault();
74                 break;
75             case touchend: 
76                 ball.style.display = none;
77                 break;
78         }
79     }
80 
81     touchpad.addEventListener(touchstart,touchHandler);
82     touchpad.addEventListener(touchmove, touchHandler);
83     touchpad.addEventListener(touchend, touchHandler);
84 
85 
86 </script>
87 
88 </body>
89 </html>

案例2:

  1 <!doctype html>
  2 <html lang="en">
  3 <head>
  4 <meta charset="UTF-8">
  5 <meta name="viewport" content="width=device-width,initial-scale=1,user-scalable=no">
  6 <title>Test Tap</title>
  7 <style>
  8     .touchpad{
  9         width: 100%;
 10         height: 200px;
 11         font-size: 40px;
 12         text-align: center;
 13         line-height: 200px;
 14         background: rgba(0,0,0,0.5);
 15         position: relative;
 16         color: #ddd;
 17     }
 18 
 19     .ball{
 20         display: none;
 21         position: absolute;
 22         width: 25px;
 23         height: 25px;
 24         border-radius: 15px;
 25         background-color: #7AE6FF;
 26         top: 0;
 27         left: 0;
 28     }
 29     p{
 30         height: 30px;
 31     }
 32 
 33 </style>
 34 </head>
 35 <body>
 36 
 37 <p id="desc"></p>
 38 <div id="touchPad" class="touchpad">触摸板</div>
 39 <div id="ball" class="ball"></div>
 40 
 41 <script src="../js/zepto.js"></script>
 42 <script type="text/javascript">
 43     var touchpad = document.querySelector(#touchPad),
 44         ball = document.querySelector(#ball),
 45         desc = document.querySelector(#desc);
 46 
 47 
 48     //获取touch的点(兼容mouse事件)
 49     var getTouchPos = function(e){
 50         var touches = e.touches;
 51         if(touches && touches[0]) {
 52             return { x : touches[0].clientX ,
 53                      y : touches[0].clientY };
 54         }
 55         return { x : e.clientX , y: e.clientY };
 56     }
 57 
 58     //计算两点之间距离
 59     var getDist = function(p1 , p2){
 60         if(!p1 || !p2) return 0;
 61         return Math.sqrt((p1.x - p2.x) * (p1.x - p2.x) + (p1.y - p2.y) * (p1.y - p2.y));
 62     }
 63     //计算两点之间所成角度
 64     var getAngle = function(p1 , p2){
 65         var r = Math.atan2(p2.y - p1.y, p2.x - p1.x);
 66         var a = r * 180 / Math.PI;
 67         return a;
 68     };
 69      //获取swipe的方向
 70     var getSwipeDirection = function(p2,p1){
 71         var dx = p2.x - p1.x;
 72         var dy = -p2.y + p1.y;    
 73         var angle = Math.atan2(dy , dx) * 180 / Math.PI;
 74 
 75         if(angle < 45 && angle > -45) return "right";
 76         if(angle >= 45 && angle < 135) return "top";
 77         if(angle >= 135 || angle < -135) return "left";
 78         if(angle >= -135 && angle <= -45) return "bottom";
 79 
 80     }
 81 
 82 
 83     var startEvtHandler = function(e){
 84         var pos = getTouchPos(e);
 85         ball.style.left = pos.x + px;
 86         ball.style.top = pos.y + px;
 87         ball.style.display = block;
 88 
 89         var touches = e.touches; 
 90         if( !touches || touches.length == 1 ){ //touches为空,代表鼠标点击
 91             point_start = getTouchPos(e);
 92             time_start = Date.now();
 93         }
 94     }
 95 
 96     var moveEvtHandler = function(e){
 97         var pos = getTouchPos(e);
 98         ball.style.left = pos.x + px;
 99         ball.style.top = pos.y + px;
100 
101 
102         point_end = getTouchPos(e);
103         e.preventDefault();
104     }
105 
106     //touchend的touches和targetTouches没有对象,只有changeTouches才有
107     var endEvtHandler = function(e){
108         ball.style.display = none;
109 
110         var time_end = Date.now();
111 
112         //距离和时间都符合
113         if(getDist(point_start,point_end) > SWIPE_DISTANCE && time_start- time_end < SWIPE_TIME){
114            
115            var dir = getSwipeDirection(point_end,point_start);
116            touchPad.innerHTML = swipe+dir;
117         }
118     }
119 
120    
121     var SWIPE_DISTANCE = 30;  //移动30px之后才认为swipe事件
122     var SWIPE_TIME = 500;     //swipe最大经历时间
123     var point_start,
124         point_end,
125         time_start,
126         time_end;
127 
128     //判断是PC或者移动设备
129     var startEvt, moveEvt, endEvt;
130     if("ontouchstart" in window){
131         startEvt="touchstart";
132         moveEvt="touchmove";
133         endEvt="touchend";
134     }else{
135         startEvt="mousedown";
136         moveEvt="mousemove";
137         endEvt="mouseup";            
138     }
139 
140     touchpad.addEventListener(startEvt, startEvtHandler);
141     touchpad.addEventListener(moveEvt, moveEvtHandler);
142     touchpad.addEventListener(endEvt, endEvtHandler);
143 
144 
145 
146 </script>
147 
148 </body>
149 </html>

技术分享

 

 技术分享

技术分享

 

 技术分享

 

移动端Touch事件

标签:触摸   absolute   bottom   bre   移动   doctype   lan   没有   one   

原文地址:http://www.cnblogs.com/zhaobao1830/p/7581836.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!