CSS 长度单位详解

在使用 CSS 为网站设置样式时,你可能已经意识到屏幕上的英寸并非实际的英寸,像素也不一定就是实际的像素。你有没有想过如何在 CSS 像素中表示光速?在这篇文章中,我们将探索 CSS 长度单位的定义,从理解一些同名物理单位开始,借鉴 C.G.P. Grey[1] 的风格。

工业英寸 (in)

习惯使用英寸作为常用单位的人们已经熟悉这个物理单位了。对于我们这些生活在使用 公制 的地方的人来说,自 1933 年以来,“工业英寸”被定义为 2.54 厘米或 0.0254 米的数学等价物。

设备像素

电脑屏幕以像素显示内容。显示器上单个的物理“光点”,能够独立于其邻居显示全色,被称为 像素(图像元素)。在这篇文章中,我们将屏幕上的物理像素称为“设备像素”(不要与稍后将要解释的CSS 像素混淆)。

显示像素密度、每英寸点数 (DPI) 或每英寸像素数 (PPI)

特定设备上设备像素的物理尺寸可以从设备制造商提供的显示 像素密度 中推导出来,通常以每英寸点数 (DPI) 或每英寸像素数 (PPI) 为单位。当这两个单位指的是屏幕显示时,它们基本上指的是同一件事,其中 DPI 是常用的但不正确的单位,而 PPI 则更准确,但没人关心。设备像素的物理尺寸只是其 DPI 的倒数。

我目前使用的 MacBook Air (2011) 配备了 125 DPI 显示屏,因此

(一个设备像素的宽度或高度) = 1/125 英寸 = 0.008 英寸 = 0.02032 厘米

显然,这个数字太小了,无法在规格说明书上打印,所以 DPI 保持不变。

CSS 像素 (px)

CSS 像素的尺寸可以大致理解为肉眼舒适可见的大小,既不太小以至于需要眯着眼睛看,也不至于大到可以看到像素化。无需咨询眼科医生来定义“舒适可见”,W3C CSS 规范 为我们提供了一个参考建议

参考像素是指像素密度为 96 DPI 的设备上,像素在与阅读者手臂长度距离处的视角。

CSS 像素的正确尺寸实际上取决于你与显示器之间的距离。除了 Google Glass(它安装在你的头上)之外,人们通常会根据自己的视力,为特定设备找到自己独特的舒适距离。鉴于我们无法判断用户是否有视力障碍,我们关心的只是给定设备外形尺寸的典型观看距离——例如,手机通常握得更近,而笔记本电脑通常放在桌子上或腿上。因此,手机的“观看距离”比笔记本电脑或台式电脑的短。

观看距离

如前所述,观看距离因人而异,也因设备而异,这就是我们必须将设备分类为不同外形尺寸的原因。推荐的参考观看距离(“手臂长度”)和参考像素密度(“96 DPI”)实际上是历史性的;它是人们在 20 世纪后期通常访问网页的方式的证明

The first computer that runs the web. From Wikipedia: WWW

第一台运行 Web 的电脑。来自 维基百科:万维网

对于 21 世纪的日常设备,我们有不同的参考建议

基准像素密度

一个 CSS 像素的宽度/高度

观看距离

20 世纪配备 CRT 显示器的 PC

96 DPI

~0.2646 毫米 (1/96 英寸)

28 英寸 (71.12 厘米)

配备 LCD 的现代笔记本电脑[2]

125 DPI

0.2032 毫米 (1/125 英寸)

21.5 英寸 (54.61 厘米)

智能手机/平板电脑[3]

160 DPI

~0.159 毫米 (1/160 英寸)

16.8 英寸 (42.672 厘米)

从这个表格中,很容易看出,随着像素密度的增加和 CSS 像素尺寸的减小,像你我这样的 麻瓜 通常需要将设备拿得更近才能舒适地看到设备屏幕上的内容。

