Resolution(分辨率)
分辨率分很多种,这里主要涉及显示分辨率中的概念,图片分辨率等其他不过多展开,所以理解过程中不要将图片等涉及进来,这部分是为了后面视图和转换等概念提供基础。
Dots Per Inch (dpi)
每英寸像素点数,每英寸(2.54cm)长度内的像素点数,是打印机、鼠标等设备分辨率的度量单位。现在一些Android等显示器设备也使用dpi单位。
- 最早电脑显示器ppi(非系统)和打印设备dpi是相等的(72 ppi)
- 从技术角度说,“像素”只存在于计算机显示领域,而“点”只出现于打印或印刷领域
- Android也使用dpi单位,和ppi等价的
Pixel Density (ppi)
每英寸像素,又称像素密度,和dpi等价,表示打印图像或显示器单位面积上的度量单位, 相当于间接知道1像素的物理大小。 ppi受到 物理像素 和 屏幕尺寸 影响。
例如iphone4 326ppi
表示每英寸(2.54cm)有326像素
Pixel (px)
像素,影像显示的基本单位,不是一个物理单位,1像素不一定等于1物理像素,可以通过 ppi/dpi
计算, 所以1像素在不同型号设备上物理大小是不一样的。
Retina Display
视网膜显示屏,正常观看距离下足以使人肉眼无法分辨其中的单独像素,在屏幕大小不变分辨率变大,像素密度提升,显示更加细腻,但是这会导致文字图片变小,所以 drp 2.0 时是使用4个像素替换原来1个像素
Physical Pixel
物理像素,也可以理解称原始像素,pc或moblie切换分辨率, 一般可以切换的最大逻辑分辨率是最适配的,也就是1:1适配物理像素, 其他分辨率 1逻辑像素 != 1物理像素
Device-independent Pixels (dip or dp)
密度独立像素,也称逻辑像素(Logical Pixel)、渲染像素(Rendered Pixels),不要和 px
概念混淆,android使用 pd
单位,ios上称 pt(point)
单位,pd和pt是等价的,是渲染出来的虚拟像素。
px = dp * (dpi / 160)
Point (pt)
点,这里 **与印刷和CSS中不是同一概念 (可能会有渊源),**该单位在IOS中指 逻辑像素
单位,CSS pt单位后面会单独展开。
px = pt * dpr
Device Pixel Ratio (dpr)
物理像素和设备独立像素(逻辑像素)的比值, 物理像素/逻辑像素
宽高比
dpr = 物理像素 / 逻辑像素
Screen Resolution
屏幕分辨率,最大的分辨率就是物理分辨率, 超出物理像素就会显示不下或者出现滚动条。
Graphics Resolution
显卡分辨率, 显卡分辨率和屏幕分辨率的交集 决定实际可以的分辨率。
Display Size
显示屏尺寸,显示屏尺寸会影响PPI
Viewport(视口)
可视区域窗口,如显示器、浏览器、webview等,其中将引用PPK提出的3个概念来理解viewport,这里不仅指显示器分辨率,还涉及web视口概念,讲解PC和Moblie(移动端)的区别。
下面讲到的属性将按照W3C标准,兼容性请到caniuse查询。
Web Viewport
深度好文
Window
window 是一个包含DOM文档的窗口,并暴露给JavaScript,这里主要讲解 cssom-view 相关的。
列举一些属性:
窗口:
screen
与当前窗口相关的屏幕信息outerWidth
当前窗口的宽度screenTop/screenY
屏幕顶端到窗口的垂直距离devicePixelRatio
当前显示器的物理像素和设备独立像素的比例
视口:
document
当前窗口所包含文档的引用innerHeight
当前窗口文档可视口的高度innerWidth
当前窗口文档可视口的宽度pageYOffset/scrollY
当前文档在垂直方向已滚动的像素值
从上面可以看出window上的view主要是屏幕、窗口、文档相关的信息。
Document
document是表示载入页面的 DOM Trees。 document
接口描述了任何类型的文档的通用属性与方法,根据不同的文档类型(例如HTML、XML、SVG,...),还能使用更多 API,下面只涉及HTML DOM。
先来了解一下DOM,下面看一个HTML DIV继承图:
这个图表示继承关系 HTMLDivElement
-> HTMLElement
-> Element
-> Node
-> EventTarget
其中event、node、element都属于DOM基类实现,HTMLDivElement、HTMLElement(html接口,非指html元素,html是HTMLHtmlElement)是属于HTML DOM的实现。
[document.documentElement](https://developer.mozilla.org/zh-CN/docs/Web/API/HTMLHtmlElement)
指根元素,html中指html元素,html dom实现[document.head](https://developer.mozilla.org/zh-CN/docs/Web/API/HTMLHeadElement)
指header元素,html dom实现[document.body](https://developer.mozilla.org/zh-CN/docs/Web/HTML/Element/body)
指body元素,html dom实现
了解document后更加易于理解document下面的dom。
DocumentElement
dom 根元素 html
,开始讲 documentElement 的 cssom-view
documentElement
继承于 HTMLElement,属性列表:
offsetTop
距离父节点顶部距离offsetLeft
距离父节点左边距离offsetWidth
元素border+padding+scrollbar+width
offsetHeight
元素border+padding+scrollbar+height
documentElement
继承于 Element,属性列表:
- scrollTop
- scrollLeft
- ...
Body
继承于 Element
Note:排版模式不一样获取属性值会不一样,Quirks Mode模式是为了兼容ie6之前的非标准行为,例如: document.documentElement
在Quirks mode里面没有定义
Element
继承于 Element
Retina Display
在讲移动端 viewport
前,我必须再讲一下 Retina Display
,而这又涉及到 物理像素
和 逻辑像素
,因为这将会影响 viewport
。
用iphone来举例,iphone 6 逻辑像素 375*667
,物理像素 750*1334
,因此 dpr 是 2
, 1逻辑像素
会渲染成 4物理像素
,视觉上看起来就会更宽更高。
Layout Viewport
布局视口,为了phone screen上能像pc上一样展示,所以移动端浏览器设置默认宽度,因此有了 layout viewport
,而且不同浏览器 layout viewport
不一样。
How wide is the layout viewport? That differs per browser. Safari iPhone uses 980px, Opera 850px, Android WebKit 800px, and IE 974px.
如果页面 layout
宽度超过 layout viewport
宽度页面就会出现滚动条。
Visual Viewport
可视视口,用户可视的页面区域,用户可以放大缩小 visual viewport
,而且不影响 layout viewport
,不同设备分辨率也不一样。
当前缩放值 = 理想视口宽度 / 视觉视口宽度
Ideal Viewport
理想视口,使用 layout viewport
一般会感觉文字等太小,不是理想视口,因此浏览器厂家提出 ideal viewport
概念,理想视口就等于屏幕逻辑像素(dip),用户无需放大或缩放。
布局视口与理想适口保持一致:
<meta name="viewport" content="width=device-width,initial-scale=1.0,maximum-scale=1">
CSS (单位)
可以参考w3c
Relative Length Units
相对长度单位
Absolute Length Units
绝对长度单位
Adaptation(适配)
为什么要适配?
- 不同机型
逻辑分辨率
不一样 - 不同机型
dpr = 物理分辨率/逻辑分辨率
不一样
要怎么做?
- 减少分辨率种类,同一手机厂商物理分辨率会五花八门,但是逻辑分辨率很多机型却相同
<meta name="viewport" content="width=device-width,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no">
将layout viewport
和ideal viewport
宽度保持一致,也就是逻辑分辨率宽度
- 适配
逻辑分辨率
和dpr
如何适配?
rem
我们看下 手淘方案 lib-flexible,已经不推荐
- 设计稿是
750px
, css像素是750px
,dpr=2
基本按750布局即可 - 动态生成
meta
标签及属性,devicePixelRatio=2
的时候scale=0.5
- 计算出html的
font-size = deviceWidth / 10
,页面分成10份 css尺寸 = 设计稿标注尺寸 / (750 / 10)
,可以用less、sass等转换
vh、vw
随着浏览器兼容 viewport 长度单位,viewport
方案逐渐流行,但是此方案也不是完美的。1vw
表示可视视口的1%
,即将可视视口分成100份。
- px单位转换公式
($px / 375) * 100vw
更多 viewport
参考:如何在Vue项目中使用vw实现移动端适配