移动端学习
2016-12-16 10:41
295 查看
移动端事件
第一天:
e.preventDefault();阻止默认事件阻止掉document.touchstart事件,可以解决以下两个问题: 1.阻止页面上的文字被选中 可以通过阻止冒泡,是某个元素里边的文字被选中 2.阻止页面上的菜单系统
隐患:页面上的所有滚动条失效
ios上的橡皮筋效果可以通过阻止默认事件实现,
阻止冒泡
e.stopPropagation();
事件点透
PC端鼠标事件在移动端也可以使用,但是有300ms的延迟 1.在移动端PC事件邮300ms的延迟, 2.我们点击了以后,浏览器会记录点击下去的坐标,然后在300ms以后执行事件; 3.在300ms以后,在该坐标找到现在在这个未知的元素,执行事件
解决方法:
1.阻止默认事件(部分安卓机型不支持) 2.不在移动端使用鼠标事件,不用a标签做页面跳转
获取手指信息
e.thouchs //当前屏幕上的手指列表 e.tragetTouches //当前元素上的手指列表 e.changedThouches //触发当前事件的手指列表
第二天:
简易的幻灯片
第三天:
移动端适配
(function(window){ var html = document.querySelector('html'); var width = html.getBoundingClientRect().width; html.style.fontSize = width / 16 + 'px'; })(window)
二.通过viewPort解决
1.页面宽度定死2.动态设置viewPort 把可视宽度设置为320
width = [pixe_value | device-width],//viewPort的宽度
initial-scale = float_value, //初始化缩放比例
minimum-scale = float_value,//最小缩放比例
maximun-scale = float_value,//最大缩放比例
user-scalable = [yes | no] //是否允许缩放
(function(window){ //设置了viewPort 默认width=device-width 不设置viewPort width默认宽度是980 var width = window.screen.width;//获取屏幕宽度 var targetW = 320; //想要固定的宽度 var scale = width / targetW; //得到像素比 var meta = document.createElement('meta'); meta.setAttribute('name','viewport'); // 使用像素比设置viewPort 缩放比例 meta.setAttribute('content', 'width=device-width,user-scalable=no,initial-scale='+scale+'minimum-scale='+scale+'maximum-scale='+scale); document.heade.appendChild(meta); })(window)
三。横竖屏切换
1.rem 横竖屏切换
(function(window){setRem();
function setRem(){//设置html字体大小
var html = document.querySelector(‘html’);
var width = html.getBoundingClientRect().width;
html.style.fontSize = width / 16 + ‘px’;
}
// orientationchage 横竖屏切换事件
window.addEventListener(‘orientationchange’,function(){
setRem();
})
})(window)
2.viewPort 横竖屏切换
在竖屏的时候 window.orientation = 90 || -90;
在横屏屏的时候 window.orientation = 0 || 180;
var width = (window.orientation == 90||window.orientation == -90)? window.screen.height: window.screen.width var targetW = 320; var scale = width / targetW; var meta = document.createElement('meta'); alert(width); meta.setAttribute('name', 'viewport'); meta.setAttribute('content', "user-scalable=no,initial-scale="+scale+",minimum-scale="+scale+",maximum-scale="+scale); document.head.appendChild(meta); window.addEventListener( "orientationchange", function() { setTimeout( function() { window.location.href = window.location.href; }, 1000 ); } );
四.取图大小
注:如果说在table里边给某个元素设置positive定位的话,在IE下屏幕滚动的时候会有卡屏的现象
// window.devicePixelRatio 像素比
// 用几个像素的大小显示一像素的内容
// 设计图的宽度最好都在750以上
五.css3D
常用属性
rotate
rotateX
rotateY
rotateZ
translate
perspective: 300px; 设置景深。
Math.tan(弧度) 正切 =》 对边/领边; 弧度=角度*PI/180;
邻边 =》 对边*正切
“`
六。手写3d桌面整理
一.HTML结构1.一个包裹层
2.页面包含一个头部(header)
3.一个内容部分 (list)
子列表(li>p*3>span*4)
一个底部
二.CSS部分
使用百分比布局
1.布局代码,省略
2.3d显示代码
.list 设置perspective 属性 创建一个3d显示空间
.item 设置浮动 设置position:relative; 显示每一列 设置transform-style: preserve-3d;设置过度为3d
p设置position:absolute; 一列布局的包裹层 旋转角度使用js计算后设置
span 设置display为block 快100% 高根据行数这是 行/h*100%
三.js部分
1.禁止默认事件
2.设置布局属性 rotateZ (旋转外角)
/*设置旋转*/ var n = 3;//有几个面 var deg = 360/n;需要旋转的角度(外角) var z = (Math.tan( (180-deg)/2*Math.PI/180)*元素宽/2).toFixed(4); var style = document.querySelector('#style'); str = ''; for(var i = 1 ;i < .item.length; i++){ str+=' .item p:nth-of-type('+(i)+'){-webkit-transform: rotateY('+(i-1)*deg+'deg) translateZ('+z+'px);transform: rotateY('+(i-1)*deg+'deg) translateZ('+z+'px); transform-origin:center center '+0+'px;}'; } style.innerHTML += str; <!-- 注:为了解决iOS小旋转基点的问题 在.item上设置z轴后移z像素 子元素p设置z轴前移z像素 -->
3.设置touch事件
var item = document.querySelectorAll('.item'); //给每个item设置rotate 方便后期获取 for(var i = 0; i<item.length;i++){ cssTransform(item[i],"translateZ",-z); cssTransform(item[i],"rotateY",0); } var startX =0;//手指初始屏幕左边 var satrtPointe=0;//初始旋转角度 list.addEventListener('touchstart',function(e){ for(var i=0;i<item.length;i++){ item[i].style.transition="none"; } var touch = e.changedTouches[0]; startX = touch.pageX; satrtPointe=cssTransform(item[0],"rotateY"); }); list.addEventListener('touchmove',function(e){ var touch = e.changedTouches[0]; var dis = startX - touch.pageX; nowPointe = dis/htmlReact.width*deg; for(var i=0;i<item.length;i++){ cssTransform(item[i],"rotateY",satrtPointe-nowPointe); } }); list.addEventListener('touchend',function(e){ //得到当前旋转角度 var nowDeg = cssTransform(item[0],"rotateY"); //通过四舍五入判断得到旋转的系数 var now = (-Math.round(nowDeg/deg)); //now = now < 0? 3+now:now; 系数*旋转教的(deg)等于最终的位置 console.log(now,-now*deg,nowDeg); for(var i = 0; i<item.length;i++){ item[i].style.transition = "transform .5s"; cssTransform(item[i],"rotateY",-now*deg); } }); // cssTransform兼容写法 function cssTransform(el,attr,val) { if(!el.transform){ el.transform = {}; } if(arguments.length>2) { el.transform[attr] = val; var sVal = ""; for(var s in el.transform){ switch(s) { case "rotate": case "rotateX": case "rotateY": case "rotateZ": case "skewX": case "skewY": sVal +=s+"("+el.transform[s]+"deg) "; break; case "translateX": case "translateY": case "translateZ": sVal +=s+"("+el.transform[s]+"px) "; break; case "scaleX": case "scaleY": case "scale": sVal +=s+"("+el.transform[s]+") "; break; } el.style.transform = sVal; el.style.WebkitTransform = sVal; } } else { val = el.transform[attr]; if(typeof val == "undefined" ) { if(attr == "scale" || attr == "scaleX" || attr == "scaleY" ) { val = 1; } else { val = 0; } } return val; } }
相关文章推荐
- 整理----通过/proc/diskstat 计算android I/O数据
- 判断ios和android以及微信和其他浏览器
- iOS关于时间的处理
- SEAndroid安全机制中的进程安全上下文的关联分析
- iOS 加载Bundle文件的实例代码
- android打开office资源
- Android自定义加载动画
- iOS开发中验证手机号是否合法
- android MediaCodec 音频编解码的实现——转码(好文)
- 使用Cordova将网站(Web Applications)封装为移动Apps
- iOS 加载Bundle文件
- 通过样式来去除app的头以及界面全屏(备忘)
- iOS系统库头文件中NS_AVAILABLE相关
- android 开发 ANR
- Android状态栏微技巧
- multipart/form-data与application/octet-stream的区别、application/x-www-form-urlencoded
- 微信支付(三) - 异步通知并且查询支付结果
- App运行速度分析以及初步优化方案
- Android 判断是开发debug模式,还是发布release模式的方法
- Android onTouchEvent java.lang.IndexOutOfBoundsException