移动适配
移动端的适配
一.适配的原因
屏幕分辨率引起的1px的border和图片模糊问题;如何去自适应不同宽度屏幕的手机等
二.手机参数
通过常见手机设备的参数了解常见的概念 :
Device | OPERATING SYSTEM | PHYS SIZE(英尺) | PHYSICAL SIZE(cm) | WIDTH(px) | H(px) | DEVICE WIDTH(px) | PX PER INCH | POPULARITY |
---|---|---|---|---|---|---|---|---|
Apple iPhone 5 | iOS | 4.0 | 10.0 | 640 | 1136 | 320 | 326 | 16 |
上面的意思:手机iphone 5--ios系统--4英寸--10cm--分辨率(物理像素)640ox*1136px--设备宽度(css像素)320px--像素密度PPI为320--流行程度16
2.1PHYS SIZE(英尺)和PHYSICAL SIZE(cm)
? 屏幕的尺寸对应屏幕对角线的长度
1in = 2.54cm,4in=4*2.54cm=10.16cm~10cm
2.2WIDTH和H
? 物理像素(physical pixel)是显示器的最小单位,也称设备像素(device pixel),可以看成是屏幕上的小发光点,它们可以呈现出我们看到的画面。
? 手机显示分辨率640*1136px表示手机的横向(WIDTH)有640个像素,纵向(H)1136个像素。
2.3DEVICE WIDTH(px)
设备宽度320像素,这里的像素是设备独立像素,即CSS像素;
设备独立像素(DIP,device-independent pixel,density-independent pixel),简单地来说设备独立像素就是:独立于设备的用于逻辑上衡量像素的单位。Web开发中就是指的CSS的逻辑像素。
2.4PX PER INCH
PX PER INCH(PPI),或者DPI(Dots Per Inch),都表示屏幕每英寸的像素数量,即像素的密度
一般的计算方法或者公式: DPI= 对角线分辨率 / 屏幕尺寸(PHYS SIZE)
对角线分辨率=
(iphone5的上,x表示横向的物理像素,y表示纵向的物理像素,Z就是2.1标题说的屏幕尺寸)
2.5设备像素比(devicePixelRatio)
DPR
设备像素比DPR(devicePixelRatio)是默认缩放为100%的情况下,设备像素(也称物理像素)和CSS像素的比值(设备独立像素)。
设备像素比=设备像素(物理像素)/设备独立像素(CSS像素)
iphone5 的DPR=640px/320px=2
表示水平上css的1px为2个物理像素(多少DPR代表水平css的1px等于多少个物理像素)
所以css的1px等于4个物理像素(水平+垂直)
正常屏幕上css的1px对应屏幕一个红色小方块(1px物理像素),在iphone5的手机上css的1px对应4个红色小方块
Retina视网膜屏幕
通过DPR为2可以了解到Phone5 使用的是Retina视网膜屏幕,在iphone5的手机上css的1px对应4个红色小方块(4个物理像素)
css的1px等于多少个物理像素
css的1px等于多少个物理像素受两个因素影响:
1.默认缩放为100%情况下,可以通过DPR确定css的1px为多少个物理像素
2.用户的缩放也会影响。当用户把页面放大一倍,那么CSS中1px所代表的物理像素也会增加一倍;反之把页面缩小一倍,CSS中1px所代表的物理像素也会减少一倍。
https://www.zhihu.com/question/21149600(像素与分辨率)
http://www.360doc.com/content/19/0817/14/65829145_855475279.shtml(关于设置显示器的分辨率,可以设置,就不是物理分辨率了,物理分辨率是固有的)
2.6 1px的问题和图片的模糊
2.6.11px的border问题
由于Retina视网膜屏幕的原因,所以css的1px宽的border可能等于2px/3px物理像素,而设计师想要的是1个物理像素宽的大小。所以css设置0.5px,就可以解决,但不是手机都支持0.5px,所以需要另外的解决,比如transform缩放,或者flexible方案(该方案正被淘汰)等
2.6.2图片的模糊
一个位图像素对应1个物理像素,可以使得图片得到清晰呈现,但在dpr为2(比如iphone5),1个位图像素对应了四个物理像素,由于单个位图像素不可以再进一步分割,所以只能就近取色,导致图片看起来比较模糊.
(w:宽;h:高)如果640px的设计稿上有一个图标是60w,60h,表示它的图像分辨率是60*60=360px;那么就要用30w,30h的img表示。因为一个css像素等于4个物理像素,30w,30h的img里面就有30乘30乘4=360个物理像素,所以能够达到1个位图像素:1个物理像素
? 所以在dpr为2的屏幕下用2倍图就是这个原因
? 最好的解决方法:不同的dpr下,加载不同的尺寸的图片。不管是通过CSS媒体查询,还是通过JS条件判断都是可以的。
三.视口
默认情况下,手机浏览器会将网页渲染在比手机屏幕宽的虚拟窗口上”viewport“上,所以用户需要平移和缩放网页来看网页,这样对于用户体验极差。
移动设备上的浏览器都会把自己默认的viewport设为980px或1024px(也可能是其它值,这个是由设备自己决定的),这里viewport是layout viewport布局视口,视口分三种
3.1visual viewport
顾名思义,视觉上的视口,就是手持设备物理屏幕的可视区域,等于屏幕宽度
window.innerWidth/Height
3.2layout viewport
手机上为了容纳为桌面浏览器设计的网站,默认布局视口宽度远大于屏幕宽度,为了让用户看到网站全貌,它会缩小网站。这个视口就是HTML页面布局的区域,并且可以通过viewport meta标签控制;
document.documentElement.clientWidth获取layout viewport的宽度
meta 标签控制layout viewport的语法
width:控制 viewport 的大小,可以指定的一个值,如果 600,或者特殊的值,如 device-width 为设备的宽度(单位为缩放为 100% 时的 CSS 的像素)。
height:和 width 相对应,指定高度。
initial-scale:初始缩放比例,也即是当页面第一次 load 的时候缩放比例。0-1
maximum-scale:允许用户缩放到的最大比例。0-1
minimum-scale:允许用户缩放到的最小比例。0-1
user-scalable:用户是否可以手动缩放。yes/no
3.3idea viewport
页面布局的宽度能够等于视口的宽度时,就是idea viewport,在此情况下,用户不用进行平移和缩放来查看页面,因为页面是100%呈现在手机屏幕的区域内,在不同尺寸下都能基本表现一致。有什么办法实现layout=visual呢,使用
四.适配方案
为了解决手机不同尺寸的问题,需要有一些适配方案,比如一个按钮在不同尺寸的手机下能够完整呈现,随着大尺寸手机放大,小尺寸手机缩小。rem方案就可以解决
4.1百分比布局
- 设置固定屏幕为理想视口宽度
- 少许的媒体查询设置字体,或者配合rem(如果需要,这样字体可以有所变化,或者font-size:16rem)
- 水平百分比布局(如60%)
- 水平方向部分也可以使用弹性布局(flex)
- 高度是固定(也就是height="50px",使用px单位)
例子:实现一个手机屏幕的顶部
header:
body:
标题