因此,我们在 CSS 世界中确立了一个基本事实:**CSS 像素将在不同的物理尺寸下显示,但它始终会以查看者感到舒适的正确尺寸显示。**利用这一原理,我们可以安全地将基本尺寸(例如基本字体大小)设置为固定的像素大小,而与设备外形尺寸无关。

CSS 英寸 (in)

在电脑屏幕上,CSS 英寸与物理英寸无关。相反,它被重新定义为正好等于 96 个 CSS 像素。这导致了一个尴尬的情况,即你永远无法使用基本的 CSS 单位在屏幕上可靠地绘制精确的标尺[4]。但这正是我们想要的:使用 CSS 单位设置大小的元素将始终跨设备以用户感到舒适的方式显示。

顺便说一句,如果用户将页面打印到纸上,浏览器会将 CSS 英寸映射到物理英寸。你可以使用 CSS 可靠地绘制精确的标尺并打印出来。(确保在打印机设置中关闭“缩放以适应”!)

设备像素比 (DPPX)

随着我们步入未来(我的飞行汽车在哪里?),如今许多智能手机都配备了高密度显示屏。为了确保 CSS 像素在访问 Web 的每台设备上(即任何带有屏幕和网络连接的设备)都保持一致的大小,设备制造商必须将多个设备像素映射到一个 CSS 像素,以弥补其相对较大的物理尺寸。CSS 像素相对于设备像素的尺寸之比就是设备像素比 (DPPX)。

以 iPhone 4 为最著名的例子。它配备了 326 DPI 显示屏。根据我们上面的表格,作为智能手机,其典型观看距离为 16.8 英寸,基准像素密度为 160 DPI。为了创建 1 个 CSS 像素,苹果选择将设备像素比设置为 2,这使得 iOS Safari 以与在 163 DPI 手机上相同的方式显示网页。

在我们继续之前,回头看看上面的数字。我们实际上可以通过不将设备像素比设置为 2,而是设置为 326/160 = 2.0375,并使 CSS 像素与参考尺寸完全相同来做得更好。不幸的是,这样的比例会导致一个意外的后果:由于每个 CSS 像素并非由完整的设备像素显示,因此浏览器必须做出一些努力来对所有位图图像、边框等进行抗锯齿处理,因为它们几乎总是定义为完整的 CSS 像素。浏览器很难利用 2.0375 个设备像素来绘制 1 个 CSS 像素宽的边框:如果比例简单地为 2,则更容易做到。

顺便说一句,163 DPI 恰好是上一代 iPhone 的像素密度,因此 Web 将以相同的方式工作,而无需开发人员对其网站进行任何特殊的“升级”。

设备制造商通常选择 1.5 或 2 或其他整数作为 DPPX 值。偶尔,一些设备决定不按常理出牌,并配备了 类似 1.325 的 DPPX;作为 Web 开发人员,我们可能应该忽略这些设备。

Firefox OS 最初是一个手机操作系统,它 以这种方式实现了 DPPX 计算。实际的 DPPX 将由每台出货设备的制造商确定。

CSS 点 (pt)

是印刷行业中常用的单位,作为金属排版单位。随着世界逐渐从 凸版印刷 转向 桌面出版,“PostScript 点”被重新定义为 1/72 英寸。CSS 遵循相同的约定,将 1 个 CSS 点映射到 1/72 个 CSS 英寸,以及 96/72 个 CSS 像素。

你可以很容易地看到,就像 CSS 英寸一样,在设备显示器上,CSS 点与传统单位几乎没有关系。只有当我们实际打印网页时,它的尺寸才会与其桌面出版对应物匹配。

CSS 磅 (pc)、CSS 厘米 (cm)、CSS 毫米 (mm)

就像 CSS 英寸一样,虽然它们之间的相对关系保持不变,但它们在屏幕上的基本尺寸已被 CSS 像素重新定义,而不是 标准 SI 单位(米),后者由 光速 定义,光速是一个普遍常数。

