移动时代本以为到移动端,就再也不用担心IE兼容问题,可是移动的设备,其实是更大的坑。面对这些问题,一开始我们只能在未知中试错,知道错误的方案,才能更容易寻找正确的解决问题思路。可看到移动web在业界不断趋向于成熟,各种框架和解决方案,不断的涌现让移动端开发不再是个噩梦。
这几天把想到的一点经验先罗列出来,后续会持续更新,这篇文章可以给刚接触webapp开发的同学带来帮助,任何疑问欢迎留言探讨!
前因 | 后果 |
---|---|
设备更新换代快 | 低端机遗留下问题、高端机带来新挑战 |
浏览器厂商不统一 | 兼容问题多 |
网络更复杂 | 弱网络,页面打开慢 |
低端机性能差 | 页面操作卡顿 |
HTML5新技术多 | 学习成本不低 |
未知问题 | 坑多 |
常见问题
1 | 移动端如何定义字体font-family |
参考《移动端使用字体的思考》
移动端字体单位font-size选择px还是rem
1 | 对于只需要适配少部分手机设备,且分辨率对页面影响不大的,使用px即可 |
meta基础知识
H5页面窗口自动调整到设备宽度,并禁止用户缩放页面
1 | <meta name="viewport" content="width=device-width,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no" /> |
忽略将页面中的数字识别为电话号码
1 | <meta name="format-detection" content="telephone=no" /> |
忽略Android平台中对邮箱地址的识别
1 | <meta name="format-detection" content="email=no" /> |
当网站添加到主屏幕快速启动方式,可隐藏地址栏,仅针对ios的safari
1 | <meta name="apple-mobile-web-app-capable" content="yes" /> |
体验demo,解决在主屏幕打开页面后,点击页面链接不会跳转到系统自带的Safari
将网站添加到主屏幕快速启动方式,仅针对ios的safari顶端状态条的样式
1 | <meta name="apple-mobile-web-app-status-bar-style" content="black" /> |
viewport模板
viewport模板——通用
1 |
|
viewport模板 - target-densitydpi=device-dpi,android 2.3.5以下版本不支持
1 |
|
参考案例:http://action.weixin.qq.com/payact/readtemplate?t=mobile/2015/wxzfsht/index_tmpl
rem配置参考:
1 | html{ |
体验demo:http://1.peunzhang.sinaapp.com/demo/rem/index.html
1 | 移动端touch事件(区分webkit 和 winphone) |
1 | TouchEvent |
参数信息(changedTouches[0])
clientX、clientY在显示区的坐标
target:当前元素
参考:https://developer.mozilla.org/en-US/docs/Web/API/TouchEvent
以下支持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 浏览器会将网页缩放至原始比例。
1 | 原因就出在浏览器需要如何判断快速点击上,当用户在屏幕上单击某一个元素时候,例如跳转链接<a href="#"> |
解决方案:
fastclick可以解决在手机上点击事件的300ms延迟
zepto的touch模块,tap事件也是为了解决在click的延迟问题
触摸事件的响应顺序
1、ontouchstart 2、ontouchmove 3、ontouchend 4、onclick
解决300ms延迟的问题,也可以通过绑定ontouchstart事件,加快对事件的响应
什么是Retina 显示屏,带来了什么问题
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系统中元素被触摸时产生的半透明灰色遮罩怎么去掉
ios用户点击一个链接,会出现一个半透明灰色遮罩, 如果想要禁用,可设置-webkit-tap-highlight-color的alpha值为0,也就是属性值的最后一位设置为0就可以去除半透明灰色遮罩
a,button,input,textarea{-webkit-tap-highlight-color: rgba(0,0,0,0;)}
部分android系统中元素被点击时产生的边框怎么去掉
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标签产生的边框》
winphone系统a、input标签被点击时产生的半透明灰色背景怎么去掉
1 | <meta name="msapplication-tap-highlight" content="no"> |
webkit表单元素的默认外观怎么重置
1 | .css{-webkit-appearance:none;} |
webkit表单输入框placeholder的颜色值能改变么
1 | input::-webkit-input-placeholder{color:#AAAAAA;}input:focus::-webkit-input-placeholder{color:#EEEEEE;} |
webkit表单输入框placeholder的文字能换行么
1 | ios可以,android不行~ |
禁用 radio 和 checkbox 默认样式
1 | ::-ms-check 适用于表单复选框或单选按钮默认图标的修改,同样有多个属性值,设置它隐藏 (display:none) 并使用背景图片来修饰可得到我们想要的效果。 |
禁用PC端表单输入框默认清除按钮
1 | 当表单文本输入框输入内容后会显示文本清除按钮, |
禁止ios 长按时不触发系统的菜单,禁止ios&android长按时下载图片
1 | .css{-webkit-touch-callout: none} |
禁止ios和android用户选中文字
1 | .css{-webkit-user-select:none} |
参考《如何改变表单元素的外观(for Webkit and IE10)》
打电话发短信写邮件怎么实现
1 | 打电话 |
1 | 发短信,winphone系统无效 |
写邮件,可参考《移动web页面给用户发送邮件的方法》
1 | <a href="mailto:peun@foxmail.com">peun@foxmail.com</a> |
模拟按钮hover效果
移动端触摸按钮的效果,可明示用户有些事情正要发生,是一个比较好体验,但是移动设备中并没有鼠标指针,使用css的hover并不能满足我们的需求,还好国外有个激活css的active效果,代码如下,
1 |
|
兼容性ios5+、部分android 4+、winphone 8
要做到全兼容的办法,可通过绑定ontouchstart和ontouchend来控制按钮的类名
1 |
|
屏幕旋转的事件和样式
1 | 事件 |
1 | 样式 |
audio元素和video元素在ios和andriod中无法自动播放
应对方案:触屏即播
1 | $('html').one('touchstart',function(){ audio.play()}) |
可参考《无法自动播放的audio元素》
摇一摇功能
HTML5 deviceMotion:封装了运动传感器数据的事件,可以获取手机运动状态下的运动加速度等数据。
手机拍照和上传图片
1 | <input type="file">的accept 属性 |
1 | <!-- 选择照片 --> |
使用总结:
1 | ios 有拍照、录像、选取本地图片功能 |
ios使用-webkit-text-size-adjust禁止调整字体大小
1 | body{-webkit-text-size-adjust: 100% ;} |
消除transition闪屏
1 | 网络都是这么写的,但我并没有测试出来 |
1 | .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在ios下,输入的时候英文首字母的默认大写
1 | <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 移动之伤》
设计高性能CSS3动画的几个要素
尽可能地使用合成属性transform和opacity来设计CSS3动画,不使用position的left和top来定位
利用translate3D开启GPU加速
参考《High Performance Animations》
fixed bug
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 | <!--1.目前只有ios7+、winphone8+支持自动播放2.支持Airplay的设备(如:音箱、Apple TV)播放x-webkit-airplay="true" 3.播放视频不全屏,ios7+、winphone8+支持,部分android4+支持(含华为、小米、魅族)webkit-playsinline="true" --> |
常用的移动端框架
zepto.js
语法与jquery几乎一样,会jquery基本会zepto~
最新版本已经更新到1.16
官网:
中文(非官网):
iscroll.js
解决页面不支持弹性滚动,不支持fixed引起的问题~
实现下拉刷新,滑屏,缩放等功能~
最新版本已经更新到5.0
官网:
underscore.js
笔者没用过,不过听说好用,推荐给大家~
该库提供了一整套函数式编程的实用功能,但是没有扩展任何JavaScript内置对象。
最新版本已经更新到1.8.2
官网:
滑屏框架
适合上下滑屏、左右滑屏等滑屏切换页面的效果
slip.js
iSlider.js
fullpage.js
swiper.js
flex布局
flex布局目前可使用在移动中,并非所有的语法都全兼容,但以下写法笔者实践过,效果良好~
1 | flex:定义布局为盒模型 |
示例:两端对齐
1 |
|
使用注意:
flex下的子元素必须为块级元素,非块级元素在android2.3机器下flex失效
flex下的子元素宽度和高度不能超过父元素,否则会导致子元素定位错误,例如水平垂直居中
参考:
flexyboxes
“老”的Flexbox和“新”的Flexbox
跨浏览器的Flexbox
FastClick
消除在移动浏览器上触发click事件与一个物理Tap(敲击)之间的300延迟
参考《FastClick》
Sea.js
提供简单、极致的模块化开发体验
简单友好的模块定义规范:Sea.js 遵循 CMD 规范,可以像 Node.js 一般书写模块代码。
自然直观的代码组织方式:依赖的自动加载、配置的简洁清晰,可以让我们更多地享受编码的乐趣。
目录(更新于20160128)
meta基础知识
H5页面窗口自动调整到设备宽度,并禁止用户缩放页面
忽略将页面中的数字识别为电话号码
忽略Android平台中对邮箱地址的识别
当网站添加到主屏幕快速启动方式,可隐藏地址栏,仅针对ios的safari
将网站添加到主屏幕快速启动方式,仅针对ios的safari顶端状态条的样式
viewport模板
常见问题
移动端如何定义字体font-family
移动端字体单位font-size选择px还是rem
移动端touch事件(区分webkit 和 winphone)
移动端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的默认触摸事件
播放视频不全屏
常用的移动端框架
zepto.js
iscroll.js
underscore.js
滑屏框架
flex布局
FastClick
Sea.js
移动布局:
MDN:手机网页开发
MDN:在移动浏览器中使用viewport元标签控制布局
移动前端开发和 Web 前端开发的区别是什么
Alloyteam移动开发规范概述
手机/移动前端开发需要注意的20个要点
w3cplus响应式技术资源
浅谈移动Web开发
Alloyteam Mars
移动WEB开发入门
移动开发资源集合
The Mobile Web Handbook
MobileWeb 适配总结
移动前端不得不了解的html5 head 头标签