移动端开发

1 (function(){2  setRem();3 window.addEventListener(‘orientation‘ in window?"deviceorientation":"resize",setRem);4 function setRem(){5 var html = document.documentElement;6 var width = html.clientWidth;7 html.style.fontSize = width/16 + "px";8  }9 })();

 

1 (function(){2 var html = document.documentElement;3 var hWidth = html.getBoundingClientRect().width;4 // console.log( hWidth );5 html.style.fontSize = hWidth/16 + "px";6 })()
 1 /* 2  移动端的三大事件: 3  手指按下: 4  ontouchstart 5  手指移动: 6  ontouchmove 7  手指抬起 8  ontouchend 9 10  注意:11  在移动端开发的时候,浏览器的模拟器时好时坏,一般不用on的方式绑定事件函数,要用事件绑定的方式(addEventListener)。12 */13 14 var div = document.getElementById(‘div1‘);15 16 // div.ontouchstart = function(){17 // alert(1);18 // }19 20 div.addEventListener(‘touchstart‘,start);21 div.addEventListener(‘touchmove‘,move);22 div.addEventListener(‘touchend‘,end);23 function start(){24 console.log(‘按下‘);25  }26 function move(){27 console.log(‘移动‘);28  }29 function end(){30 console.log(‘抬起‘);31 }

 

视口设置

1 <!--2  viewport 视口(可视区窗口)3  默认不设置viewport一般可视区宽度在移动端是9804 width 可视区的宽度 (number||device-width)5 user-scalable 是否允许用户缩放 (yes||no) iOS10无效 (我们放在事件章节解决)6 initial-scale 初始缩放比例7 minimum-scale 最小缩放比例8 maximum-scale 最大缩放比例9 -->

 

适配

 1 <script type="text/javascript"> 2 (function(){ 3 var w = window.screen.width; 4 var targetW = 320; 5 var scale = w/targetW; //当前尺寸/目标尺寸 6 var meta = document.createElement("meta"); 7 meta.name = "viewport"; 8 meta.content = "user-scalable=no,initial-scale="+scale+",minimum-scale="+scale+",maximum-scale="+scale+"" 9 //console.log(scale);10  document.head.appendChild(meta);11 })();12 </script>13 <!--14 <meta name="viewport" content="user-scalable=no,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0">15 -->

 

像素比

1 <script type="text/javascript">2  alert(window.devicePixelRatio);3 // n = window.devicePixelRatio4 //像素比把一个像素 放大至 N个像素去显示 5 //设计图最少750 6 </script>

 

x5内核一些特性

 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Document</title> 6 <meta name="viewport" content="width=device-width,user-scalable=no"> 7 <meta name="x5-orientation" content="portrait" /> 8 <meta name="x5-fullscreen" content="true" /> 9 <meta name="screen-orientation" content="portrait">10 <meta name="full-screen" content="yes">11 <meta name="format-detection" content="telephone=no, email=no" />12 </head>13 <body>14 <p>13888888888</p>15 <a href="tel:18888888888">请拨打电话18888888888</a>16 <a href="mailto:motao@motao.com">请发送邮件</a>17 </body>18 </html>

 

移动端IOS与Android的默认样式去除

<style type="text/css">body { font-family: Helvetica;}body * { -webkit-text-size-adjust: 100%; -webkit-user-select: none; /*在事件章节 去兼容安卓*/}a, input, button{ -webkit-tap-highlight-color: rgba(0, 0, 0, 0);}input, button { -webkit-appearance: none; border-radius: 0;}</style>

 

移动端事件基础(pc存在的2个问题)

 1 <script type="text/javascript"> 2 /* 3  注意: 4  在移动端开发的时候,浏览器的模拟器时好时坏,一般不用on的方式绑定事件函数,要用事件绑定的方式(addEventListener)。 5  6  pc上的事件比移动端的事件略慢,大概是在300ms左右。 7  8  9  移动端的点透:10  当上层元素发生点击的时候,下层元素也有点击(焦点)特性,11  在300ms之后,如果上层元素消失或者隐藏,目标点就会“漂移”到12  下层元素身上,就会触发点击行为。13 14  解决:15  1.下层不要使用有点击(焦点)特性的元素。16 17  2.阻止pc事件。18 19 20 */21 22  document.addEventListener(touchstart,function(ev){23  ev.preventDefault();24  });25 26 27 var div = document.getElementById(div1);28 //var p = document.getElementById(‘p‘);29 var a = document.getElementById(a);30 31  div.addEventListener(touchend,end);32 33 // p.addEventListener(‘touchstart‘,function(){34 // alert(‘1111‘);35 // });36 37  a.addEventListener(touchstart,function(){38  window.location.href = http://www.miaov.com;39  });40 41 42 function end(){43 this.style.display = none;44  }45 46 </script> 47 

 

移动端阻止pc事件的优点

 1 <!doctype html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8" /> 5 <meta name="viewport" content="width=device-width,user-scalable=no"/> 6 <title>Document</title> 7 <style> 8 body,html{ 9  width: 100%;10  overflow: hidden;11 }12 #div1{13  width:200px;14  height: 200px;15  background: red;16  position: absolute;17  top:0;18  left:0;19  opacity: .5;20 }21 #div2{22  width:3000px;23  height: 50px;24  background: yellow;25 } 26 </style>27 </head>28 <body>29 <p id="p">点我呀!</p>30 <a href="http://www.miaov.com" id="a">点我呀!!!</a>31 <div id="div1"></div>32 <div id="div2"></div>33 <input type="text" name="text" id="txt" value="" />34 <script type="text/javascript">35 /*36  移动端的点透:37  当上层元素发生点击的时候,下层元素也有点击(焦点)特性,38  在300ms之后,如果上层元素消失或者隐藏,目标点就会“漂移”到39  下层元素身上,就会触发点击行为。40 41  解决:42  1.下层不要使用有点击(焦点)特性的元素。43 44  2.阻止pc事件。45 46  1.IOS10下设置meta禁止用户缩放是不可行的。(使用阻止pc事件就可以在IOS10下禁止用户缩放)47 48  2.解决IOS10下溢出隐藏的问题。49 50  3.禁止系统默认的滚动条、阻止橡皮筋效果51 52  4.禁止长按选中文字、选中图片、系统默认菜单53 54  5.解决点透问题55 56  6.也阻止了焦点元素的焦点行为(要正常使用:ev.stopPropagation()阻止冒泡)57 */58 59  document.addEventListener(touchstart,function(ev){60  ev.preventDefault();61  });62 63 64 var div = document.getElementById(div1);65 var a = document.getElementById(a);66 var txt = document.getElementById(txt);67 68  div.addEventListener(touchend,end);69 70  a.addEventListener(touchstart,function(){71  window.location.href = http://www.miaov.com;72  });73 74  txt.addEventListener(touchstart,function(ev){75  ev.stopPropagation();76  });77 78 function end(){79 this.style.display = none;80  }81 82 83 84 85 </script>86 </body>87 </html>

 

移动端的事件对象

 1 <!doctype html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8" /> 5 <meta name="viewport" content="width=device-width,user-scalable=no"/> 6 <title>Document</title> 7 <style> 8 body,html{ 9  width: 100%;10  overflow: hidden;11 }12 #div1{13  width:200px;14  height: 200px;15  background: red;16  position: absolute;17  top:0;18  left:0;19  font-size:50px;20  color: #fff;21 } 22 </style>23 </head>24 <body>25 <div id="div1"></div>26 <script type="text/javascript">27 /*28  当给某个元素加上了事件绑定函数之后,事件函数默认的第一个参数就是事件对象29  事件对象:30  当用户在浏览器下触发了某个行为,事件对象会记录用户操作时一些细节信息。31 32  touches 当前位于*屏幕*上的所有手指的一个列表33 34  targetTouches 位于当前DOM元素上的手指的一个列表35 36  changedTouches 涉及当前事件的手指的一个列表37 38 */39  document.addEventListener(touchstart,function(ev){//阻止pc和浏览器的默认行为40  ev.preventDefault();41  });42 var div = document.getElementById(div1);43 44 45  div.addEventListener(touchmove,start);46 function start(ev){47 //this.innerHTML = ev.touches.length;48 //this.innerHTML = ev.targetTouches.length;49 this.innerHTML = ev.changedTouches.length;50  }51 52 53 </script>54 </body>55 </html>

 

 

加速度改变时触发 devicemotion 事件

 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <meta name="viewport" content="width=device-width,user-scalable=no" /> 6 <title>Document</title> 7 <style type="text/css"> 8 #box { 9  width: 200px;10  height: 200px;11  background: Red;12  color: #fff;13  font-size: 20px;14 } 15 </style>16 </head>17 <body>18 <div id="box"></div>19 <script type="text/javascript">20 (function(){21 var box = document.querySelector(#box);22  window.addEventListener(devicemotion, function(e) {23 var motion = e.accelerationIncludingGravity;24 var x = Math.round(motion.x);25 var y = Math.round(motion.y);26 var z = Math.round(motion.z;27  box.innerHTML = "x:"+x;28  box.innerHTML += "<br/>y:"+y;29  box.innerHTML += "<br/>z:"+z;30  });31 })(); 32 </script>33 </body>34 </html>

 

判断手机是 ios 还是 android 设备

1 <script type="text/javascript">2 var u = navigator.userAgent;3 var isAndroid = u.indexOf(Android) > -1 || u.indexOf(Adr) > -1; 4 var isiOS = !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/);5 console.log(isiOS);6 </script>

 

处理 ios 和 android 设备 对重力加速度的兼容性问题

<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,user-scalable=no" /><title>Document</title><style type="text/css">#box { width: 200px; height: 200px; background: Red; color: #fff; font-size: 20px;} </style></head><body><div id="box"></div><script type="text/javascript">(function(){ var box = document.querySelector(#box); window.addEventListener(devicemotion, function(e) { var motion = e.accelerationIncludingGravity; var x = Math.round(motion.x); var y = Math.round(motion.y); var z = Math.round(motion.z); if(getAdr()){ x = -x; y = -y; z = -z; } box.innerHTML = "x:"+x; box.innerHTML += "<br/>y:"+y; box.innerHTML += "<br/>z:"+z; });})(); function getAdr(){ var u = navigator.userAgent; return u.indexOf(Android) > -1 || u.indexOf(Adr) > -1; }</script></body></html>

 

手机摇一摇

 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <meta name="viewport" content="width=device-width,user-scalable=no" /> 6 <title>Document</title> 7 </head> 8 <body> 9 <script type="text/javascript">10 (function(){11 var lastX;12 var lastY;13 var lastZ;14 var maxRang = 80;15 var minRang = 10;16 var isShake = false;
// 摇一摇 记录上次的加速度,和当前次的加速度相减 差值大于一定幅度的时候,就可以认定用户在进行摇一摇
17 window.addEventListener(devicemotion, function(e) {18 var motion = e.accelerationIncludingGravity;19 var x = Math.round(motion.x);20 var y = Math.round(motion.y);21 var z = Math.round(motion.z);22 if(typeof lastX == "undefined"){23 lastX = x;24 lastY = y;25 lastZ = z;26 return;27 }28 var dis = Math.abs(x - lastX) + Math.abs(y - lastY) +29 Math.abs(z - lastZ);30 if(dis > maxRang) {31 isShake = true;32 }33 if(dis < minRang && isShake) {34 isShake = false;35 //执行 摇一摇之后,要操作的内容36 alert("您晃动了手机");37 }38 lastX = x;39 lastY = y;40 lastZ = z;41 });42 })();43 </script>44 </body>45 </html>

 

检测手机的横竖屏切换

<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,user-scalable=no" /><title>Document</title><style type="text/css">body,html { margin: 0; height: 100%; position: relative; overflow: hidden;} #box { width: 100%; height: 100%; font-size: 20px; position: relative;}#div { width: 100px; height: 100px; background: red;}#pop { display: none; position: absolute; left: 0; top: 0; width: 100%; height: 100%; background: #000; color: #fff; line-height: 200px; font-size: 30px; text-align: center;}</style></head><body><div id="box"> 请保持竖屏观看哟 <div id="div"></div></div><div id="pop">请不要横屏浏览页面</div><script type="text/javascript">setChange();window.addEventListener(orientationchange, function(e){ setChange()});function setChange(){ var pop = document.querySelector(#pop); if(window.orientation == 90 || window.orientation == -90) { pop.style.display = "block"; } else { pop.style.display = "none"; }}</script></body></html>

 

 

检测手机的角度切换

 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <meta name="viewport" content="width=device-width,user-scalable=no" /> 6 <title>Document</title> 7 <style type="text/css"> 8 #box { 9  width: 200px;10  height: 200px;11  background: Red;12  color: #fff;13  font-size: 20px;14 } 15 </style>16 </head>17 <body>18 <div id="box"></div>19 <script type="text/javascript">20 (function(){21 var box = document.querySelector(#box);22  window.addEventListener(deviceorientation, function(e) 23  {24 var x = Math.round(e.beta);25 var y = Math.round(e.gamma);26 var z = Math.round(e.alpha);27  box.innerHTML = "x:"+x;28  box.innerHTML += "<br/>y:"+y;29  box.innerHTML += "<br/>z:"+z;30  });31 })(); 32 </script>33 </body>34 </html>

 

 

多指操作

 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Document</title> 6 <meta name="viewport" content="width=device-width,user-scalable=no" /> 7 <style type="text/css"> 8 #box { 9  width: 200px;10  height: 200px;11  background: red;12  color: #fff;13  font-size: 30px;14 } 15 </style>16 </head>17 <body>18 <div id="box"></div>19 <script type="text/javascript">20 document.addEventListener(touchstart, function(e) {21  e.preventDefault();22 });23 window.onload = function(){24 var box = document.querySelector(#box);25 /*26  当手指触摸元素,当前屏幕上有两根或者两根以上的手指执行27 */28  box.addEventListener(gesturestart, function(e) {29 this.style.background = "blue";30  });31 /*32  当我们触发了 gesturestart时,手指位置发生变化时执行33 */34  box.addEventListener(gesturechange, function(e) {35 //e.scale; 缩放比:change时两根手指之间距离 和 start时两根手指之间的距离比值36 //this.innerHTML = e.scale;37 //e.rotation 旋转差: change时两根手指形成的直线和start时两根手指形成的直线,中间形成夹角38 this.innerHTML = e.rotation;39  });40 /*41  当我们触发了 gesturestart时,然后抬起手指,这时屏幕上的手指个少于2个或者当前元素没有手指了,就会触发gestureend42 */43  box.addEventListener(gestureend, function(e) {44 this.style.background = "red";45  });46 };47 </script>48 </body>49 </html>

 

 

封装多指操作

 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Document</title> 6 <meta name="viewport" content="width=device-width,user-scalable=no" /> 7 <style type="text/css"> 8 #box { 9  margin: 100px auto; 10  width: 200px; 11  height: 200px; 12  background: url(1.jpg) no-repeat; 13  background-size: cover; 14 }  15 </style> 16 </head> 17 <body> 18 <div id="box"></div> 19 <script type="text/javascript" src="m.Tween.js"></script> 20 <script type="text/javascript"> 21 document.addEventListener(touchstart, function(e) { 22  e.preventDefault(); 23 }); 24 window.onload = function(){ 25 var box = document.querySelector(#box); 26 var startRotate = 0; 27 var startScale = 0; 28  css(box,"translateZ",0.01); 29  setGesture({ 30  el: box, 31  start: function(e){ 32 //startRotate = css(this,"rotate"); 33  startScale = css(this,"scale"); 34  }, 35  change:function(e){ 36  css(this,"rotate",startRotate + e.rotation); 37  css(this,"scale",startScale * e.scale); 38  } 39  }) 40 }; 41 /* 42  init:{ 43  el:element//元素, (必填) 44  start:fn//gesturestart要做的操作, 45  change:fn//gesturechange要做的操作, 46  end:fn//gestureend要做的操作 47  } 48  49  勾股定理:已知直角三角形的两条直角边,求斜边的长度 50  51  斜边*斜边 = (直角1*直角1) + (直角2*直角2) 52 */ 53 function getDis(point1,point2){ 54 var x = point2.x - point1.x; 55 var y = point2.y - point1.y; 56 return Math.sqrt(x*x + y*y); 57 } 58 // Math.atan2(y,x) 斜率 由一条直线与X轴正方向所成角的正切 返回值弧度 59 // 角度转弧度: deg*Math.PI/180 60 //弧度转角度: rad*180/Math.PI  61 function getDeg(point1,point2){ 62 var x = point2.x - point1.x; 63 var y = point2.y - point1.y; 64 return Math.atan2(y,x)*180/Math.PI;  65 } 66 function setGesture(init){ 67 var el = init.el; 68 var isGestrue = false;  69 var startPoint = []; 70 if(!el){ 71 return; 72  } 73  el.addEventListener(touchstart, function(e) { 74 if(e.touches.length >= 2){ 75  isGestrue = true; //记录当前用户触发了gesture 76  startPoint[0] = {x:e.touches[0].pageX,y:e.touches[0].pageY}; 77  startPoint[1] = {x:e.touches[1].pageX,y:e.touches[1].pageY};  78  init.start&&init.start.call(el,e); 79  } 80  }); 81  el.addEventListener(touchmove, function(e) { 82 if(isGestrue&&e.touches.length >= 2){ 83 var nowPoint = []; 84  nowPoint[0] = {x:e.touches[0].pageX,y:e.touches[0].pageY}; 85  nowPoint[1] = {x:e.touches[1].pageX,y:e.touches[1].pageY}; 86 var startDis = getDis(startPoint[0],startPoint[1]); 87 var nowDis = getDis(nowPoint[0],nowPoint[1]); 88 var startDeg = getDeg(startPoint[0],startPoint[1]); 89 var nowDeg = getDeg(nowPoint[0],nowPoint[1]); 90  e.scale = nowDis/startDis; 91  e.rotation = nowDeg - startDeg; 92  init.change&&init.change.call(el,e); 93  } 94  }); 95  el.addEventListener(touchend, function(e) { 96 if(isGestrue){ 97 if(e.touches.length < 2 || e.targetTouches.length < 1){ 98  isGestrue = false; 99  init.end&&init.end.call(el,e);100  }101  }102  });103 }104 </script>105 </body>106 </html>

 

相关文章