掌握移动端常见适配方案
能够理解移动端常见效果
能够独立完成响应式开发
掌握CSS预编译脚本语言
《京东项目》
移动web开发现状
- 移动web开发指的是需要适配移动设备的页面开发
- 移动web和桌面web没有本质的区别都使用css、html与js
那么在移动端开发页面需要注意什么:
移动端浏览器
12UC浏览器,QQ浏览器,欧朋浏览器,百度手机浏览器,360安全浏览器,谷歌浏览器,搜狗手机浏览器,猎豹浏览器,其他杂牌浏览器国内的UC和QQ,百度等手机浏览器都是根据Webkit修改过来的内核,国内尚无自助研发的内核,就像国内的手机操作系统都是基于Android修改的移动设备尺寸
123大家都知道移动端设备屏幕尺寸非常多,碎片化严重。尤其是Android,你会听到很多种分辨率:480x800, 480x854, 540x960, 720x1280, 1080x1920,而且还有传说中的2K,4k屏。近年来iPhone的碎片化也加剧了:640x960, 640x1136, 750x1334, 1242x2208。
移动端适配问题
设备 | 尺寸(英寸) | 开发尺寸(px) | 物理像素比(dpr) |
---|---|---|---|
iphone3G | 3.5 | 320*480 | 1.0 |
iphone4/4s | 3.5 | 320*480 | 2.0 |
iphone5/5s/5c | 4.0 | 320*568 | 2.0 |
HTC One M8 | 4.5 | 360*640 | 3.0 |
iphone6 | 4.7 | 375*667 | 2.0 |
Nexus 4 | 4.7 | 384*640 | 2.0 |
Nexus 5x | 5.2 | 411*731 | 2.6 |
iphone6 Plus | 5.5 | 414*736 | 3.0 |
Samsung Galaxy Note 4 | 5.7 | 480*853 | 3.0 |
Sony Xperia Z Ultra | 6.4 | 540*960 | 2.0 |
Nexus 7 (‘12) | 7.0 | 600*960 | 1.3 |
iPad Mini | 7.9 | 768*1024 | 1.0 |
注:以上数据均参考 https://material.io/devices/ ,一个设备尺寸统计网站。
注:作为前端开发不建议大家去纠结dp,dpi,pt,ppi等单位,因为它们有复杂的转换关系。
流式布局
- 流式布局,就是百分比布局,也称非固定像素布局。
- 通过盒子的宽度设置成百分比来根据屏幕的宽度来进行伸缩,不受固定像素的限制,内容向两侧填充。
- 这样的布局方式,是移动web开发使用的最常用布局方式。
viewport
解释:视觉窗口
作用:这是一个虚拟的区域,用来承载网页的区域,在浏览器可视窗口和网页之间。
现象:有一些设备viewport的默认宽度是980px,网页内容显示在里面,为了能在320px屏幕内显示,会自动缩放。
在移动端有特殊的功能:可以设置宽度和高度,可以设置缩放比例,控制缩放的比例,控制用户是否可以自行缩放。
适配有三点事情需要去做:
- 页面的宽度和设备样宽
- 默认的缩放比例是1.0
- 不允许用户去缩放页面
属性 | 解释 |
---|---|
width | 宽度设置的是viewport宽度,可以设置device-width特殊值 |
initial-scale | 初始缩放比,大于0的数字 |
maximum-scale | 最大缩放比,大于0的数字 |
minimum-scale | 最小缩放比,大于0的数字 |
user-scalable | 用户是否可以缩放,yes或no(1或0) |
标准的viewport设置:
- 视口宽度和设备保持一致
- 视口的默认缩放比例1.0
- 不允许用户自行缩放
- 最大允许的缩放比例1.0
- 最小允许的缩放比例1.01<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
物理像素比
- 物理像素点指的是屏幕显示的最小颗,是物理真实存在的。
- 所谓Retina是一种显示技术,可以将把更多的物理像素点压缩至一块屏幕里,从而达到更高的分辨率并提高屏幕显示的细腻程度。
- 而一个px的绝对(在开发中认为是绝对)长度能显示的物理像素点的个数,称为物理像素比,屏幕像素比。
图片失真问题
在标准的viewport设置中,使用二倍图来提高图片质量,解决在高清设备模糊问题。
首页布局
代码见案例《jdM》
移动端touch事件
事件 | 说明 |
---|---|
touchstart | 当手指触碰屏幕时候触发该事件 |
touchmove | 当手指在屏幕上滑动时候触发该事件 |
touchend | 当手指离开屏幕时触发该事件 |
touchcancel | 当系统停止跟踪(被迫终止)触摸时候会触发。 |
触摸点集合 | 说明 |
---|---|
targetTouches | 目标元素的所有当前触摸点集合 |
changedTouches | 目标元素的最新更改的触摸点集合 |
touches | 页面上的所有触摸点集合 |
注意:在touchend事件的时候event只会记录changedtouches
点坐标 | 说明 |
---|---|
pageX/pageY | 基于页面大小的坐标 |
clientX/clientY | 基于视口大小的坐标 |
screenX/screenY | 基于屏幕大小的坐标 |
京东轮播图
代码见案例《jdM》
衍生的tap事件
出现的原因:由于早期移动端页面双击可以缩放,为了检测双击操作,延长了click的响应时间,200-300ms。
第一种解决方案:
第二种解决方案:
衍生的swipe事件
手势事件:滑动,左滑,右滑,上滑,下滑 (swipe在移动端库zepto.js有使)
分类页布局
代码见案例《jdM》
区域滚动插件
IScroll是一个类,每个需要使用滚动功能的区域均要进行初始化,参考文档 http://www.mamicode.com/info-detail-331827.html
《微金所项目》
什么是响应式布局
- 在移动互联日益成熟的时候,我们在桌面浏览器上开发的网页已经无法满足移动设备的阅读。
- 通常的做法是针对移动端单独做一套特定的版本。
- 但是如果终端越来越多那么你需要开发的版本就会越来越多(大屏移动设备普及)。
- 那么Ethan Marcotte在2010年5月份提出的一个概念,简而言之,就是一个网站能够兼容多个终端。
为什么要学响应式
- 现在的移动设备屏幕越来越大,种类越来越多。
- 越来越多的设计师也采用了这种设计。
- 在新建站的一些网站现在普遍采用的响应式开发。
响应式的原理
CSS3中的Media Query(媒体查询)
通过查询screen的宽度来指定某个宽度区间的网页布局。
划分设备 | 尺寸区间 |
---|---|
超小屏幕(手机) | 768px以下 |
小屏设备 | 768px-992px |
中等屏幕 | 992px-1200px |
宽屏设备 | 1200px以上 |
对比移动端开发
开发方式 | 移动web开发+PC开发 | 响应式开发 |
---|---|---|
应用场景 | 一般在已经有PC端的网站,开发移动站的时候,只需单独开发移动端 | 针对新建站的一些网站,现在要求适配移动端,所以就一套页面兼容各种终端,灵活 |
开发 | 针对性强,开发效率高 | 兼容各种终端,效率低 |
适配 | 只适配 移动设备,pad上体验相对较差 | 可以适配各种终端 |
效率 | 代码简洁,加载快 | 代码相对复杂,加载慢 |
总结:
移动web开发和响应式开发都是现在主流的开发模式。
使用的都是流式布局,来适配不同设备。
由于终端设备的多样化,新建站的站点会优先用响应式来开发。
响应式框架bootstrap
- 简介:
- 作者:Twitter 公司两位前端工程师(mark otto && jacob thornton)在2011发起开发完成的。
- 特点:组件简洁大方,代码规范精简,界面自定义性强。
- 目的:提高web开发效率。
- 文档:
- 优点:
- 有自己的生态圈,不断的更新迭代。
- 提供了一套简洁、直观、强悍的组件。
- 标准化的html+css编码规范。
- 让开发更简单,提高了开发的效率。
- 注意:虽然界面组件样式已经定义好了,但是扩展性相对较强,也就是说我们还可以自定义,修改默认样式。
- 版本:
- 2.x.x 停止维护,兼容性好,代码不够简洁,功能不够完善。
- 3.x.x 目前使用最多,稳定,但是放弃了IE6-IE7。对IE8支持但是界面效果不好,偏向用于开发响应式布局、移动设备优先的 WEB 项目。
- 4.x.x 测试阶段,更偏响应式,移动设备。
使用bootstrap
|
|
微金所首页开发
代码见案例《微金所项目》
less安装
- 安装nodejs https://nodejs.org/dist/ 可选择版本(6.0)。
- 检查是否安装成功,使用cmd命令 node -v 查看版本即可。
- 基于nodejs安装less:
- 在线安装:使用cmd命令 npm install -g less
- 离线安装:
a.找到C盘根目录下的用户或User文件夹打开
b.找到当前计算机使用的用户文件夹打开
c.找到隐藏文件夹AppData打开
d.找到Roaming文件夹打开
e.找到npm文件夹打开,该文件夹为基于nodejs程序目录
f.把npm.zip文件解压到该目录
less简介
作为一门标记性语言,CSS 的语法相对简单,对使用者的要求较低,但同时也带来一些问题:CSS需要书写大量看似没有逻辑的代码,不方便维护及扩展,不利于复用,尤其对于非前端开发工程师来讲,往往会因为缺少 CSS 编写经验而很难写出组织良好且易于维护的 CSS 代码,造成这些困难的很大原因源于 CSS 是一门非程序式语言,没有变量、函数、SCOPE(作用域)等概念。LESS 为 Web 开发者带来了福音,它在 CSS 的语法基础之上,引入了变量,Mixin(混入),运算以及函数等功能,大大简化了 CSS 的编写,并且降低了 CSS 的维护成本,就像它的名称所说的那样,LESS 可以让我们用更少的代码做更多的事情。
less编译
本质上,LESS 包含一套自定义的语法及一个解析器,用户根据这些语法定义自己的样式规则,这些规则最终会通过解析器,编译生成对应的 CSS 文件。LESS 并没有裁剪 CSS 原有的特性,更不是用来取代 CSS 的,而是在现有 CSS 语法的基础上,为 CSS 加入程序式语言的特性。
在开发过程当中如果要预览less,每次都要执行编译命令,为了方便可以使用部分编辑器中less自动编译功能。
- 点击文件打开菜单,选择设置选项
- 选择工具当中的文件监听选项
- 点击右上角加号按钮,选择less后弹出对话框,点击确定即可。
less基本语法
变量
12345678910111213@mainColor:#e92323;@className:box;div{background: @mainColor;}a:hover{color: @mainColor;}//变量用于字符拼接使用方法.@{className}{color: @mainColor;}混入(mixin)
1234567.borderRadius(@width:100px){border-radius: @width;-webkit-border-radius:@width;-moz-border-radius:@width;-o-border-radius:@width;-ms-border-radius:@width;}嵌套
12345678910111213141516171819202122.wjs_app{display: block;img{display: none;}/*需要连接的情况:&*/&:hover{img{display: block;position: absolute;left: 50%;margin-left:-60px;border: 1px solid #ccc;border-top: none;top:40px;z-index: 100000;}}> div{display: block;}}导入
1@import "variables";运算&内置函数
api地址:http://lesscss.cn/functions/#functions-overview
|
|
bootstrap定制
- 线下定制:更改源码,重新编译。
- 线上定制:官方网站,定制功能。
《苏宁项目》
rem适配原理
- rem 是相对于页面根源素html的字体大小的一个尺寸单位
- 页面内容可以使用rem为单位,那么html的字体大小就是一个控制尺寸的开关
- 当设备改变的时候可以根据设备的宽度和原本设计稿的尺寸比例关系设置html的字体大小
- 这样凡是以rem为单位的内容会根据设备做等比适配
|
|
flexible.js + rem适配方案
- flexible.js 是手机淘宝团队做移动端适配的库
- 我们使有它的目的只有一个根据设备设置rem基准值
|
|
media query + rem适配方案
|
|
基于less的rem可维护适配方案
|
|
在浏览器使用less开发
|
|
苏宁首页开发
参考代码《苏宁项目》
zeptojs的使用
- Zepto是一个轻量级的针对现代高级浏览器的JavaScript库, 它与jquery有着类似的api。 如果你会用jquery,那么你也会用zepto。
- Zepto模块
module | default | description |
---|---|---|
zepto | ✔ | 核心模块;包含许多方法 |
event | ✔ | 通过on()& off()处理事件 |
ajax | ✔ | XMLHttpRequest 和 JSONP 实用功能 |
form | ✔ | 序列化 & 提交web表单 |
ie | ✔ | 增加支持桌面的Internet Explorer 10+和Windows Phone 8。 |
detect | 提供 $.os和 $.browser消息 | |
fx | The animate()方法 | |
fx_methods | 以动画形式的 show, hide, toggle, 和 fade*()方法. | |
assets | 实验性支持从DOM中移除image元素后清理iOS的内存。 | |
data | 一个全面的 data()方法, 能够在内存中存储任意对象。 | |
deferred | 提供 $.Deferredpromises API. 依赖”callbacks” 模块. 当包含这个模块时候, $.ajax() 支持promise接口链式的回调。 | |
callbacks | 为”deferred”模块提供 $.Callbacks。 | |
selector | 实验性的支持 jQuery CSS 表达式 实用功能,比如 $(‘div:first’)和 el.is(‘:visible’)。 | |
touch | 在触摸设备上触发tap– 和 swipe– 相关事件。这适用于所有的touch (iOS, Android)和pointer 事件(Windows Phone)。 |
|
gesture | 在触摸设备上触发 pinch 手势事件。 | |
stack | 提供 andSelf& end()链式调用方法 | |
ios3 | String.prototype.trim 和 Array.prototype.reduce 方法 (如果他们不存在) ,以兼容 iOS 3.x. |
- 打包Zepto常用模块
|
|