出处:http://www.cnblogs.com/PeunZh...(中间不少问题都遇到过。)javascript
还有些文章页不错:
http://note.rpsh.net/posts/20...
https://github.com/AlloyTeam/...css
全文以下:
2013年末接触移动端,简单作下总结,首先了解下移动web带来的问题html
设备更新换代快——低端机遗留下问题、高端机带来新挑战前端
浏览器厂商不统一——兼容问题多java
网络更复杂——弱网络,页面打开慢jquery
低端机性能差——页面操做卡顿android
HTML5新技术多——学习成本不低ios
未知问题——坑多git
面对这些问题,一开始咱们只能在未知中试错,知道错误的方案才能更容易寻找正确的解决问题思路,2年多来,可看到移动web在业界不断趋向于成熟,各类框架和解决方案不断的涌现让移动端开发再也不是个噩梦。github
这几天把想到的一点经验先罗列出来,后续会持续更新,这篇文章能够给刚接触webapp开发的同窗带来帮助,任何疑问欢迎留言探讨~
目录(更新于20151222)
meta基础知识
H5页面窗口自动调整到设备宽度,并禁止用户缩放页面
忽略将页面中的数字识别为电话号码
忽略Android平台中对邮箱地址的识别
当网站添加到主屏幕快速启动方式,可隐藏地址栏,仅针对ios的safari (new)
将网站添加到主屏幕快速启动方式,仅针对ios的safari顶端状态条的样式
viewport模板 (new)
常见问题
移动端如何定义字体font-family
移动端字体单位font-size选择px仍是rem (new)
移动端touch事件(区分webkit 和 winphone) (new)
移动端click屏幕产生200-300 ms的延迟响应
触摸事件的响应顺序
什么是Retina 显示屏,带来了什么问题
ios系统中元素被触摸时产生的半透明灰色遮罩怎么去掉
部分android系统中元素被点击时产生的边框怎么去掉
winphone系统a、input标签被点击时产生的半透明灰色背景怎么去掉
webkit表单元素的默认外观怎么重置
webkit表单输入框placeholder的颜色值能改变么
webkit表单输入框placeholder的文字能换行么
IE10(winphone8)表单元素默认外观如何重置
禁止ios 长按时不触发系统的菜单,禁止ios&android长按时下载图片
禁止ios和android用户选中文字
打电话发短信写邮件怎么实现
模拟按钮hover效果
屏幕旋转的事件和样式
audio元素和video元素在ios和andriod中没法自动播放
摇一摇功能
手机拍照和上传图片
微信浏览器用户调整字体大小后页面矬了,怎么阻止用户调整
消除transition闪屏
开启硬件加速
取消input在ios下,输入的时候英文首字母的默认大写
android上去掉语音输入按钮
android 2.3 bug
android 4.x bug
设计高性能CSS3动画的几个要素
fixed bug
如何阻止windows Phone的默认触摸事件
播放视频不全屏 (new)
经常使用的移动端框架
zepto.js
iscroll.js
underscore.js
滑屏框架
flex布局 (new)
FastClick
Sea.js
H5页面窗口自动调整到设备宽度,并禁止用户缩放页面
<meta name="viewport" content="width=device-width,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no" />
忽略将页面中的数字识别为电话号码
<meta name="format-detection" content="telephone=no" />
忽略Android平台中对邮箱地址的识别
<meta name="format-detection" content="email=no" />
当网站添加到主屏幕快速启动方式,可隐藏地址栏,仅针对ios的safari
<meta name="apple-mobile-web-app-capable" content="yes" /> <!-- ios7.0版本之后,safari上已看不到效果 --> 体验demo,解决在主屏幕打开页面后,点击页面连接不会跳转到系统自带的Safari
将网站添加到主屏幕快速启动方式,仅针对ios的safari顶端状态条的样式
<meta name="apple-mobile-web-app-status-bar-style" content="black" /><!-- 可选default、black、black-translucent -->
viewport模板
viewport模板——通用
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta content="width=device-width,initial-scale=1.0,maximum-scale=1.0,user-scalable=no" name="viewport"> <meta content="yes" name="apple-mobile-web-app-capable"> <meta content="black" name="apple-mobile-web-app-status-bar-style"> <meta content="telephone=no" name="format-detection"> <meta content="email=no" name="format-detection"> <title>标题</title> <link rel="stylesheet" href="index.css"> </head> <body> 这里开始内容 </body> </html>
viewport模板 - target-density dpi=device-dpi
,android 2.3.5如下版本不支持
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name="viewport" content="width=750, user-scalable=no, target-densitydpi=device-dpi"><!-- width取值与页面定义的宽度一致 --> <meta content="yes" name="apple-mobile-web-app-capable"> <meta content="black" name="apple-mobile-web-app-status-bar-style"> <meta content="telephone=no" name="format-detection"> <meta content="email=no" name="format-detection"> <title>标题</title> <link rel="stylesheet" href="index.css"> </head> <body> 这里开始内容 </body> </html>
移动端如何定义字体font-family
中文字体使用系统默认便可,英文用Helvetica
/* 移动端定义字体的代码 */ body{font-family:Helvetica;}
参考《移动端使用字体的思考》
移动端字体单位font-size选择px仍是rem
对于只须要适配少部分手机设备,且分辨率对页面影响不大的,使用px便可
对于须要适配各类移动设备,使用rem,例如只须要适配iPhone和iPad等分辨率差异比较挺大的设备
rem配置参考:
html{font-size:10px} @media screen and (min-width:321px) and (max-width:375px){html{font-size:11px}} @media screen and (min-width:376px) and (max-width:414px){html{font-size:12px}} @media screen and (min-width:415px) and (max-width:639px){html{font-size:15px}} @media screen and (min-width:640px) and (max-width:719px){html{font-size:20px}} @media screen and (min-width:720px) and (max-width:749px){html{font-size:22.5px}} @media screen and (min-width:750px) and (max-width:799px){html{font-size:23.5px}} @media screen and (min-width:800px){html{font-size:25px}}
体验demo:http://1.peunzhang.sinaapp.co...
移动端touch事件(区分webkit 和 winphone)
当用户手指放在移动设备在屏幕上滑动会触发的touch事件
如下支持webkit
touchstart——当手指触碰屏幕时候发生。无论当前有多少只手指
touchmove——当手指在屏幕上滑动时连续触发。一般咱们再滑屏页面,会调用event的- - - preventDefault()能够阻止默认状况的发生:阻止页面滚动
touchend——当手指离开屏幕时触发
touchcancel——系统中止跟踪触摸时候会触发。例如在触摸过程当中忽然页面alert()一个提示框,此时会触发该事件,这个事件比较少用
TouchEvent
touches:屏幕上全部手指的信息
targetTouches:手指在目标区域的手指信息
changedTouches:最近一次触发该事件的手指信息
touchend时,touches与targetTouches信息会被删除,changedTouches保存的最后一次的信息,最好用于计算手指信息
参数信息(changedTouches[0])
clientX、clientY在显示区的坐标
target:当前元素
参考:https://developer.mozilla.org...
如下支持winphone 8
MSPointerDown——当手指触碰屏幕时候发生。无论当前有多少只手指
MSPointerMove——当手指在屏幕上滑动时连续触发。一般咱们再滑屏页面,会调用css的- - html{-ms-touch-action: none;}能够阻止默认状况的发生:阻止页面滚动
MSPointerUp——当手指离开屏幕时触发
移动端click屏幕产生200-300 ms的延迟响应
移动设备上的web网页是有300ms延迟的,玩玩会形成按钮点击延迟甚至是点击失效。
如下是历史缘由,来源一个公司内一个同事的分享:
2007年苹果发布首款iphone上IOS系统搭载的safari为了将适用于PC端上大屏幕的网页能比较好的展现在手机端上,使用了双击缩放(double tap to zoom)的方案,好比你在手机上用浏览器打开一个PC上的网页,你可能在看到页面内容虽然能够撑满整个屏幕,可是字体、图片都很小看不清,此时能够快速双击屏幕上的某一部分,你就能看清该部分放大后的内容,再次双击后能回到原始状态。双击缩放是指用手指在屏幕上快速点击两次,iOS 自带的 Safari 浏览器会将网页缩放至原始比例。缘由就出在浏览器须要如何判断快速点击上,当用户在屏幕上单击某一个元素时候,例如跳转连接,此处浏览器会先捕获该次单击,但浏览器不能决定用户是单纯要点击连接仍是要双击该部分区域进行缩放操做,因此,捕获第一次单击后,浏览器会先Hold一段时间t,若是在t时间区间里用户未进行下一次点击,则浏览器会作单击跳转连接的处理,若是t时间里用户进行了第二次单击操做,则浏览器会禁止跳转,转而进行对该部分区域页面的缩放操做。那么这个时间区间t有多少呢?在IOS safari下,大概为300毫秒。这就是延迟的由来。形成的后果用户纯粹单击页面,页面须要过一段时间才响应,给用户慢体验感受,对于web开发者来讲是,页面js捕获click事件的回调函数处理,须要300ms后才生效,也就间接致使影响其余业务逻辑的处理。
解决方案:
fastclick能够解决在手机上点击事件的300ms延迟
zepto的touch模块,tap事件也是为了解决在click的延迟问题
触摸事件的响应顺序
一、ontouchstart 二、ontouchmove 三、ontouchend 四、onclick
解决300ms延迟的问题,也能够经过绑定ontouchstart事件,加快对事件的响应
retina:一种具有超高像素密度的液晶屏,一样大小的屏幕上显示的像素点由1个变为多个,如在一样带下的屏幕上,苹果设备的retina显示屏中,像素点1个变为4个
在高清显示屏中的位图被放大,图片会变得模糊,所以移动端的视觉稿一般会设计为传统PC的2倍
那么,前端的应对方案是:
设计稿切出来的图片长宽保证为偶数,并使用backgroud-size把图片缩小为原来的1/2
//例如图片宽高为:200px*200px,那么写法以下
.css{width:100px;height:100px;background-size:100px 100px;}
其它元素的取值为原来的1/2,例如视觉稿40px的字体,使用样式的写法为20px
.css{font-size:20px}
参考《高清显示屏原理及设计方案》
ios用户点击一个连接,会出现一个半透明灰色遮罩, 若是想要禁用,可设置-webkit-tap-highlight-color
的alpha
值为0,也就是属性值的最后一位设置为0就能够去除半透明灰色遮罩
a,button,input,textarea{-webkit-tap-highlight-color: rgba(0,0,0,0;)}
android用户点击一个连接,会出现一个边框或者半透明灰色遮罩, 不一样生产商定义出来额效果不同,可设置-webkit-tap-highlight-color
的alpha
值为0去除部分机器自带的效果
a,button,input,textarea{ -webkit-tap-highlight-color: rgba(0,0,0,0;) -webkit-user-modify:read-write-plaintext-only; }
-webkit-user-modify
有个反作用,就是输入法再也不可以输入多个字符
另外,有些机型去除不了,如小米2
对于按钮类还有个办法,不使用a
或者input
标签,直接用div
标签
参考《如何去除android上a标签产生的边框》
<meta name="msapplication-tap-highlight" content="no">
.css{-webkit-appearance:none;}
webkit
表单输入框placeholder
的颜色值能改变么input::-webkit-input-placeholder{color:#AAAAAA;} input:focus::-webkit-input-placeholder{color:#EEEEEE;}
webkit
表单输入框placeholder
的文字能换行么ios能够,android不行~
在textarea标签下均可以换行~
IE10(winphone8)表单元素默认外观如何重置
禁用 select 默认下拉箭头
::-ms-expand
适用于表单选择控件下拉箭头的修改,有多个属性值,设置它隐藏 (display:none) 并使用背景图片来修饰可获得咱们想要的效果。
select::-ms-expand { display: none; }
radio
和 checkbox
默认样式::-ms-check
适用于表单复选框或单选按钮默认图标的修改,一样有多个属性值,设置它隐藏 (display:none)
并使用背景图片来修饰可获得咱们想要的效果。
input[type=radio]::-ms-check,input[type=checkbox]::-ms-check{ display: none; }
当表单文本输入框输入内容后会显示文本清除按钮,::-ms-clear
适用于该清除按钮的修改,一样设置使它隐藏 (display:none)
并使用背景图片来修饰可获得咱们想要的效果。
input[type=text]::-ms-clear,input[type=tel]::-ms-clear,input[type=number]::-ms-clear{ display: none; }
禁止ios 长按时不触发系统的菜单,禁止ios&android长按时下载图片
.css{-webkit-touch-callout: none}
禁止ios和android用户选中文字
.css{-webkit-user-select:none}
参考《如何改变表单元素的外观(for Webkit and IE10)》
打电话发短信写邮件怎么实现
打电话
<a href="tel:0755-10086">打电话给:0755-10086</a>
发短信,winphone系统无效
<a href="sms:10086">发短信给: 10086</a>
写邮件,可参考《移动web页面给用户发送邮件的方法》
<a href="mailto:peun@foxmail.com">peun@foxmail.com</a>
模拟按钮hover效果
移动端触摸按钮的效果,可明示用户有些事情正要发生,是一个比较好体验,可是移动设备中并无鼠标指针,使用css的hover并不能知足咱们的需求,还好国外有个激活css的active效果,代码以下,
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta content="width=device-width,initial-scale=1.0,maximum-scale=1.0,user-scalable=no" name="viewport"> <meta content="yes" name="apple-mobile-web-app-capable"> <meta content="black" name="apple-mobile-web-app-status-bar-style"> <meta content="telephone=no" name="format-detection"> <meta content="email=no" name="format-detection"> <style type="text/css"> a{-webkit-tap-highlight-color: rgba(0,0,0,0);} .btn-blue{display:block;height:42px;line-height:42px;text-align:center;border-radius:4px;font-size:18px;color:#FFFFFF;background-color: #4185F3;} .btn-blue:active{background-color: #357AE8;} </style> </head> <body> <div class="btn-blue">按钮</div> <script type="text/javascript"> document.addEventListener("touchstart", function(){}, true) </script> </body> </html>
兼容性ios5+、部分android 4+、winphone 8
要作到全兼容的办法,可经过绑定ontouchstart和ontouchend来控制按钮的类名
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta content="width=device-width,initial-scale=1.0,maximum-scale=1.0,user-scalable=no" name="viewport"> <meta content="yes" name="apple-mobile-web-app-capable"> <meta content="black" name="apple-mobile-web-app-status-bar-style"> <meta content="telephone=no" name="format-detection"> <meta content="email=no" name="format-detection"> <style type="text/css"> a{-webkit-tap-highlight-color: rgba(0,0,0,0);} .btn-blue{display:block;height:42px;line-height:42px;text-align:center;border-radius:4px;font-size:18px;color:#FFFFFF;background-color: #4185F3;} .btn-blue-on{background-color: #357AE8;} </style> </head> <body> <div class="btn-blue">按钮</div> <script type="text/javascript"> var btnBlue = document.querySelector(".btn-blue"); btnBlue.ontouchstart = function(){ this.className = "btn-blue btn-blue-on" } btnBlue.ontouchend = function(){ this.className = "btn-blue" } </script> </body> </html>
事件window.orientation
,取值:正负90表示横屏模式、0和180表现为竖屏模式;
window.onorientationchange = function(){ switch(window.orientation){ case -90: case 90: alert("横屏:" + window.orientation); case 0: case 180: alert("竖屏:" + window.orientation); break; } }
样式
//竖屏时使用的样式 @media all and (orientation:portrait) { .css{} } //横屏时使用的样式 @media all and (orientation:landscape) { .css{} }
audio
元素和video
元素在ios
和andriod
中没法自动播放应对方案:触屏即播
$('html').one('touchstart',function(){ audio.play() })
可参考《没法自动播放的audio元素》
HTML5 deviceMotion:封装了运动传感器数据的事件,能够获取手机运动状态下的运动加速度等数据。
手机拍照和上传图片
<input type="file">的accept 属性
<!-- 选择照片 --> <input type=file accept="image/*"> <!-- 选择视频 --> <input type=file accept="video/*">
使用总结:
ios 有拍照、录像、选取本地图片功能
部分android只有选取本地图片功能
winphone不支持
input控件默认外观丑陋
微信浏览器用户调整字体大小后页面矬了,怎么阻止用户调整
缘由
android侧是复写了layoutinflater 对textview作了统一处理
ios侧是修改了body.style.webkitTextSizeAdjust值
解决方案:
android使用如下代码,该接口只在微信浏览器下有效(感谢jationhuang同窗提供)
复制代码
/** * 页面加入这段代码可以使Android机器页面再也不受到用户字体缩放强制改变大小 * 可是会有一个1秒左右的延迟,期间能够考虑经过loading展现 * 仅供参考 */ (function(){ if (typeof(WeixinJSBridge) == "undefined") { document.addEventListener("WeixinJSBridgeReady", function (e) { setTimeout(function(){ WeixinJSBridge.invoke('setFontSizeCallback',{"fontSize":0}, function(res) { alert(JSON.stringify(res)); }); },0); }); } else { setTimeout(function(){ WeixinJSBridge.invoke('setFontSizeCallback',{"fontSize":0}, function(res) { alert(JSON.stringify(res)); }); },0); } })();
ios
使用-webkit-text-size-adjust
禁止调整字体大小
body{-webkit-text-size-adjust: 100%!important;}
最好的解决方案:
整个页面用rem或者百分比布局消除transition
闪屏,网络都是这么写的,但我并无测试出来
.css{ /*设置内嵌的元素在 3D 空间如何呈现:保留 3D*/ -webkit-transform-style: preserve-3d; /*(设置进行转换的元素的背面在面对用户时是否可见:隐藏)*/ -webkit-backface-visibility: hidden; }
开启硬件加速,解决页面闪白,保证动画流畅
.css { -webkit-transform: translate3d(0, 0, 0); -moz-transform: translate3d(0, 0, 0); -ms-transform: translate3d(0, 0, 0); transform: translate3d(0, 0, 0); }
参考《用CSS开启硬件加速来提升网站性能》
<input autocapitalize="off" autocorrect="off" />
android
上去掉语音输入按钮
input::-webkit-input-speech-button {display: none}
android 2.3 bug
@-webkit-keyframes
须要以0%开始100%结束,0%的百分号不能去掉
after和before伪类没法使用动画animation
border-radius不支持%单位
translate百分比的写法和scale在一块儿会致使失效,例如-webkit-transform: - - - - translate(-50%,-50%) scale(-0.5, 1)
android 4.x bug
三星 Galaxy S4中自带浏览器不支持border-radius缩写
同时设置border-radius和背景色的时候,背景色会溢出到圆角之外部分
部分手机(如三星),a连接支持鼠标:visited事件,也就是说连接访问后文字变为紫色
android没法同时播放多音频audio
参考《border-radius 移动之伤》
尽量地使用合成属性transform
和opacity
来设计CSS3
动画,不使用position
的left
和top
来定位
利用translate3D
开启GPU加速
参考《High Performance Animations》
ios下fixed元素容易定位出错,软键盘弹出时,影响fixed元素定位
android下fixed表现要比iOS更好,软键盘弹出时,不会影响fixed元素定位
ios4下不支持position:fixed
解决方案
可用isroll.js,暂无完美方案
参考
《移动端web页面使用position:fixed问题总结》
《使用iScroll.js解决ios4下不支持position:fixed的问题》
windows Phone
的默认触摸事件winphone
下默认触摸事件事件使用e.preventDefault
是无效的
目前解决方法是使用样式来禁用
html{-ms-touch-action: none;}/* 禁止winphone默认触摸事件 */
参考
《Windows phone 8 touch support》
<!-- 1.ios7+支持自动播放 2.支持Airplay的设备(如:音箱、Apple TV)播放 x-webkit-airplay="true" 3.播放视频不全屏 webkit-playsinline="true" --> <video x-webkit-airplay="true" webkit-playsinline="true" preload="auto" autoplay src="http://"></video>
zepto.js
语法与jquery几乎同样,会jquery基本会zepto~
最新版本已经更新到1.16
中文(非官网):http://www.css88.com/doc/zept...
浏览器检测:https://github.com/madrobby/z...
tap事件:https://github.com/madrobby/z...
解决页面不支持弹性滚动,不支持fixed引发的问题~
实现下拉刷新,滑屏,缩放等功能~
最新版本已经更新到5.0
笔者没用过,不过据说好用,推荐给你们~
该库提供了一整套函数式编程的实用功能,可是没有扩展任何JavaScript内置对象。
最新版本已经更新到1.8.2
适合上下滑屏、左右滑屏等滑屏切换页面的效果
slip.js
iSlider.js
fullpage.js
flex布局目前可以使用在移动中,并不是全部的语法都全兼容,但如下写法笔者实践过,效果良好~
/* ============================================================ flex:定义布局为盒模型 flex-v:盒模型垂直布局 flex-1:子元素占据剩余的空间 flex-align-center:子元素垂直居中 flex-pack-center:子元素水平居中 flex-pack-justify:子元素两端对齐 兼容性:ios 4+、android 2.3+、winphone8+ ============================================================ */ .flex{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;} .flex-v{-webkit-box-orient:vertical;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;} .flex-1{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;} .flex-align-center{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;} .flex-pack-center{-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;} .flex-pack-justify{-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;}
示例:两端对齐
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta content="width=device-width,initial-scale=1.0,maximum-scale=1.0,user-scalable=no" name="viewport"> <meta content="yes" name="apple-mobile-web-app-capable"> <meta content="black" name="apple-mobile-web-app-status-bar-style"> <meta content="telephone=no" name="format-detection"> <meta content="email=no" name="format-detection"> <style type="text/css"> /* ============================================================ flex:定义布局为盒模型 flex-v:盒模型垂直布局 flex-1:子元素占据剩余的空间 flex-align-center:子元素垂直居中 flex-pack-center:子元素水平居中 flex-pack-justify:子元素两端对齐 兼容性:ios 4+、android 2.3+、winphone8+ ============================================================ */ .flex{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;} .flex-v{-webkit-box-orient:vertical;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;} .flex-1{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;} .flex-align-center{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;} .flex-pack-center{-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;} .flex-pack-justify{-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;} </style> </head> <body> <div class="flex flex-pack-justify"> <div>模块一</div> <div>模块二</div> <div>模块三</div> <div>模块四</div> </div> </body> </html>
使用注意:
flex下的子元素必须为块级元素,非块级元素在android2.3机器下flex失效
flex下的子元素宽度和高度不能超过父元素,不然会致使子元素定位错误,例如水平垂直居中
参考:
flexyboxes
“老”的Flexbox和“新”的Flexbox
跨浏览器的Flexbox
FastClick
消除在移动浏览器上触发click事件与一个物理Tap(敲击)之间的300延迟
参考《FastClick》
提供简单、极致的模块化开发体验
腾讯关于移动端问题的解决方案:
http://www.alloyteam.com/2015...
简单友好的模块定义规范:Sea.js 遵循 CMD 规范,能够像 Node.js 通常书写模块代码。
天然直观的代码组织方式:依赖的自动加载、配置的简洁清晰,可让咱们更多地享受编码的乐趣。
地址:http://seajs.org/docs/
做者:白树
出处:http://peunzhang.cnblogs.com/
-webkit-overflow-scrolling: touch;