我正在Open Sans
通过 Google Fonts API / CSS 加载 OpenType 网络字体。
在 Chrome 43 (Linux+Windows) 和 Internet Explorer 11 (Windows) 中,浏览器完全按照字体中指定的方式呈现文本。但是,在 Firefox 38.0.5 中,某些字符的文本宽度和/或间距呈现不同。所有字体变体均采用默认值(“正常”)。
例如,我们可以使用字符1
、a
、b
和i
。Open Sans "unitsPerEm" 为 2048。因此,在字体大小为 18.0px 时,上述每个字符的 30 个字符的宽度应如下基于 1/u * p * c * w 其中 u = 2048, p = 18.0,c = 30,w 是每个字符的前进宽度(Wolfram Alpha 方程)。
+----------------------------------------+-------- ---+ | 字符 | 字体(px) | 数字字符 | 提前| 宽度(像素) | +--------+----------+----------+-----------+-------- ---+ | 1 | 18.0 | 30 | 第1171章 308.76 | | 一个 | 18.0 | 30 | 第1139章 300.322 | | 乙 | 18.0 | 30 | 第1255章 330.908 | | 我 | 18.0 | 30 | 518 | 136.582 | +----------------------------------------+-------- ---+
这个 ( JSFiddle ) 使用 canvas 方法输出、、和measureText
30 个字符的宽度(以像素为单位)。1
a
b
i
Chrome 文本长度与预期值完全匹配:
Firefox Linux 文本长度与除 之外的任何字符都不匹配a
,即使考虑到 Firefox 不提供亚像素精度这一事实:
我已经确认画布报告的宽度确实是 Chrome 和 Firefox 的输出——下图显示红色背景,Chrome 的文本为黑色,Firefox 的文本为白色——宽度与上面的输出相匹配Gimp“测量”工具。Firefox 的b
andi
太宽,又1
太窄:
附带说明一下,Firefox Windows 文本长度甚至与 Firefox Linux 不一致——a
和b
宽度现在符合预期,但1
仍然i
不正确:
这是一个干净的 Firefox 配置文件,具有默认设置且未安装任何扩展。
有人可以解释发生了什么,以及如何强制 Firefox 根据字体规范呈现字体吗?
更新:在 Windows 上,设置首选项gfx.font_rendering.directwrite.enabled
以true
解决问题(我相信这是硬件加速可用时的 Firefox 默认设置,即使硬件加速不可用,此设置也会强制启用它,例如在我的测试 VMWare 系统上)。自版本 37 以来,DirectWrite 一直是 Windows 上 Chrome 的默认设置。Linux 行为仍然无法解释。这篇博文详细介绍了 Windows 上 Firefox 中的 DirectWrite 渲染。