摘录自无线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开发要点总结相关推荐

  1. 手机端网页web开发要点

    头部必须要加的 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /& ...

  2. Web开发:HTML5、CSS、JavaScript必备教程

    2019独角兽企业重金招聘Python工程师标准>>> Web开发:HTML5.CSS.JavaScript必备教程 想开启Web开发的智慧之门吗?想DIY炫酷的网页特效设计吗?想通 ...

  3. java开发环境搭建 pdf_01搭建java web开发环境.pdf

    01搭建java web开发环境.pdf 还剩 19页未读, 继续阅读 下载文档到电脑,马上远离加班熬夜! 亲,很抱歉,此页已超出免费预览范围啦! 如果喜欢就下载吧,价低环保! 内容要点: ( 7)在 ...

  4. java web 开发技术大全 代码_Java Web开发技术大全

    资深程序员全力打造,深入剖析SSH框架整合开发的精髓 全方位解读Java Web开发的基础知识.高级技术及应用案例 内容全面,讲解详细,全面覆盖JSP.Se rvlet.AJAX及SSH框架整合开发 ...

  5. [转载] Python Web开发—进阶提升 490集超强Python视频教程 真正零基础学习Python视频教程

    参考链接: 在Python中创建代理Web服务器 2 Python Web开发-进阶提升 490集超强Python视频教程 真正零基础学习Python视频教程 [课程简介] 这是一门Python We ...

  6. .net web开发经典图书总结

    这些年读.net关于web开发的方方面面的书很多,如下从历史的书单中选取一些比较经典的图书供参考. C#基础 语言基础和工具使用非常重要,如下是基本比较经典的图书 书名 概要 CLR via C#(第 ...

  7. 专家访谈:Flex技术对web开发的影响

         专家访谈:Flex技术对Web开发的影响 专家简介:姜天格,时任NTTDATA数据系统集成(北京)上海公司项目经理.有多年项目管理经验,在软件项目管理.软件过程改进等方面有深入的研究. 1. ...

  8. 观光公交削弱_削弱Web开发人员和Internet的7大障碍

    观光公交削弱 As a web developer I periodically take a step back from the text editor and look at the lands ...

  9. Web开发 ------ 基于Flask的 任务清单管理系统(二):用户认证

    文章目录 任务清单管理系统(二) 一.用户认证 1.数据库模型 (1)技术要点 (2)核心代码 提交数据库 提交github: (3)测试代码 2.Flask-Login优化数据库模型 (1)技术要点 ...

最新文章

  1. Python ssh连接Linux服务器报Incompatible ssh peer (no acceptable kex algorithm) 解决方法
  2. 二叉排序树(c/c++)
  3. Boost:逐步定义的测试程序
  4. 「Apollo」protobuf报错No module named ‘google‘
  5. Android 查看设备文件
  6. TCP对应的应用层协议之FTP /SMTP / HTTP
  7. Java static 静态代码块、代码块
  8. AcWing基础算法课Level-2 第六讲 贪心
  9. 遗留非springboot传统项目接入eureka注册与服务发现
  10. 面向对象三大特征之多态——Java笔记(七)
  11. 判断变量是空_python基础(二):变量的数据类型、常量、操作符、分支、循环、条件判断...
  12. USB无线网卡的Linux驱动移植
  13. 实现网站二维码扫描登录
  14. 软件测试的环境部署怎么做?
  15. Banner大小之国际标准
  16. void main java_详细讲解Java中的main()方法
  17. java学习(类和对象)
  18. 云速美建站手机端使用百度app打开手机端网站闪退的问题
  19. swing重写右上角叉号
  20. UI设计好学吗?UI设计的流程是什么

热门文章

  1. C++信号量实现线程间同步,windows使用SetEvent,linux使用sem_t,QT测试
  2. java jdbc 是什么意思_java中的jdbc是什么,
  3. IEC标准中type1 type2 type3输入
  4. 可靠性试验类毕业论文文献都有哪些?
  5. 100个相见恨晚的Python库
  6. 什么是ChainLink (LINK)
  7. SQL查询语句分步详解——多字段分组查询
  8. 5G的前世今生---简述移动通信的发展
  9. Java课堂笔记第九次428
  10. 真实版“删库跑路”?程序员蓄意破坏线上生产环境