我们实际上可以重新定义 CSS 中的光速;它是每秒 1,133,073,857,007.87 个 CSS 像素[5] — 从我们的角度来看,在 CSS 中的相对论使光在比传统 PC 外形尺寸更小的设备上传播速度略慢,从现实世界中观察屏幕。

视口元标记

虽然智能手机方便地放在你的手掌中,并且可以保证 CSS 像素会以用户舒适的大小显示,但只能显示固定宽度桌面网站一部分的设备不会非常有用。如果手机违反了 CSS 单位规则并假装成其他东西,那也同样没用。

引入 视口元标记 为移动设备带来了两全其美的方案,它将页面缩放的控制权交给了用户和 Web 开发人员。你可以设计一个移动布局,并选择退出视口缩放,或者,你可以保留为桌面浏览器设计的网站,并让移动浏览器为你和用户缩小页面。与往常一样,可以在 Mozilla 开发者网络 上找到详细的描述和用法。

结论

浏览器供应商虽然存在竞争关系,但认识到维护 Web 平台稳定性的努力,并通过一个标准组织协调其功能集。在宣布功能和 API 的适用性作为标准之前,会仔细测试其在所有场景中的实用性。CSS 像素的定义就是其中之一 从一开始就存在。引入的新功能必须保持向后兼容性,而不是改变旧的行为[6],因此许多功能(设备像素、视口元标记等)都被引入作为额外的复杂层。使用标准化功能的旧网页因此具有内置的“向前兼容性”。

考虑到这一点,Mozilla 与我们的合作伙伴一起培育和捍卫开放 Web——我们都珍视的独特平台。


[1] 好吧,实际上不是,因为我们不会为此制作视频。如果 C.G.P. Grey 真的制作了关于这个主题的视频,我不会介意的!

[2] 似乎是笔记本电脑的常见值[需要引用]

[3] 典型值为此处文档 中定义的“mdpi” Android 设备。

[4] 只有一个例外:非标准的CSS 单位 mozmm 可以实现这一点,前提是 Firefox 知道其运行的像素密度。这超出了我们主题的范围。

[5] 每秒 299,792,458 米 ÷ 每英寸 0.0254 米 x 每英寸 96 像素

[6] 曾经有一段时间,人们试图提出一种完全打破向后兼容性的新标准(*咳嗽* XHTML *咳嗽*),但那是另一个故事了。

关于 Tim Chien

Timothy Guan-tin Chien,又名“timdream”,是一位工程经理和前端 Web 开发人员,致力于 Firefox OS 的移动 UI “Gaia”。他喜欢编写代码、发表演讲,并尝试定期在blog.timc.idv.tw上发布博客。

更多 Tim Chien 的文章…

关于 Robert Nyman [荣誉编辑]

Mozilla Hacks 的技术布道师和编辑。发表关于 HTML5、JavaScript 和开放 Web 的演讲和博客。Robert 是 HTML5 和开放 Web 的坚定支持者,自 1999 年以来一直从事 Web 前端开发工作——在瑞典和纽约市。他还定期在http://robertnyman.com上发布博客,并且喜欢旅行和结识新朋友。

更多 Robert Nyman [荣誉编辑] 的文章…


