设备像素比是什么?

209

这个属性在移动 Web 的每篇文章中都被提到过,但是我没有找到任何关于它究竟测量什么的解释。
有人能详细说明一下像这样的查询检查什么吗?

@media only screen and (-webkit-min-device-pixel-ratio: 1.5),
only screen and (min--moz-device-pixel-ratio: 1.5),
only screen and (-o-device-pixel-ratio: 3/2), 
only screen and (min-device-pixel-ratio: 1.5) {

    //high resolution images go here

}
5个回答

209

简短回答

设备像素比是物理像素与逻辑像素之间的比例。例如,iPhone 4和iPhone 4S的设备像素比为2,因为物理线性分辨率是逻辑线性分辨率的两倍。

  • 物理分辨率:960 x 640
  • 逻辑分辨率:480 x 320

计算公式如下:

res_p/res_l

其中 res_p物理线性分辨率,而 res_l逻辑线性分辨率

其他设备报告不同的设备像素比,包括非整数值。例如,诺基亚 Lumia 1020 报告为 1.6667,三星 Galaxy S4 报告为 3,苹果 iPhone 6 Plus 报告为 2.46 (来源:dpilove)。但从原则上讲,这并不改变任何事情,因为你永远不应该为任何特定设备进行设计。

讨论

CSS中的“像素”并没有被定义为“某些屏幕上的一个图像元素”,而是存在着一个“参考像素”,它是一个非线性的角度测量单位,表示0.0213° 的视角。这大约相当于一英寸的1/96。 来源:CSS绝对长度

这对于网页设计有很多影响,比如准备高清图像资源以及根据不同设备的像素比谨慎应用不同的图片。你不希望低端设备下载一个非常高分辨率的图像,然后在本地进行缩小。同样,你也不希望高端设备将低分辨率的图像放大,以便造成模糊的用户体验。

如果您在处理位图图像时遇到困难,为了适应许多不同的设备像素比,您应该使用CSS媒体查询或HTML图片元素来为不同组设备提供不同资源集。结合一些技巧,如`background-size: cover`或明确设置`background-size`为百分比值。
#element { background-image: url('lores.png'); }

@media only screen and (min-device-pixel-ratio: 2) {
    #element { background-image: url('hires.png'); }
}

@media only screen and (min-device-pixel-ratio: 3) {
    #element { background-image: url('superhires.png'); }
}

这样,每种设备类型只加载正确的图像资源。还要记住,CSS 中的 px 单位始终基于 逻辑像素 运算。

矢量图形的应用场景

