移动端rem.js及移动端的一些属性和事件
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 })()
----------------start--------------
以下内容参考博客:https://www.cnblogs.com/agansj/p/8243880.html
代码一: window.onload = function(){ /*720代表设计师给的设计稿的宽度,你的设计稿是多少,就写多少;100代表换算比例,这里写100是 为了以后好算,比如,你测量的一个宽度是100px,就可以写为1rem,以及1px=0.01rem等等*/ getRem(720,100) }; window.onresize = function(){ getRem(720,100) }; function getRem(pwidth,prem){ var html = document.getElementsByTagName("html")[0]; var oWidth = document.body.clientWidth || document.documentElement.clientWidth; html.style.fontSize = oWidth/pwidth*prem + "px"; }
代码二: 小米官网的写法 !function(n){ var e=n.document, t=e.documentElement, i=720, d=i/100, o="orientationchange"in n?"orientationchange":"resize", a=function(){ var n=t.clientWidth||320;n>720&&(n=720); t.style.fontSize=n/d+"px" }; e.addEventListener&&(n.addEventListener(o,a,!1),e.addEventListener("DOMContentLoaded",a,!1)) }(window);
------------------end----------------------
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一般可视区宽度在移动端是980 4 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.devicePixelRatio 4 //像素比把一个像素 放大至 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个或者当前元素没有手指了,就会触发gestureend 42 */ 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>