【问题标题】:How do browsers change font-weight if it's not present in the current font?如果当前字体中不存在字体粗细,浏览器如何更改字体粗细?
【发布时间】:2014-07-16 08:09:51
【问题描述】:

假设我有一个具有不同字体权重的网络字体,作为每个权重的不同文件。当我在 CSS 中更改不同的权重时,我想它会查找与该字体权重相关联的相应字体文件。一切按预期工作。

现在,如果我有另一种字体,其中没有不同的字体粗细,那么我再次在样式表中设置不同的字体粗细,并在浏览器中查看字体粗细的变化。

所以,我想知道,在缺少字体粗细的情况下,如何负责计算字体的外观?浏览器会尝试使用某些算法来猜测吗?如果是这样,我还需要其他字体粗细文件吗?或者,这些算法在不同浏览器中的可靠性如何?

【问题讨论】:

  • CSS3 规范解释了这种情况here,但请注意,它描述的大部分浏览器行为除了映射到附近现有字体之外并不规范。

标签: html css algorithm browser fonts


【解决方案1】:

正如@BoltClock 在评论中提到的,这在 CSS 字体模块级别 3 CR,第 3.2 节 Font weight: the font-weight property 和 5.2 Matching font styles 中有所描述,但它没有定义所有细节,浏览器行为可能会有所不同。

基本原则是使用具有给定字体粗细的字体。对于大多数字体,只有普通(regular,400)和粗体(700)字体可用,也许只有普通字体。在这种情况下,所有小于 normal 以及 500 的字体都映射为 normal,而 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】:

    来自这个link的答案:

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

    普通粗体粗体加粗变浅可用的数值有:

    100 200 300 400 500 600 700 800 900 关键字值法线映射到 数值 400 和粗体值映射到 700。

    为了查看使用 400 或 700 以外的值的任何效果, 使用的字体必须具有与指定字体相匹配的内置字体 权重。

    如果字体具有粗体(“700”)或普通(“400”)版本作为 字体系列,浏览器将使用它。 如果这些不可用, 浏览器会模仿自己的粗体或普通字体。它 不会模仿其他不可用的权重。字体经常使用名称 像“Regular”和“Light”来识别任何替代字体粗细。

    【讨论】:

    • 引用的页面既不官方也不准确。
    【解决方案3】:

    如果没有找到合适的字体系列,浏览器基本上会猜测。猜测意味着您将获得低质量的渲染,以及跨浏览器的不一致结果。所以如果可能的话,你真的应该尽量不要让这种情况发生:

    参考:http://alistapart.com/article/say-no-to-faux-bold

    【讨论】:

    • 不,浏览器不会猜测。他们做他们被编程做的事情,在这种情况下这不涉及启发式。您所说的质量低劣和结果不一致的说法是正确的,但不能回答问题。
    猜你喜欢
    • 2015-04-19
    • 2018-05-07
    • 2021-10-18
    • 2017-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-14
    • 1970-01-01
    相关资源
    最近更新 更多