随着越来越多的设备类型出现,为所有设备提供足够的位图资源变得更加复杂。在 CSS 中,媒体查询目前是唯一的方式,在 HTML5 中,picture 元素 可以让您针对不同的媒体查询使用不同的来源,但支持仍未达到100%,因为大多数网页开发人员仍需为 IE11 提供支持一段时间(来源:caniuse

如果您需要清晰的图标、线条艺术和设计元素(而非照片),您需要开始考虑使用 SVG,它可以美观地适配所有分辨率。


1
谢谢,那么如果我为iPhone 4制作一个CSS文件,并将页面的CSS测量值设置为480 x 320和width=device-width,那么它会被拉伸到全屏吗? - ilyo
2
你不能这样做。你需要使用逻辑像素来布局你的元素,并使用高分辨率图像和background-size技巧来最大化利用显示器。 - Anders Marzi Tornblad
2
我对Android的情况一无所知。不同的制造商可能对逻辑像素和物理像素有不同的看法...在数百个不同的设备上自己尝试一下吧...或者简单地假设设备报告的值是正确的。不要为特定的设备设计,而是使用媒体查询为值范围进行设计! - Anders Marzi Tornblad
2
@atornblad 我认为应该是“..在物理像素和逻辑像素之间”。 - Ilya Buziuk
1
非常感谢!你在几行代码中解释了其他人试图用数百行代码解释的东西。 - Marian07
显示剩余13条评论

192

设备像素比 == CSS像素比

在Web开发的世界中,设备像素比(也称为CSS像素比)决定了CSS如何解释设备屏幕分辨率。

浏览器的CSS通过以下公式计算设备的逻辑(或解释)分辨率:

公式

例如:

Apple iPhone 6s

  • 实际分辨率:750 x 1334
  • CSS像素比:2
  • 逻辑分辨率:

公式

当查看网页时,CSS会认为设备有一个375x667分辨率的屏幕,并且媒体查询将响应为屏幕是375x667。但渲染在屏幕上的元素将比实际的375x667屏幕更清晰,因为物理屏幕中有两倍多的物理像素。

其他一些例子:

Samsung Galaxy S4

  • 实际分辨率:1080 x 1920
  • CSS像素比:3
  • 逻辑分辨率:

formula

iPhone 5s

  • 实际分辨率: 640 x 1136
  • CSS像素比: 2
  • 逻辑分辨率:

formula

设备像素比为什么存在?

创建CSS像素比的原因是手机屏幕分辨率越来越高,如果每个设备仍然有一个CSS像素比为1,那么网页就会渲染得太小而无法看清。

一个典型的全屏桌面显示器大约是24英寸,分辨率为1920x1080。想象一下如果那个显示器缩小到约5英寸,但分辨率仍然相同。在屏幕上查看内容将变得不可能,因为它们会非常小。但是制造商现在不断推出1920x1080分辨率的手机屏幕。

因此,设备像素比是由手机制造商发明的,以便他们可以继续推动手机屏幕的分辨率、清晰度和质量,而不会使屏幕上的元素太小而难以看清或阅读。

以下是一个也可以告诉您当前设备像素密度的工具:

http://bjango.com/articles/min-device-pixel-ratio/

这篇文章介绍了移动设备中像素密度的概念,特别是“最小设备像素比”(min-device-pixel-ratio)。在设计和开发响应式网页时,理解像素密度对于确保页面在不同设备上显示正确非常重要。

1
因此,图像被拉伸以匹配高dpi或物理像素。假设图像为300px,逻辑/ CSS px也为300,但物理px为600,则设置图像宽度意味着图像被拉伸...我还听说有时图像在高dpi上显示较小,为什么? - Muhammad Umer
2
在你的例子中,带有“width:100%”的300像素图像将是显示器的全宽。它不会被拉伸。屏幕会“认为”它是一个300像素的显示器。图像根据逻辑/ CSS 分辨率显示。现在,在你的例子中,你也可以使用一个600像素的图像来代替。它将是逻辑 300 像素显示器的全宽,但由于你的显示器本来就是 600 像素,因此比起原始的300像素图像,这张更大的图像看起来会更加清晰。更大的图像,但它看起来更好了,因为显示器拥有所有那些额外的像素。这就是“Retina 屏幕”的背后理念。 - Jake Wilson
1
如果一个设备的物理像素宽度为600,CSS像素比率=2,则您的CSS认为屏幕仅为300px宽。例如,如果将图像设置为150px宽,则其将占据屏幕的1/2。关于质量,如果提供600px宽的图像,则该图像将比300px宽的图像更清晰,因为有600个物理像素。 - Jake Wilson
1
@Anuj 我不知道,而且硬件/软件中它的定义并不重要。无论如何,一个是从另一个计算出来的。 - Jake Wilson
设备像素比是由设备本身决定的,还是由设备上每个浏览器独立决定的?这篇文章表明,每个浏览器独立决定设备像素比。 - weibeld
显示剩余8条评论

12

Boris Smus的文章“面向变量像素密度的高分辨率图片”更准确地定义了设备像素比:每个CSS像素的设备像素数是一个很好的近似值,但并非全部信息。

请注意,您可以使用window.devicePixelRatio获取设备使用的DPR。


10

4
如何确定设备是否使用虚拟像素度量,并了解什么是虚拟像素?如何在 CSS 测量中使用设备像素而不是虚拟像素? - ilyo
抱歉,你必须在谷歌上搜索或在真实设备上进行测试 :( - netalex

0
设备像素比与设备的像素密度直接相关。
我能找到的最简洁的描述是:
DPR的目的是为了在不同物理像素密度的设备上保持CSS像素的一致大小,因此屏幕上的字母、符号、图像和其他所有内容的大小也保持一致。
来源: screenresolutiontest

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接