26 条评论

  1. 匿名

    校对英语语法将极大地改善这篇文章。

    目前看来,它显得有些业余。

    2013 年 9 月 10 日 05:39

    1. Robert Nyman [编辑]

      文章已更新,包含语法更正。我们也需要在平衡作者中非英语母语者的表达和语气,尊重他们的措辞和风格。我们非常乐意接受任何关于语法错误的指正。

      2013 年 9 月 10 日 08:00

  2. Félix Saparelli

    优秀的文章。但是,文本中存在一些语法和拼写错误。现在列出它们为时已晚(阅读:太早),但由相对称职的人员进行校对不会花费太多时间,并且可能比我发现的更多错误。

    此外,我个人会从第二段的第二句中删除“相对”。我认为,仅在这方面,就需要使用绝对词。

    2013 年 9 月 10 日 06:20

    1. Robert Nyman [编辑]

      很高兴您喜欢这篇文章。我们已经更新了文章中的语法。第二段中的那部分内容已被删除,我们认为它可能无助于使情况更清晰。

      2013 年 9 月 10 日 08:01

  3. Maxime

    很棒的文章。

    我发现两个错别字

    seem => seen
    236 => 326

    2013 年 9 月 10 日 08:13

    1. Chris Heilmann

      已修复,谢谢!

      2013 年 9 月 10 日 08:38

  4. Antonio Fernandes

    很棒的阅读!

    2013 年 9 月 10 日 14:41

  5. Sacah

    哇,苛刻的读者。很棒的文章,在一页中很好地总结了所有内容。
    谢谢

    2013 年 9 月 10 日 18:04

  6. Aras

    很棒的文章,也很及时。我仍然对使用 CSS 像素定义元素大小有些犹豫。我们从菲茨定律知道,UI 元素的物理尺寸对于交互非常重要。我们不仅需要使 UI 元素清晰可见,而且在移动设备上,还需要使触摸交互变得容易。为了使交互式 UI 元素易于触摸获取,我们必须确保它们在任何手机上都具有最小的物理尺寸——我不确定 CSS 像素是否能给我们带来这种信心。这就是我通常使用 CSS `rem` 定义交互式元素大小的原因。您对此有何看法?(小错误:1/125 英寸 = 0.008 英寸)。再次感谢这篇文章,我很享受阅读它,并希望很快看到您更多文章!

    2013 年 9 月 10 日 18:16

    1. Tim Chien

      Aras,感谢您的赞美。我*个人*并不太担心触摸尺寸,因为*据称*它们在所有触摸屏上都应该大致相同,就像 CSS 像素一样。但我同意触摸尺寸比视觉尺寸更成问题。也许我们应该谨慎地将触摸区域做得更大?

      2013 年 9 月 11 日 01:56

      1. Aras

        我同意,增大触摸区域是防止出现问题的不错方法,但有时我们会尝试将过多的元素塞进界面,而且没有明确的指南说明什么尺寸太小。我听说有时 44px 被用作按钮的最小尺寸,但正如您解释的那样,这并不总是对应于相同的物理尺寸。

        2013 年 9 月 11 日 02:07

  7. Ino Detelic

    那么,如果您想支持从 IE8 到未来设备和手机,哪个单位最适合调整大小?

    我猜使用 px、视口元标记和媒体查询将获得一致的结果。

    2013 年 9 月 11 日 04:48

  8. Robert Kaiser

    我仍然认为,CSS 中无法表示实际物理尺寸是一个相当不幸的决定,所有这些准物理单位都只是默默地更改为不符合人们的预期。

    在触摸屏上创建确保足够大的元素以适合拇指(您可能知道屏幕上拇指或其他手指的大小不会随屏幕 dpi 或眼睛的距离而变化)或以其他方式在屏幕上正确表示实际尺寸,这有点困难。

    不幸的是,网站上尤其是“pt”和部分“in”单位的现有用法使得创建这种混乱成为必要,但在我看来,更不幸的是,没有标准的替代方案来真正拥有在需要时使用的物理单位(不过,有一个非标准的仅限 Mozilla 的替代方案)。

    2013 年 9 月 11 日 08:47

  9. calscot

    我对表格中像素大小的数字感到困惑。

    精确到四位有效数字,我得到

    96 DPI = 25.4 毫米 / 96 = 0.2646 毫米,而不是 0.26 毫米

    125 DPI= 25.4 毫米 / 125 = 0.2032 毫米,而不是 0.01872 毫米

    160 DPI = 25.4 毫米 / 160 = 0.1586 毫米,而不是 0.01587 毫米

    2013 年 9 月 11 日 09:43

    1. Tim Chien

      我已更正了舍入错误。谢谢。

      2013 年 9 月 12 日 02:24

  10. Molo

    作为一名开发 HTML5 Web 应用的人,我实际上只想关闭这种行为,即让设备像素与 CSS 像素进行 1:1 映射,然后在我的应用中以我认为最佳的方式处理其余部分,而不是让浏览器或设备尝试变得聪明(例如,Apple 为其视网膜产品使用的四倍大小画布后备存储黑客)。并且在 WebKit 中有一种方法可以做到我想要的,但他们在一年或两年前将其删除了。非常有趣 :(
    天哪,为什么没有标准化的 ffs-give-me-my-1-to-1-pixel-mapping 功能?!请允许我选择退出,我确实有遗留内容,所以请停止乱动我的像素!
    (我知道在将其包装到原生应用中时可能存在此类功能,但这听起来并不像开放式 Web 标准)

    非常生气,
    Molo

    2013 年 9 月 11 日 12:52

    1. Tim Chien

      您好,Molo,

      要获得 1:1 像素映射,您可以选择退出视口缩放,并使用 window.devPixelRatio 的计算结果在 JS 中调整 div 的大小(使用 transform: scale())。但是,正如我在文章中指出的那样,即使您设法获得了设备像素,您仍然无法访问实际的物理尺寸(除非在 Gecko 上使用 mozmm)。

      2013 年 9 月 12 日 03:29

    2. Molo2

      我同意。我记得每个人过去都说“不要使用 px,因为它们不会缩放(……在缩放或其他情况下)”;当时“pt”和其他相对单位是首选。但是,不,浏览器开始缩放 px,这真是一个***烂摊子。像素变成了 CSS 像素。那些不理解的人会弄乱网站。而那些有点理解的人则因为终于明白了而欣喜若狂,却没有质疑这种愚蠢的做法。

      该死!

      2013 年 9 月 12 日 23:53

  11. Molo

    倒数第二句话犯了一个错误,应该改为:“我没有遗留内容”。

    2013 年 9 月 11 日 12:56

  12. Edward Chung

    喜欢这篇文章,让我对 CSS 单位有了一些了解。谢谢!

    2013 年 9 月 12 日 18:56

  13. Bernardo Antunes

    我编写了一个关于我所谓的“感知尺寸”的概念验证,以便能够确保设计人员的感知尺寸。您可以更改参数并在此处使用页面
    http://asdesigned.bernardoantunes.com
    我认为他们应该停止“玩弄”单位,直接给我们提供真实的单位和值
    – 英寸、厘米
    – dpi、ppi
    以及
    – 设备(手机、平板电脑、笔记本电脑、台式机、电视或其他)
    – 观看距离(可以选择在浏览器中为每个输出设备自定义)
    然后,我们可以以非常简单的方式完全控制。 :)
    仅供参考。;)

    2013 年 9 月 13 日 04:42

  14. Tim McLean

    很棒的文章!还可以提及 `em`、`rem` 等。

    2013 年 9 月 15 日 21:01

  15. Gabriel

    那么“EM”单位呢?

    2013 年 9 月 17 日 14:04

  16. Nicolas Hoizey

    我强烈不同意这句话:“我们可以安全地将基本尺寸(例如基本字体大小)设置为固定的像素大小,而与设备外形无关”。

    这并不安全!

    浏览器允许用户设置他们自己的首选根字体大小(与大多数设备/浏览器上的默认 16px 不同),因为某些用户需要它。以“px”为单位设置字体大小是可访问性错误。您应该改用“em”或“rem”。

    例如,我在连接到 52 英寸电视的 Mac mini 上将根字体大小设置为 24px,电视离我的沙发 3.5 米,但其他人可能更近或更远,并且可以选择保留默认的 16px 或进一步调整为 32px 或更大。

    2013 年 9 月 18 日 01:41

    1. Tim Chien

      已注意。但在您的情况下,默认的全页面缩放级别是否更好?

      还值得注意的是可访问性优势。

      2013 年 9 月 24 日 01:12

      1. Nicolas Hoizey

        全页面缩放的问题在于,许多网站尚未响应,并且会出现水平滚动。

        2013 年 9 月 26 日 07:17

本文的评论已关闭。