在 css 中我们通常会使用 px
作为单位来表示尺寸的大小。一个非常简单的尺寸单位,但是我们要额外关注的是,px
是一个抽象逻辑单位,在不同设备、不同分辨率下,px
所代表的物理像素是不一样的。
要详细了解这个情况,我们需要额外对设备像素、设备独立像素、dpr
、ppi
等概念有一个精准的理解。
设备像素,又称为物理像素,是屏幕硬件层面的最小显示单元(pt),屏幕在生产时就已经确定了其设备像素的数量和排列方式。
例如我们通常说的
2K 显示器,其分辨率为 2560 x 1440
,即 2560 个水平物理像素和 1440 个垂直物理像素,总共有 3,686,400 个设备像素。
1080P 显示器,其分辨率为 1920 x 1080
,即 1920 个水平物理像素和 1080 个垂直物理像素,总共有 2,073,600 个设备像素。
4K 显示器,其分辨率为 3840 x 2160
,即 3840 个水平物理像素和 2160 个垂直物理像素,总共有 7,372,800 个设备像素。
这里提到的分辨率,是指物理分辨率。一个物理像素点 由 pt
来表示,pt
是物理绝对尺寸单位,大小始终固定,指的是 72分之一英寸(inch),由如下换算公式
11pt = 1/72 inch21 inch = 2.54 cm
设备独立像素(Device Independent Pixel):又称为逻辑像素,指的是可以通过程序控制的虚拟像素,css 中的像素单位 px
就是一个逻辑像素单位。
px
是一个相对单位,它的大小并不固定。
通常,我们可以在电脑上通过设置,改变屏幕的分辨率,这里可以被改变的分辨率,就是逻辑像素分辨率。注意它与物理像素分辨率的区别。
在浏览器的开发者调试工具中,我们可以通过 window.screen.width / window.screen.height
查看当前设备的逻辑分辨率
1window.screen.width2// 2560 px34window.screen.height5// 1440 px
当我在系统的屏幕设置中修改了分辨率之后,这个值会发生对应的变化。
设备分辨率缩放比(Device Pixel Ratio):又称为设备像素比,指的是物理像素和逻辑像素的比值。在浏览器的开发者工具中,我们可以通过如下的方式查看当前的缩放比值
1window.devicePixelRatio2// 2
例如,我的电脑显示器为物理分辨率为 5K,5120 x 2880
我的系统设置的标准逻辑分辨率为 2560 x 1440
那么,此时,我的设备分辨率缩放比可以通过如下方式获得
1// 宽度相比2window.devicePixelRatio = 5120 / 256034// 或者高度相比5window.devicePixelRatio = 2880 / 1440
因此,当前的设备分辨率缩放比为 2
。
此时,一个 px
在我的电脑上,就对应了 2 个物理像素。
1px = 2pt
需要注意的是,如果我在系统修改了逻辑分辨率,那么最终的设备分辨率缩放比也会对应的发生变化。物理分辨率是不会被改变的。
以 chrome 浏览器为例,我们可以在浏览器的设置中,修改网页缩放比。和修改屏幕分辨率不同,修改网页缩放比是在设备分辨率缩放比的基础之上进行修改。
例如,我当前的设备分辨率缩放比为 2
然后我再浏览器中设置了网页缩放比为 150%
那么,此时,对于网页而言,新的设备分辨率缩放比为 2 * 1.5 = 3
因此,此时,一个 px
在我的电脑上,就对应了 3 个物理像素。
1// 可以在开发者工具中查看结果2window.devicePixelRatio = 2 * 1.531px = 3pt
视觉上的表现就是整个网页变大。我们也可以通过快捷键直接修改网页缩放比。commond +
放大,command -
缩小。
通常,我们使用单位 英寸(inch) 来表示一个屏幕的物理尺寸大小。这个尺寸大小指的是屏幕显示器对角线的长度。
1// 英寸换算尺寸21inch = 2.54cm
PPI (pixel per inch),每英寸像素,表示每英寸所包含的像素点数目,更确切的说法是像素密度。数值越高,说明屏幕能以更高密度显示图像,画面的细节就会越丰富。
假定屏幕的物理分辨率为 X x Y,那么 PPI 的计算公式为:
size
表示屏幕尺寸,上面我们已经计算过该值。
例如对于 iphone 12 来说 ,它的物理分辨率为 2532 x 1170
,屏幕尺寸为 6.1 英寸
,带入公式计算出来的 PPI 就约等于 460 ppi
通常情况下,PPI 是用于表达设备渲染精度的一种比较靠谱的指标。因此,PPI 越高,表示在有限的物理尺寸中,显示器能渲染的图像就越精细,显示器的质量就越高。
除此之外,还有一个与 PPI 类似的概念,叫做 DPI(Dots per inch),这个概念的计算方式与 PPI 基本是一致的。不过,DPI 通常用于表示打印机等将渲染内容映射到纸张、相片等实物上的像素密度,而 PPI 则用于表示直接在设备上显示时的像素密度,注意他们的区别。因此,对于前端开发来说,我们只有在很少的场景中,才会关注到 DPI 的概念。
理解了这些基础概念之后,接下来,我们分享一些在实践中比较常见的场景进一步理解他们。