最近在研究 Retina 屏的适配问题,在具体方案讨论以前,陆续作了一些理解笔记,现概括以下。具体方案的讨论将另做文章。布局
<meta name="viewport">
中的 viewport
是布局视口字体
initial-scale
等的缩放是基于理想视口的code
理想视口由设备各自提供,理想视口的宽度也是设备的独立像素中间件
所谓“独立”是说这个设备独立像素和像素密度无关图片
Retina屏增长了设备像素(物理像素),因此物理像素是有密度变化的ip
dpr = 物理像素/设备独立像素 = 设备像素个数/设备理想视口宽度开发
dpr 在 JavaScript 中能够经过 window.devicePixelRatio
获取,在 CSS Media Query 中的名称是 device-pixel-ratio
rem
CSS像素和物理像素有区别,当1个CSS像素跨越更多物理像素时,就模糊了,反之则清晰,CSS像素被用在布局视口上it
缩放能够调整CSS像素和物理像素之间的比例关系。高清屏的缩放方案就是:如将布局视口扩大为理想视口的2倍,即理想视口缩放比例为1/2,那么CSS像素将比之前跨越更少的物理像素,从而保证清晰度io
布局视口/理想视口 = CSS像素/设备独立像素 = 1/缩放比例
物理像素/设备独立像素 = dpr
页面清晰要求 —— CSS像素/物理像素 = 1
故 —— 缩放比例 = 1/dpr
从如下的关系比中来认知:
布局视口(CSS像素) : 设备独立像素(理想视口) : 物理像素
设备独立像素能够被看作一个中间件:
当 dpr=1 时,设 initial-scale=1.0,布局视口等于设备独立像素,设备独立像素等于物理像素,故布局视口等于物理像素,1CSS像素跨1物理像素
当 dpr=2 时,设 initial-scale=1.0,布局视口等于设备独立像素,设备独立像素是物理像素的一半,故布局视口是物理像素的一半,1CSS像素跨4物理像素
当 dpr=2 时,设 initial-scale=0.5,布局视口是设备独立像素的两倍,设备独立像素是物理像素的一半,故布局视口等于设备像素,1CSS像素跨1物理像素
再来研究高清屏,如下均设:设备独立像素是 375px,dpr=2,物理像素则是 750px,元素DIV div{width: 375px}
:
initial-scale=1.0 时,1CSS像素跨越4物理像素,故 DIV 是满屏的
initial-scale=0.5 时,1CSS像素跨越1物理像素,故 DIV 只占屏幕的一半,要想一样保持全屏,就须要把 DIV 改成 div{width: 750px}
因此,对于图来讲,第一种状况下普通图片就会拉伸,从而模糊;第二种状况,就是使用高清图
为不一样屏幕的元素设置不一样的像素单位过于麻烦,开发者就须要考虑是否有跨屏幕的尺寸单位解决方案
rem:当普通屏时,设 :root{font-size: 10px}
,则 37.5rem 是 375px;高清屏时,设 :root{font-size: 20px}
,则 37.5rem 是 750px,所以,咱们在 DIV 元素上只须要设置一个 37.5rem,在不一样屏幕下更改根元素的字体大小,就能够兼容全部屏幕了
vw 和 wh:相对于布局视口大小计算尺寸,普通屏布局视口是 375px,高清屏是 750px,不管怎么变,vw/vh 单位的最后结果都会相应变化