@font-face 不适用于斜体/粗体字体

Posted

技术标签:

【中文标题】@font-face 不适用于斜体/粗体字体【英文标题】:@font-face does not work properly for italic/bold fonts 【发布时间】:2014-07-07 01:03:37 【问题描述】:

我正在使用一个自动生成CSS的工具,它会生成以下@font-face标签和对应的段落样式

@font-face 
    font-family:FF-Garamond-Italic;
    src:url("../fonts/16309_GARAIT (1).ttf");
    font-style:italic;


p.autoParaStyle3 
    font-family:FF-Garamond-Italic;
    font-size:32px;
    line-height:40px;
    color:#000;
    text-align:justify;

注意,指定的字体已经是 Garamond 字体的斜体版本,从技术上讲,font-style:italic 行是多余的。

但是,按原样,这不起作用(我在 FF、Chrome 和 Safari 中尝试过),最终改用默认系统字体。如果我手动删除 font-style:italic 行,则文本会按预期以 Garamond 斜体字体正确呈现。

所以,我有两个问题

    为什么这不起作用,这意味着为什么拥有font-style:italic 会导致它不起作用?

    有没有办法通过javascript“覆盖”@font-face 定义以使用font-style:normal? 我问的原因是我无法控制生成上述 CSS 的工具,因此无法触摸该文件。 此外,我尝试在 javascript 中创建一个具有相同名称的新 @font-face,但我不想在 index.html 中再次指定“src”,因为该文件和 css 文件被进一步操作成不同的位置 - 所以我希望“src”仅与 css 文件相关,并从那里挑选。

提前致谢!

【问题讨论】:

这是首选@font-face 设置的便捷指南:fontspring.com/support/installing_webfonts/style-linking 看看它是否对您有帮助。我会避免让 JS 参与其中。 【参考方案1】:

对于使用Create React App 的用户,font-face 可能会根据入口点给出不同的结果。这是我注意到的:

    如果您选择将css 文件直接链接到您的public/index.html,那么您可以将font-face 通常与一个font-family 和不同的font-style 一起使用:
@font-face 
  font-family: "FontName"; <---
  font-style: normal; <---
  font-weight: normal;
  src: url("path-to-assets/fonts/FontName.ttf") format("truetype");

@font-face 
  font-family: "FontName"; <---
  font-style: italic; <---
  font-weight: normal;
  src: url("path-to-assets/fonts/FontName-Italic.ttf") format("truetype");


/* Usage */
.text 
  font-family: FontName;
  font-style: normal;

.text-italic 
  font-family: FontName;
  font-style: italic;

    如果您选择通过 Js 链接 css 文件进行捆绑,那么您需要为所有 italic 字体设置不同的 font-family,并使用普通的 font-style
@font-face 
  font-family: "FontName"; <---
  font-style: normal; <---
  font-weight: normal; /* normal | 300 | 400 | 600 | bold | etc */
  src: url("path-to-assets/fonts/FontName.ttf") format("truetype");

@font-face 
  font-family: "FontNameItalic";
  font-style: normal; <----
  font-weight: normal; /* normal | 300 | 400 | 600 | bold | etc */
  src: url("path-to-assets/fonts/FontName-Italic.ttf") format("truetype");


/* Usage */
.text 
  font-family: FontName;

.text-italic 
  font-family: FontNameItalic;

【讨论】:

【参考方案2】:

设置font-style:italic 不是多余的。它指定字体是斜体,这意味着当元素的字体设置为斜体时,它将被视为匹配,因为它是默认设置的,例如对于icite 元素。

因此,问题 1 的答案是 p 元素默认为它声明了常规(普通)字体,因此将使用常规字体(此处为浏览器的默认字体)。

要解决此问题,请将font-style: italic 添加到p.autoParaStyle3 的规则中。

问题 2 的答案是这取决于 @font-face 规则在 DOM 中的位置。例如,如果它位于 style 元素中,您可以使用 JavaScript 修改该元素的内容。不过,你不应该问这个问题。

(将整个段落以斜体显示在印刷上是有问题的。您可能解决了错误的问题。)

【讨论】:

以上是关于@font-face 不适用于斜体/粗体字体的主要内容,如果未能解决你的问题,请参考以下文章

为啥不在@font-face, Font Squirrel 中定义字体粗细或字体样式?

@font-face 不适用于特定字体

@ font-face 引入本地字体文件

使用@font-face 定义小型大写字体变体

斜体字体不适用于 XCode

Google Chrome 中的粗体字体模糊(@Font-Face)