CSS 上的浮动字体大小值如何在浏览器之间呈现?

Posted

技术标签:

【中文标题】CSS 上的浮动字体大小值如何在浏览器之间呈现?【英文标题】:How do float font-size values on CSS render among browsers? 【发布时间】:2016-06-29 07:36:21 【问题描述】:

CSS em 单元很棒,但有些事情总是让我烦恼,可能是因为我没有完全理解它们。

字体在每种尺寸下的渲染效果都不尽相同,在不精确的值上尤其糟糕。这就是为什么,如果你想使用em 为字体提供精确的像素值,你必须这样做(假设你没有改变正文的 16px 字体大小):

font-size: 0.875em; /* 14px */
font-size: 1.25em; /* 18px */

也许你只是想增加一点大小,但后来意识到0.9em = 14.4px,然后你害怕你的字体看起来模糊!在任何情况下,如果你给一个段落一个font-size1.25em (18px),然后将正文大小从16px 更改为14px,那么该段落将是17.5px。再次模糊!

假设我们正在处理常见的 1x 口粮屏幕(如桌面屏幕),例如,11.5px 字体将如何呈现?我已将它们打印在一个测试 html 文件上,它们看起来与 12px 字体一模一样。

这是所有浏览器都推荐的行为吗?使用 ems 时可能由字体大小决定的填充和边距等大小呢?他们也会被围捕吗?

我对 3 个市长浏览器上的效果图进行了比较。这里是:

我把它放大了一点(200%),这样更容易看到细节。在顶部,您可以看到相同文本在 14 像素(左)和 14.4 像素(右)处的呈现方式。下面,我使用差异混合模式将它们叠加在 Photoshop 上,看看是否有任何差异。如您所见,Chrome 对 font-size 进行四舍五入,并以相同的大小呈现,同时框的高度不同。 Firefox 具有相同的高度,但字体在 x 轴上的渲染略有不同,而字体的高度似乎相等。 IE 结果是一种混合。无论如何,我真的很惊讶,因为 14.4px 字体似乎根本没有模糊。

【问题讨论】:

【参考方案1】:

但这是所有浏览器都推荐的行为吗?

这是我在w3.org找到的内容

参考像素 是像素密度为 96dpi 且距离阅读器一臂远的设备上一个像素的视角。对于 28 英寸的标称臂长,因此视角约为 0.0213 度。因此,对于在手臂长度上阅读,1px 对应于大约 0.26 毫米(1/96 英寸)。

所以1px不一定对应屏幕上的1个像素,见下图:

因此,即使您可以根据 0.25px(使用上面的像素值)计算,将元素移动 1 个文字屏幕像素,也没有完成。

在使用 em 时,可能由字体大小决定的填充和边距等大小呢?他们也会被围捕吗?

查看this question,它可能有用。基本上这些值是四舍五入的。您的11.5px 看起来与12px 相同的原因是因为它被四舍五入了。 11.4px 看起来就像 11px

另请参阅this website,它提供了一些关于其工作原理的有趣行为。

请参阅下面的代码片段示例。看看 translateY(0.5px) 上的 div 是如何只下移一个像素的,这证明浏览器会舍入该值:

.box 
  width: 30px;
  height: 30px;
  background-color: #FF0000;
  display: inline-block;

#cont 
  outline: 1px solid #000;
  display: inline-block;
<div id="cont">
  <div class="box" style="transform: translateY(0.1px)"></div>
  <div class="box" style="transform: translateY(0.2px)"></div>
  <div class="box" style="transform: translateY(0.3px)"></div>
  <div class="box" style="transform: translateY(0.4px)"></div>
  <div class="box" style="transform: translateY(0.5px)"></div>
  <div class="box" style="transform: translateY(0.6px)"></div>
  <div class="box" style="transform: translateY(0.7px)"></div>
  <div class="box" style="transform: translateY(0.8px)"></div>
  <div class="box" style="transform: translateY(0.9px)"></div>
  <div class="box" style="transform: translateY(1.0px)"></div>
</div>

【讨论】:

在我的例子中,我没有看到从 0.5px 的跳跃,我看到一行水平像素越来越淡,直到它们消失 您使用的是什么浏览器。我在 Firefox 45 和 47 上测试过这个?【参考方案2】:

这不是一个简单的问题,并不“完全”适用于浏览器。 这更多是关于使用的整个渲染系统以及“连续空间与离散空间”或“使用方框绘制曲线”的问题。

一些有助于更好地理解问题的文本:

(尝试 google 搜索“字体渲染离散空间”、“亚像素字体渲染”或“字体提示”的结果)

http://jcgt.org/published/0002/01/04/paper.pdf http://www.cutebugs.net/files/curve/fabris97antialiasing.pdf http://lspwww.epfl.ch/publications/typography/frsa.pdf https://www.grc.com/ctwho.htm

在这里很难定义“正确”行为,因此“默认行为”几乎是不可能的。这是一个关于空间和人类感知的数学问题,而不是浏览器行为或 CSS。

...无论如何,关于“移动 1 个像素”的描述行为与浏览器或系统使用的字体提示技术有关。

【讨论】:

这是很多有用的信息,您看起来已阅读,但最后,这不是一个明确的答案,它只是“它取决于”。我知道这很难,但你能提取一个通用规则以便在大多数情况下安全使用吗?您认为使用亚像素字体大小是否安全? 我知道这不是一个答案,但这个问题没有真正的答案。字体的渲染(位置和大小)不仅取决于浏览器,还取决于操作系统、图形系统配置、像素密度、媒体……我唯一相信的经验法则是:0.875 rem 或更小使用小数 (CSS) 像素对易读性和大小或定位是危险的,仅适用于打印媒体(高分辨率或“像素比”:1css 像素 = 许多媒体像素)。媒体像素只是一个像素,不能分割。【参考方案3】:

这不是一个需要以分层方式定义 css 的真正棘手的问题:

.box 
    font-size: 1em; /* size according to your*/

这是您的 div 值,假设您的框内容中有另一个标题标签:

.box h2 
    font-size:14px;

【讨论】:

以上是关于CSS 上的浮动字体大小值如何在浏览器之间呈现?的主要内容,如果未能解决你的问题,请参考以下文章

CSS 字体大小:相对值与绝对值。使用哪个? [关闭]

如何在页面上设置一行20个字,一页20行且是四号字

CSS如何设置文字字体

如何在.NET中以与浏览器相同的大小呈现文本给文本的CSS

如何在 Windows 上的 CSS 3 中更流畅地渲染细字体?

用WORD文档时,如何调整字与字之间的间隙大小