Firefox 的 `bolder` 默认值对可变字体来说是个问题

Avatar of Šime Vidas
Šime Vidas

DigitalOcean 为您旅程的每个阶段提供云产品。立即开始使用 200 美元的免费额度!

可变字体使您可以轻松地从单个字体文件创建 大量字体样式。不幸的是,如今浏览器中 <b><strong> 元素的默认渲染与可变字体启用的广泛的 font-weight 值不兼容。

https://twitter.com/zachleat/status/1374443096281280517

浏览器在 <b> 的默认 font-weight 上存在分歧

<b><strong> 元素的目的是引起页面上特定单词或文本片段的注意。浏览器通过增加这些元素的 font-weight 来使它们脱颖而出。这在正常情况下效果很好。例如,MDN Web Docs 在每个页面底部的“发现问题?”卡片中的一些地方使用了 <b>

Screenshot of an MDN article with red arrows pointing at instances of bolded words on the page.

当页面上的文本具有自定义 font-weight 时,情况变得更加复杂。文本的默认权重为 400,但 font-weight 属性接受介于 11000(含)之间的任何数字。让我们看看 Chrome 和 Firefox 在默认情况下如何渲染包含在 <b> 中的文本,具体取决于周围文本的 font-weight

在 CodePen 上查看

Chrome 和 Firefox 在 <b> 元素的默认渲染上存在分歧。Chrome 使用 700 的恒定 font-weight(Safari 的行为相同),而 Firefox 根据周围文本的 font-weight 在三个值(400700900)之间进行选择。

这种差异来自哪里?

您可能已经猜到了,Chrome 和 Firefox 在其用户代理样式表中为 <b><strong> 元素使用了不同的 font-weight 值。

/* Chrome and Safari’s user agent stylesheet */
strong, b {
  font-weight: bold;
}

/* Firefox’s user agent stylesheet */
strong, b {
  font-weight: bolder;
}

boldbolder 值在 CSS 字体模块 中指定;bold 等于 700,而 bolder 是一个 相对权重,其计算方式如下

如果外部文本的 font-weight 为……bolder 关键字计算为……
1349400
350549700
550899900
9001000无变化(与外部文本的值相同)

Chrome 和 Firefox 在 <b> 的默认渲染上存在分歧,但哪个浏览器更符合标准?font-weight 属性本身在 CSS 字体模块中定义,但不同 HTML 元素的建议 font-weight 值位于 HTML 标准的 渲染部分

/* The HTML Standard suggests the following user agent style */
strong, b {
  font-weight: bolder;
}

HTML 标准早在 2012 年 就开始建议使用 bolder 而不是 bold。截至今天,只有 Firefox 遵循此建议。Chrome 和 Safari 尚未切换到 bolder。由于这种不一致性,流行的 Normalize 基础样式表包含一个 CSS 规则,该规则 在浏览器之间强制执行 bolder

这两个默认值中哪个更好?

浏览器中有两个不同的默认值,Firefox 的默认值与标准匹配。那么,Chrome 应该与 Firefox 保持一致,还是 Chrome 的默认值更好?让我们再看看 <b> 元素的默认渲染。

在 CodePen 上查看

这两个默认值各有弱点:Chrome 的 bold 默认值在较高的 font-weight 值(大约 700)下会失效,而 Firefox 的 bolder 默认值在较低的 font-weight 值(大约 300)下存在问题。

在 Firefox 的最坏情况下,包含在 <b> 中的文本几乎无法辨认。以下屏幕截图显示了 Firefox 中 font-weight349 的文本。你能找到包含在 <b> 中的单个单词吗?Firefox 以 400 的默认 font-weight 渲染此元素,这仅增加了 51 个单位。

Three paragraphs of text about English scientist Tim Berners-Lee. All of the text appears to be the same font weight.
在 CodePen 上查看

要点

如果您使用细字体或 font-weight 值低于 350 的可变字体,请注意,<b><strong> 元素在 Firefox 中默认情况下可能并不总是可辨认的。在这种情况下,最好手动为 <b><strong> 定义自定义 font-weight,而不是依赖于浏览器次优的默认值,该默认值不足以增加这些元素的 font-weight

/* Defining the regular and bold font-weight at the same time */

body {
  font-weight: 340;
}

b,
strong {
  font-weight: 620;
}

bolder已过时 并且与可变字体配合使用效果不佳。理想情况下,包含在 <b> 中的文本应该无论周围文本的 font-weight 如何都易于识别。浏览器可以通过始终将 font-weight 增加相同或相似的量来实现这一点。

关于这一点,CSS 工作组正在讨论是否允许在 font-weight 中使用百分比,就像在 font-size 中一样。Lea Verou 写道

一个更常见的用例是,我们希望获得比周围文本更粗或更细的笔画,这种方式与周围文本的粗细无关。

/* Increasing font-size by 100% */
h1 {
  font-size: 200%;
}

/* PROPOSAL - Increasing font-weight by 50% */
strong, b {
  font-weight: 150%;
}

考虑到可变字体,150% 这样的值可能比如今浏览器中现有的 bold/bolder 默认值更好。