移动web开发要点总结
摘录自无线Web开发经验谈
针对移动端的web开发主要基于移动端的浏览器,不管安卓还是IOS的浏览器都是基于webkit的,因此移动端开发可以说是针对webkit浏览器的开发。
HTML
- meta-viewport
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, minimun-scale=1, user-scalable=1"/>
移动端浏览器通常都会设置一个“布局视口”,它的宽度通常很大,比如980px,这样就使得小屏的移动设备能够一次性完整地展示pc端的页面,避免出现横向滚动条。
但是为了针对移动端进行开发,我们需要通过viewport来设置视口的宽度及其他属性。
- width=device-width将视口宽度设置为设备宽度,而不是那个虚拟的宽度。
- user-scalable为yes/no,或者1/0表示是否允许用户缩放。
- initial-scale用于设置Web页面的初始缩放比例,设为1.0则将显示未经缩放的Web文档。>1将放大,<1将缩小
- maximum-scale和minimum-scale用于设置用户对Web页面缩放比例的限制。值的范围为0.25至10.0之间。
- input标签
针对input标签的一些类型,移动端可以弹出对应的键盘。
- text:文本 此类型说明输入框为文本信息,对应的键盘而言,Android和ios都会弹出全键盘。
- password
- button、checkbox、radio、reset、submit都可以使用
- email、search、tel、url等类型,这些标签的外观和text类型一致
CSS3
如果说起手机Web的CSS,就需要说起-webkit-的前缀的CSS的属性。这些前缀是专门为了webkit核心的浏览器设置的属性,可能很多-webkit-的属性,已经成功通用的属性了,不需要再加前缀。不过为了兼容低版本的浏览器,在设置的时候,还是需要加上-webkit-前缀。
hover与active
移动端不支持:hover和:active伪类,因此要实现这个效果的话,可以在body上添加ontouchstart:
<body ontouchstart>
或者直接给body绑定一个ontouchstart事件:
document.body.addEventListener('touchstart', function () { //...空函数即可});
参考依据是:
By default, Safari Mobile does not use the :active state unless there is a touchstart event handler on the relevant element or on the
<body>
.
布局
- flex
- position:fixed
- :before、:after
before和after原先在w3c的定义中,主要在节点的前面和后面插入一段内容,因此在before和after中必须要有content的属性以及数值。
渲染
- 2d渲染:
- border-radius
- box-shadow
- text-shadow
- linear-gradient
- border-image
- 3d渲染
3D的最大的好处,它使用了硬件加速功能。因此在做页面动画的时候使用translate3d(),可以有效开启硬件加速,使渲染性能更好,动画更流畅。
具体可以参考CSS动画的性能优化
动画
由于网页的DOM的特性,动画是非常消耗性能的,再加上网页是单进程单线程的,因此所有的程序运行都会在一根ui线程里运行。手机上的性能还没有达到PC上的性能,因此动画的性能问题在手机上显得异常突出。
js
- 使用document.querySelector和document.querySelectorAll
Zepto
对于jquery大家应该会非常的熟悉,在web手机上也有一个轻量级的类库工具,那就是Zepto,它的很多api接口保持和jquery的接口兼容,其体积非常小,gzip的包在10k左右,非常适合在手机上的无线环境中加载。移动事件
- orientationchange :设备方向旋转时触发的事件
- touchstart、touchmove、touchend、touchcancel
通过这些事件,可以模拟出各种用户的手势,不过由于其处理比较复杂,可能模拟最多的是tap事件
在移动端safari中,click事件会有300ms的延迟,原因就是浏览器需要判断用户这次点击是否是双击,如果300ms内用户没有进行下一次点击那么才判断为单击事件。
因此一般使用zepto的tap事件来替代click事件
- scroll
这个事件在PC上的触发时机和手机上的触发时机不同,scroll事件在手机上,只有在滚动停止的时候才会发生,因此这个事件在移动端用的比较少,因为触发的时机已经晚了。对于需要在移动中,改变页面结构的功能,用scroll是无法完成的。
基础知识
meta标签
这些meta标签在开发webapp时起到非常重要的作用
<meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0" 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标签是iphone设备中的safari私有meta标签,它表示:允许全屏模式浏览;
- 第三个meta标签也是iphone的私有标签,它指定的iphone中safari顶端的状态条的样式
- 第四个meta标签表示:告诉设备忽略将页面中的数字识别为电话号码
开发技巧
retina屏
- 物理像素:设备的真实像素,比如iPhone 5的分辨率640 x 1136px。
- css像素:css代码中使用的逻辑像素。
设备像素比dpr = 物理像素/css像素,这里retina屏的dpr就是2.
对于retina屏,2个物理像素才表示一个css像素,因此一个200*300的div在设备上就需要400*600的区域来表示。因此一个正常的图片,在retina屏上就会显示的模糊一些。
这里主要考虑使用CSS sprites来优化:
使用媒体查询,在正常分辨率下加载的是@1x图像,而在retina屏下加载的就是@2x图像,即二倍图,二倍图的尺寸是正常图像即单倍图的二倍。
span.location {background: url(location.png) no-repeat 0 0;
}@media only screen and (-webkit-min-device-pixel-ratio: 2),
only screen and (min-device-pixel-ratio: 2) {span.location {background-image: url(location@2x.png);background-size: 16px 14px;}
同时注意在使用二倍图的时候要规定background-size,以正确定位图片。
首屏速度
第一次打开h5页面的时候,与pc相比,要下载许多图片、音频等资源,首屏速度很有可能会非常慢,不做处理的话就会有很长一段时间的白屏。
除了与浏览器性能优化相同的手段如减少请求数、压缩、使用缓存等方法外,移动端还有自己的一套优化哲学。
以下是我在做h5时采用的一些方案:
js、css内联
省去请求预加载+loading页面
预加载维护一个资源列表,我这里是h5中需要的所有图片。预加载程序会去加载所有图片,加载完成的数量与总量的比值还可以用作loading页面的加载数据。当所有图片都加载完成时进入首屏。
我是用的是前端资源预加载并展示进度条这个工具。
原理其实也相当简单,就是维护一个资源列表,挨个去加载列表中的资源,然后在每个资源加载完成的回调函数中更新进度即可。
loader.prototype.start = function(){for(int i=0;i<resources.length;i++){var image = new Image();image.onload = function(){this.loaded();}image.src = resources[i].url;}
}
loader.prototype.loaded = functon(){this.currFinish++;if(this.currFinish == this.total){//加载完成!}
}
加载过程的优化
浏览器显示页面的过程: 首先是DNS解析,然后建立TCP连接,接着下载HTML内容以及资源文件,最后才是整个页面的渲染
这四个阶段分别可以通过dns-prefetch、subresource、prefetch、prerender来帮助浏览器优化性能
- DNS prefetch
dns-prefetch可以指示浏览器去预先解析DNS域名。这样可以减少将要打开页面的延迟。
DNS 请求需要的带宽非常小,但是延迟却有点高,这点在手机网络上特别明显。预读取 DNS 能让延迟明显减少一些。
DNS Prefetching特性允许开发者手动控制,告诉浏览器需要解析哪个域名:
<link rel="dns-prefetch" href="//fonts.googleapis.com">
<link rel="dns-prefetch" href="//google-analytics.com">
<link rel="dns-prefetch" href="//www.google-analytics.com">
<link rel="dns-prefetch" href="//platform.twitter.com">
也可以通过在服务器端发送 X-DNS-Prefetch-Control 报头来开启DNS预读取:
X-DNS-Prefetch-Control: on
X-DNS-Prefetch-Control: off
- prefetch
允许开发者在页面加载的时候预先加载他们希望指定的页面或元素:
<link rel="prefetch" href="http://daker.me/2013/05/hello-world.html" />
<link rel="prefetch" href="http://daker.me/assets/images/avatar.png" />
- prerender
可以用prerender来让浏览器在后台事先渲染好整个页面,这样它的打开速度将会是0秒!
<link rel="prerender" href="checkout.html">
移动web开发要点总结相关推荐
- 手机端网页web开发要点
头部必须要加的 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /& ...
- Web开发:HTML5、CSS、JavaScript必备教程
2019独角兽企业重金招聘Python工程师标准>>> Web开发:HTML5.CSS.JavaScript必备教程 想开启Web开发的智慧之门吗?想DIY炫酷的网页特效设计吗?想通 ...
- java开发环境搭建 pdf_01搭建java web开发环境.pdf
01搭建java web开发环境.pdf 还剩 19页未读, 继续阅读 下载文档到电脑,马上远离加班熬夜! 亲,很抱歉,此页已超出免费预览范围啦! 如果喜欢就下载吧,价低环保! 内容要点: ( 7)在 ...
- java web 开发技术大全 代码_Java Web开发技术大全
资深程序员全力打造,深入剖析SSH框架整合开发的精髓 全方位解读Java Web开发的基础知识.高级技术及应用案例 内容全面,讲解详细,全面覆盖JSP.Se rvlet.AJAX及SSH框架整合开发 ...
- [转载] Python Web开发—进阶提升 490集超强Python视频教程 真正零基础学习Python视频教程
参考链接: 在Python中创建代理Web服务器 2 Python Web开发-进阶提升 490集超强Python视频教程 真正零基础学习Python视频教程 [课程简介] 这是一门Python We ...
- .net web开发经典图书总结
这些年读.net关于web开发的方方面面的书很多,如下从历史的书单中选取一些比较经典的图书供参考. C#基础 语言基础和工具使用非常重要,如下是基本比较经典的图书 书名 概要 CLR via C#(第 ...
- 专家访谈:Flex技术对web开发的影响
专家访谈:Flex技术对Web开发的影响 专家简介:姜天格,时任NTTDATA数据系统集成(北京)上海公司项目经理.有多年项目管理经验,在软件项目管理.软件过程改进等方面有深入的研究. 1. ...
- 观光公交削弱_削弱Web开发人员和Internet的7大障碍
观光公交削弱 As a web developer I periodically take a step back from the text editor and look at the lands ...
- Web开发 ------ 基于Flask的 任务清单管理系统(二):用户认证
文章目录 任务清单管理系统(二) 一.用户认证 1.数据库模型 (1)技术要点 (2)核心代码 提交数据库 提交github: (3)测试代码 2.Flask-Login优化数据库模型 (1)技术要点 ...
最新文章
- Python ssh连接Linux服务器报Incompatible ssh peer (no acceptable kex algorithm) 解决方法
- 二叉排序树(c/c++)
- Boost:逐步定义的测试程序
- 「Apollo」protobuf报错No module named ‘google‘
- Android 查看设备文件
- TCP对应的应用层协议之FTP /SMTP / HTTP
- Java static 静态代码块、代码块
- AcWing基础算法课Level-2 第六讲 贪心
- 遗留非springboot传统项目接入eureka注册与服务发现
- 面向对象三大特征之多态——Java笔记(七)
- 判断变量是空_python基础(二):变量的数据类型、常量、操作符、分支、循环、条件判断...
- USB无线网卡的Linux驱动移植
- 实现网站二维码扫描登录
- 软件测试的环境部署怎么做?
- Banner大小之国际标准
- void main java_详细讲解Java中的main()方法
- java学习(类和对象)
- 云速美建站手机端使用百度app打开手机端网站闪退的问题
- swing重写右上角叉号
- UI设计好学吗?UI设计的流程是什么
热门文章
- C++信号量实现线程间同步,windows使用SetEvent,linux使用sem_t,QT测试
- java jdbc 是什么意思_java中的jdbc是什么,
- IEC标准中type1 type2 type3输入
- 可靠性试验类毕业论文文献都有哪些?
- 100个相见恨晚的Python库
- 什么是ChainLink (LINK)
- SQL查询语句分步详解——多字段分组查询
- 5G的前世今生---简述移动通信的发展
- Java课堂笔记第九次428
- 真实版“删库跑路”?程序员蓄意破坏线上生产环境