流式布局
- 流式布局就是百分比布局,让元素的宽高自适应伸缩。这样可以有效的避免元素过宽,导致移动端设备不能显示完全的问题
- 目前来说,流式布局配合h5和c3是移动web开发最常用的处理方案
viewport
- 概念: PC浏览器在渲染html页面时,直接就在浏览器的窗口中显示。而移动端浏览器因为设备屏幕差异大的原因,就引入了viewport这一功能。它是一层虚拟的区域(我们是看不到的),处于浏览器窗口和html页面中间。html页面渲染显示在viewport的区域中,不是直接显示到浏览器窗口
- 声明:viewport(窗口视图)实际上是通过meta标签来声明的
<meta name="viewport">
,它只应用于移动端的浏览器,也只有移动端浏览器才能识别它 - 作用:通过设置viewport的content属性,我们可以控制html显示区域的宽度,缩放比,是否允许用户自行缩放等功能
- 原理:首先给html设置元素大小为100%,大小就能跟viewport一致。然后再让viewport与设备屏幕大小一致,这样通过一个中间层,就实现了html页面大小与设备屏幕大小一致,从而解决不同移动设备屏幕尺寸不一样的适配问题
- content几个常用的属性介绍:
-
width=device-width
设置viewport的显示宽度,也就是html页面的显示宽度,device-width
是获取当前设备屏幕的宽度,这样就能自动适配显示区域大小。也可以设置成固定数值,不推荐 -
initial-scale=xx
设置html页面在移动端显示的默认缩放比,一般默认设置1.0就是不做缩放 -
user-scalable=1||0
设置是否允许用户自由缩放页面,1是允许,0是不允许 -
maximum-scale=xx
设置最大缩放比 -
minimum-scale=xx
设置最小缩放比 - 前三个值是做常用的属性
-
- 目前较通用的viewport设置写法:
<meta name="viewport" content="width=device-width,initial-scale=1.0,user-scalable=0">
- 一些非通用的viewport设置方法
- 淘宝网手机网页就没有设置宽度值,页面大小是正常pc端大小。他们的解决方案是通过js来判断当前设备的屏幕大小,再动态的设置viewport的缩放比,以达到自适应屏幕的效果
- content几个常用的属性介绍:
- 另外,viewport如果不设置,在手机端也会默认有,默认宽度是980px。这也是为什么一些pc页面直接在手机显示会缩放,因为设备宽度小于980
移动端布局常见问题
- 罗列一些常见可能会遇到的css布局问题
移动端设置点击高亮效果
- 网页在移动端展示时,会默认自带触碰时该元素区域高亮一下的效果,颜色为浅灰色
- 通过
-webkit-tap-highlight-color:颜色||transparent
,可以设置改样式的颜色,如果设置为透明就是不显示
所有盒子以边框开始计算宽度
- 就是之前c3中学到的box-sizing属性,因为移动端中设计到大量的百分比布局,如果不把边框和内边距计算在内,那么添加它们就会超出屏幕范围产生滚动条,这是不合理的。通过这个属性就能解决问题
-
-webkit-box-sizing:border-box(兼容老浏览器)
,box-sizing:border-box
清除默认表单控件样式
- 移动端不同浏览器的表单控件会自动加上一些样式,比如内阴影等。为了表现的效果统一,经常会清空默认加上的样式,再由我们自己来添加样式
-
-webkit-appearance:none
可以清除
最大宽度和最小宽度
- 虽然大部分情况下是百分比来设置,但是为保证设计图的清晰度,一般会限制最大宽度
max-width
和最小宽度min-width
,目前行业通用设计稿最大是640px,最小是300px
搜索按钮调用
- 在移动端点击表单控件会自动弹出输入法,如果想要输入法中的enter(确认)键变成搜索按钮,需要用form标签把表单控件包裹起来,注意form标签不用写属性,传输地址#号或者其他无效地址代替就可
全屏页面设置
- 因为页面最顶级的元素是
html
,body
次之。所以给它们两个设置宽高为100%,再让内部的元素参照它们就实现了全屏页面
定位参照伸缩盒子问题
- 正常情况下,子元素设置宽高100%是参照的父元素内容区域的宽高值。但是如果子元素设置了定位或者浮动,那么再设置宽高100%,它参照的就是父元素的实际宽高值
拓展知识-逻辑像素和物理像素
- 概念:现在的移动设备都使用高清屏(Retina技术),大致原理就是让一逻辑像素尺寸由两个或者更多个物理像素来组成,大幅度提高了显示的精度
- 举个例子:iphone4的屏幕尺寸是320x480,但是它的实际分辨率是640x960,就是2倍率。所以如果针对iphone4设备做图片,就要做640宽度的图片,然后放到320宽度的屏幕中显示,压缩了图片大小,精度也可以说清晰度就变高了
- 现在手机屏幕越来越清晰,倍率也越来越高,具体倍率计算原理暂时还没弄清楚,但是至少在做移动web开发时要有这个概念,不要直接1:1显示图片,会造成失真
- 目前主流解决方案:
img
引入的图片就用宽高来压缩,背景图片就用background-size
来压缩 - 这个东西很重要,以后多研究研究,另外像素不是固定单位,很复杂
移动端事件
touch事件
- touch事件只会移动端浏览器上触发,总共有三个:
-
touchstart
当手指开始触摸时触发 -
touchmove
当手指触摸并开始移动时触发 -
touchend
当手指离开屏幕结束触摸时触发 - 注意,在原生js中只能用
addEventListener()
方法来监听
-
- 在移动端touch事件的事件对象中增加了几个属性,需要注意的几个如下:
-
changedTouches
记录最新的所有改变触摸点,可以理解每发生触摸并离开后,它会记录一次放进数组。当下次再次触摸并离开,他会再次记录。在touchend
事件的事件对象中,只有该属性 -
targetTouches
记录当前触摸元素内的所有触摸点,可以理解当次触摸可能不止一个手指,那么只要在目标元素内所有手指的触摸点都会被记录,放入数组 -
touches
记录当前触摸的所有触摸点,和上一个不同的是该属性不会区分是否在目标元素内,只要是在页面上触摸的所有点都会记录进数组
-
- 通过移动端touch事件的事件对象新增属性记录的触摸点,就可以获取到触摸点所在的坐标:
-
clientX||clientY
触摸点在视口的横纵坐标 -
pageX||pageY
触摸点在页面的横纵坐标 -
screenX||screenY
触摸点在屏幕的横纵坐标 - 通过这些坐标可以进行很多操作,比如判断用户滑动方向,滑动距离等
-
- 过渡效果结束事件
-
transitionEnd
过渡效果结束后会触发(如果需要满足兼容问题,还要同时绑定webkitTransitionEnd
)
-
- 动画效果结束事件
-
animationEnd
动画效果结束后会触发(如果需要满足兼容问题,还要同时绑定webkitAnimationEnd
)
-
zepto.js
介绍
- 移动端浏览器和pc端浏览器有一个本质的区别,那就是兼容性。移动端浏览器几乎都支持最新的
h5
和c3
功能,所以如果移动端使用jquery
框架来开发,一是体积太大,二是很多功能都没有意义(比如jquery
的兼容处理以及一些动画API
) -
zepto
就是一个专门为移动端定制的框架,它有着与jquery
类似的api,基本上会用jq就会用zepto
。要注意的是zepto
并不是100%覆盖了jq的功能 -
zepto
还有一点与jq不同,jq
的引入文件是一个文件包含了所以的库代码,但是zepto
将库代码以模块化来划分。默认引入文件只集成了几个基础的功能,其他功能需要引入对应的模块
定制zepto
- 一般来说开发都会用到多个功能模块,如果每个模块都引入,那么请求次数就太多了。所以
zepto
也支持你将多个模块功能整合到一个文件中 - 1.安装
node
- 2.使用
node
命令行工具进入zepto
主文件 - 3.运行
npm install
- 4.修改
make
文件的target.build
项,加入你想增加的模块功能 - 5.运行
npm run-script dist
- 然后会生产一个
dist
文件,定制版的库文件就在dist文件中
移动端的点击事件
- 在pc的点击事件是
click
,但是在移动端click
点击事件会有300ms左右的延迟(因手机性能差异以及点击快慢会有波动),所以一般不建议在移动端使用click
作为点击事件- 造成的原因是:早期手机网页不能很好的自适应显示的内容都很小,所以苹果公司为了解决这个问题,增加了双击放大的技术。正因为这个技术,手机浏览器会给
click
事件一定的延迟等待,来判断用户是单击还是双击,后来很多浏览器厂商在移动端都效仿了这个功能
- 造成的原因是:早期手机网页不能很好的自适应显示的内容都很小,所以苹果公司为了解决这个问题,增加了双击放大的技术。正因为这个技术,手机浏览器会给
tap事件
- 移动端会优先响应
touch
事件(几乎没有延迟),所以现在常用的是用touch
事件来模拟点击功能,代替click
事件,大多数框架中都会封装tap
事件(jq、zepto
等),直接绑定事件就可以使用。但是要注意:tap
事件也有一个副作用,那就是点透 - 简单说明下点透:如果两个元素重叠在了一起,如果下面的元素绑定了其他点击类事件,那么你给上面的元素绑定了
tap
事件。当用户操作时,上面的元素执行完tap
事件后,下面的元素也会触发它绑定的事件。相当于就是点击指令透到下面的元素了,这是个很严重的问题,而且经常会遇到 - 正常情况下,移动端开发单击就使用
tap
事件。如果因为设计或者需求原因,而导致出现点透的情况,那么解决方案可以使用fastclick
插件
移动端较常用的插件介绍
fastclick插件
- 关于
fastclick
插件:这个插件的作用是解决移动端click
事件有300ms左右延迟的问题。因为touch
事件是优先触发的,所以才会有点透的问题。而click
事件不是,就不会有出现点透。并且touch
事件只有移动端才会触发,而click
在pc端和移动端都能触发 - 所以实际上
fastclick
解决了两个问题:一、点透;二、同一页面pc端移动端都能点击 - 这个插件在开发中比较常用。使用方法和具体原理查看说明文档
- github下载地址:https://github.com/ftlabs/fastclick
iscroll插件
- 关于
iscroll
插件:这个插件是一个功能类库,它提供了大部分常用的页面元素滚动滑动功能。比如:页面拖动、缩略放大图、元素拖拽、页面滚动等等,非常强大。并且它同时兼容pc端和移动端 - github下载地址:https://github.com/cubiq/iscroll
- 使用方法和具体原理查看说明文档
swipe插件
- 关于
swipe
插件:实现轮播图功能的插件,同时兼容pc端和移动端 - 使用方法和具体原理查看说明文档
- github下载地址:https://github.com/thebird/Swipe
swiper插件
- 关于
swiper
插件:专注于提供移动端触摸滑动的效果的插件,其实也是同时兼容pc端和移动端的,相对于swipe
插件,不仅覆盖了全部功能而且更加强大多样,但是体量也更大。可根据实际情况来选择使用 - 使用方法和具体原理查看官方中文网:http://www.swiper.com.cn
- github下载地址:https://github.com/nolimits4web/swiper