我希望你用你最好的 Seinfeld 的语气大声读出这个标题。
我们论坛中一个 最近的问题 使我意识到,除了通常的 font-family
和 src
之外,还可以向 @font-face
添加更多属性。这些属性有什么用?为什么要在那里声明其他字体声明?
我习惯于这样写 @font-face
@font-face {
font-family: "My Custom Font";
src: url("path/to-font-file.woff2");
}
但是 规范 确实包含更多描述符
@font-face {
font-family: <family-name>;
src: <url>;
unicode-range: <urange>;
font-variant: normal | [ <east-asian-variant-values> || <east-asian-width-values> || ruby ];
font-feature-settings: normal | <feature-tag-value>;
font-stretch: normal | ultra-condensed | extra-condensed | condensed | semi-condensed | semi-expanded | expanded | extra-expanded | ultra-expanded;
font-weight: normal | bold | bolder | lighter | 100 | 200 | 300 | 400 | 500 | 600 | 700 | 800 | 900;
font-style: normal | italic | oblique;
}
在查看字体服务生成的 @font-face 代码时,你会经常看到这一点。
它们是守门员!
这是一个你可以用来思考 @font-face 声明块的类比。如果字体通过了守门员,它将被下载并使用。
font-family 是显而易见的。您正在声明一个新的字体系列以供使用,因此任何想要使用此字体的元素都需要具有匹配的字体系列。
@font-face {
/* Gatekeeper: font-family on another element must match this to be used. */
font-family: 'Open Sans';
src: url(my-font.woff2) format('woff2');
}
body {
/* Match! */
font-family: 'Open Sans';
}
h1, h2 {
/* No match */
font-family: 'Different Font';
}
它们(大多)都是守门员
除了 font-variant
和 font-feature-settings
之外,所有属性都可以用作过滤器,在值匹配时指示浏览器下载和使用字体文件。
@font-face {
/* Only download and use if element matches this font-family */
font-family: 'My Font';
/* Only download and use if element matches this font-style */
font-style: italic;
/* Only download and use if element matches this font-weight */
font-weight: 700;
src: url(my-bold-and-italic-font.woff2) format('woff2');
/* Only download and use if these characters are used */
unicode-range: U+0460-052F, U+20B4, U+2DE0-2DFF, U+A640-A69F;
}
也许图表解释会更有帮助

类似于抽象类…
有趣,我知道
font-weight
和font-style
,但不知道unicode-range
。很高兴了解它。是时候优化了!谢谢 Geoff。帮了我的忙!
伙计。我从未这样想过。所以只有在匹配时才会下载?我得试试这个。谢谢!
看起来这将节省一些带宽!
我的评论在这里。我很酷,因为我一直只使用终端字体
我以前从未从这个角度看待过它,当然也不知道它会影响字体的加载。很高兴知道,谢谢。
我经常使用字体属性,所以我很惊讶你没有提到更明显的方面:它只是允许你使用相同的
font-family
声明访问同一字体的不同font-weight
和font-style
(我认为这应该是字体在 CSS 中的预期用法)。因此,无需在 CSS 的“font-family”属性中替换整个字体堆栈,我只需将
font-weight
更改为bold
并继续使用相同的font-family
即可。它还有助于避免许多神秘的字体名称,例如“MyFontBld”和“MyFontBldCnIt”。我也有点这样认为。但是,在测试过程中,浏览器似乎无法为缺少正确样式字形的字体设置样式。例如,您可以在
@font-face
中设置font-style: italic;
,但如果字体文件缺少斜体字符,则该样式不会级联到元素:http://codepen.io/team/css-tricks/pen/YqVeEr即使使用正确的样式,系统文件也是如此:http://codepen.io/team/css-tricks/pen/wGdyNN
@Geoff,我理解的是,在
@font-face
声明中,font-weight
和font-style
不会设置任何页面样式;相反,它们将字体文件与特定样式关联。本质上,它表示“这是普通粗细、常规字体。这是普通粗细、斜体字体。这是粗体、常规字体”等等。因此,每当元素(例如,
<em>
)需要特定显示类型时,浏览器就会说“哦,你需要斜体?好的,这是我应该为此使用的文件”。当我向
h1
的声明中添加font-style: italic
行时,你的第一个示例就可以工作了——因为该元素现在需要粗体斜体字体,所以它显示了正确的字体文件:http://codepen.io/smcginnis/pen/eZGZvP?editors=1100(抱歉颜色发生了变化,顺便说一句,红色伤眼)。在你的第二个示例中,名称Arial与任何字体文件都没有关联,因此
@font-face
块实际上没有做任何事情。在@font-face
块中,font-family
属性的行为与选择器块中的行为不同;在这里,它不是设置字体,而仅仅是说“当请求此字体名称时,请在此处查找字体文件”。如果你添加src: local("Arial");
* 行,它将对任何请求斜体的子元素起作用。http://codepen.io/smcginnis/pen/EKwKoz?editors=1100重新阅读这篇文章,我感觉你可能已经知道了,也许你只是不确定 Nils 想要表达什么。但我认为无论如何都值得评论一下,以防其他人需要这些信息。
* 我实际上在我的分支中将其更改为 Georgia,这样你就可以看到,即使
h1
使用 Arial 渲染(它所请求的),但它内部的em
使用@font-face
块告诉它用于 Arial 700 斜体的实际字体文件渲染。我还必须从两个分支中删除 CSS 重置,因为它弄乱了元素的默认粗细和样式。是的,我们完全在同一页面上,伙计。:)
为了更好的编码和更好的阅读,我认为使用相同的字体名称并使用不同的字体样式和字体粗细效果更好。
所以,
我说的编码是指将 CSS 视为编码。我感觉像在编码…