如果当前字体中没有所需的字重,浏览器会如何改变字重?

7
假设我有一个包含不同字重的网络字体,每个字重对应不同的文件。当我在CSS中更改不同的字重时,浏览器会寻找与该字重相对应的字体文件,这一切都按预期进行。
现在,如果我有另一个字体,它没有不同的字重,那么我再次在样式表中设置不同的字重,并在浏览器中看到字重的变化。
因此,我想知道,是谁负责计算缺少字重的字体应该如何显示?是浏览器尝试使用某些算法猜测吗?如果是这样,我是否仍然需要其他字重的字体文件?或者说,这些算法在不同的浏览器中的可靠性如何?

CSS3规范在此处考虑了这种情况,但请注意,它描述的大部分浏览器行为除了映射到附近现有字体之外并不具有规范性。 - BoltClock
3个回答

13

正如评论中@BoltClock提到的那样,这在CSS字体模块3级CR的第3.2节“字重:font-weight属性”和第5.2节“匹配字体风格”中有描述,但它并未定义所有细节,浏览器行为可能有所不同。

基本原则是使用具有给定字重的字体。对于大多数字体,仅提供正常(regular, 400)和粗体(bold, 700)字形,可能仅提供正常字形。在这种情况下,小于正常字形以及500的所有字形都会映射到正常字形,而600、800和900会映射到粗体。

如果没有粗体字形可用,但需要进行加粗(通过将font-weight设置为600或更高),浏览器可能在正常字体上使用算法合成粗体。理论上,这取决于font-synthesis属性,但它尚未实现,因此取决于浏览器。

测试页面(假设Lucida Sans Unicode可用,这是Windows中常见的字体,只有正常字形):

<!DOCTYPE html>
<title>Test</title>
<style>
* { font-family: Lucida Sans Unicode }
</style>
<p>Hello world
<p style="font-weight: 600">Hello world
<p style="font-weight: 700">Hello world
<p style="font-weight: 800">Hello world

Firefox和IE会使用合成粗体(伪粗体)来显示除第一个段落之外的其他段落,而Chrome仅以此方式显示最后两个段落,即不将600映射为粗体而是映射为正常字体。

一般来说,印刷工艺师不赞成使用合成粗体,原因充分。但对于那些笔画宽度很少或几乎没有变化的无衬线字体,如Lucida Sans Unicode或Arial Unicode MS,可能会产生可接受的结果。


2

以下是链接中的答案:

font-weight属性接受关键字或预定义数字值。可用的关键字有:

normal(普通) bold(加粗) bolder(更加粗) lighter(更加细) 可用的数字值为:

100 200 300 400 500 600 700 800 900 关键字normal映射到数字值400,bold映射到数字值700。

为了看到除400或700之外的值产生的效果,所使用的字体必须具有与指定权重匹配的内置面。

如果字体家族中有加粗(“700”)或普通(“400”)版本,则浏览器将使用该版本。如果这些版本不可用,则浏览器将模拟自己的加粗或普通字体版本。它不会模拟其他不可用的权重。字体通常使用类似“Regular”和“Light”的名称来标识任何替代字体权重。


所引用的页面既不是官方页面,也不准确。 - Jukka K. Korpela

1
如果找不到适当的字体族,浏览器基本上会猜测。而猜测意味着你将得到劣质的渲染,并在不同浏览器中得到不一致的结果。因此,如果有可能,你真的应该尽量避免这种情况发生:
参考资料:http://alistapart.com/article/say-no-to-faux-bold

不,浏览器不会猜测。它们只会执行它们被编程执行的操作,这种情况下并不涉及启发式算法。你所说的低质量和不一致的结果是正确的,但并没有回答问题。 - Jukka K. Korpela

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