如何为同一字体添加多个字体文件?


454

我正在寻找@ font-face CSS规则MDC页面,但我一无所获。我分别使用粗体斜体粗体+斜体文件。如何将所有三个文件嵌入一条@font-face规则?例如,如果我有:

@font-face {
    font-family: "DejaVu Sans";
    src: url("./fonts/DejaVuSans.ttf") format("ttf");
}
strong {
    font-family: "DejaVu Sans";
    font-weight: bold;
}

浏览器将不知道用于粗体显示的字体(因为该文件是DejaVuSansBold.ttf),因此它将默认为我可能不需要的字体。我如何才能告诉浏览器某种字体的所有不同变体?


作为对问题的扩展,如果我们在TinyMCE之类的WYSIWYG编辑器中使用这些字体,是否仍需要粗体斜体字?尽管TinyMCE拥有执行粗体斜体的按钮功能?我猜答案是肯定的-因为它们在内部查找这些文件?
Nishant

Answers:


749

解决方案似乎是添加多个@font-face规则,例如:

@font-face {
    font-family: "DejaVu Sans";
    src: url("fonts/DejaVuSans.ttf");
}
@font-face {
    font-family: "DejaVu Sans";
    src: url("fonts/DejaVuSans-Bold.ttf");
    font-weight: bold;
}
@font-face {
    font-family: "DejaVu Sans";
    src: url("fonts/DejaVuSans-Oblique.ttf");
    font-style: italic, oblique;
}
@font-face {
    font-family: "DejaVu Sans";
    src: url("fonts/DejaVuSans-BoldOblique.ttf");
    font-weight: bold;
    font-style: italic, oblique;
}

顺便说一句,似乎Google Chrome浏览器不知道该format("ttf")参数,因此您可能希望略过。

(此答案对于CSS 2规范是正确的。CSS3仅允许一种字体样式,而不允许使用逗号分隔的列表。)


130
顺序很重要,大胆/斜体样式必须排在最后。
2010年

8
值得一提的是,即使您使用EOT,这在IE8(及更低版本)中也不起作用。IE会下载替代字体,但不会使用它,而是会伪造/斜体显示常规字体。此外,Chrome 11似乎无法渲染粗体和斜体的字体
JaffaTheCake 2011年

2
此示例非常适合确实具有单独的TTF文件(粗体和斜体)的字体。但是,如果整个字体位于一个.ttf文件中,并且您想使用粗体怎么办?

2
这篇文章 很好地解释了为什么它起作用。关键摘录:“请注意,font-family属性对于所有四种字体都是相同的名称。此外,font-style和font-weight与字体是匹配的。注意:正常粗细必须在列表的顶部!我们没有发现那之后的顺序很重要。”
JD史密斯

13
我在嵌入式浏览器Android 4.4上遇到了麻烦。font-style: italic, oblique;最终更改为font-style: italic;似乎可以解决所有问题。
哈维2014年

59

从CSS3开始,规范已更改,仅允许使用单个font-style。逗号分隔的列表(按CSS2)将被视为,normal并且会覆盖任何较早的(默认)条目。这将使以这种方式定义的字体永久显示为斜体。

@font-face {
    font-family: "DejaVu Sans";
    src: url("fonts/DejaVuSans.ttf");
}
@font-face {
    font-family: "DejaVu Sans";
    src: url("fonts/DejaVuSans-Bold.ttf");
    font-weight: bold;
}
@font-face {
    font-family: "DejaVu Sans";
    src: url("fonts/DejaVuSans-Oblique.ttf");
    font-style: italic;
}
@font-face {
    font-family: "DejaVu Sans";
    src: url("fonts/DejaVuSans-BoldOblique.ttf");
    font-weight: bold;
    font-style: italic;
}
@font-face {
    font-family: "DejaVu Sans";
    src: url("fonts/DejaVuSans-Oblique.ttf");
    font-style: oblique;
}
@font-face {
    font-family: "DejaVu Sans";
    src: url("fonts/DejaVuSans-BoldOblique.ttf");
    font-weight: bold;
    font-style: oblique;
}

在大多数情况下,斜体可能就足够了,如果您谨慎定义要使用并坚持使用的斜体,则不需要斜线规则。


我相信第三和第四种字体的名称错误,应该使用“斜体”而不是“斜体”。
弥敦道·美林

3
@NathanMerrill,如OP:I have separate files for bold, italic and bold + italic-因此存在三个不同的文件。该答案纠正了已被接受的font-style: italic, oblique;不再有效的答案,而且该答案对斜体和斜体使用了相同的文件。不过,值得指出的是,文件在两种情况下是共享的。
2015年

18

为了使字体变体正常工作,我必须反转CSS中@ font-face的顺序。

@font-face {
    font-family: "DejaVuMono";
    src: url("styles/DejaVuSansMono-BoldOblique.ttf");
    font-weight: bold;
    font-style: italic, oblique;
}   
@font-face {
    font-family: "DejaVuMono";
    src: url("styles/DejaVuSansMono-Oblique.ttf");
    font-style: italic, oblique;
}
@font-face {
    font-family: "DejaVuMono";
    src: url("styles/DejaVuSansMono-Bold.ttf");
    font-weight: bold;
}
 @font-face {
    font-family: "DejaVuMono";
    src: url("styles/DejaVuSansMono.ttf");
}

很有用。+1
Polywhirl先生19年

“逆序”是什么意思?
Nyxynyx

15

如今,2017-12-17。我没有在spec中找到有关Font-property-order的必要性的任何描述。而且无论测试顺序如何,我都可以使用chrome测试。

@font-face {
  font-family: 'Font Awesome 5 Free';
  font-weight: 900;
  src: url('#{$fa-font-path}/fa-solid-900.eot');
  src: url('#{$fa-font-path}/fa-solid-900.eot?#iefix') format('embedded-opentype'),
  url('#{$fa-font-path}/fa-solid-900.woff2') format('woff2'),
  url('#{$fa-font-path}/fa-solid-900.woff') format('woff'),
  url('#{$fa-font-path}/fa-solid-900.ttf') format('truetype'),
  url('#{$fa-font-path}/fa-solid-900.svg#fontawesome') format('svg');
}

@font-face {
  font-family: 'Font Awesome 5 Free';
  font-weight: 400;
  src: url('#{$fa-font-path}/fa-regular-400.eot');
  src: url('#{$fa-font-path}/fa-regular-400.eot?#iefix') format('embedded-opentype'),
  url('#{$fa-font-path}/fa-regular-400.woff2') format('woff2'),
  url('#{$fa-font-path}/fa-regular-400.woff') format('woff'),
  url('#{$fa-font-path}/fa-regular-400.ttf') format('truetype'),
  url('#{$fa-font-path}/fa-regular-400.svg#fontawesome') format('svg');
}

13

如果您使用的是Google字体,建议您采取以下措施。

如果要从本地主机或服务器运行字体,则需要下载文件。

与其在下载链接中下载ttf软件包,不如使用它们提供的实时链接,例如:

http://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,600,300italic,400italic,600italic

将URL粘贴到浏览器中,您将获得类似于第一个答案的字体声明。

打开提供的URL,下载并重命名文件。

将更新的字体声明与相对路径粘贴到CSS中的woff文件,即可完成。


3
/*
# +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# dejavu sans
# +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
*/
/*default version*/
@font-face {
    font-family: 'DejaVu Sans';
    src: url('dejavu/DejaVuSans.ttf'); /* IE9 Compat Modes */
    src: 
        local('DejaVu Sans'),
        local('DejaVu-Sans'), /* Duplicated name with hyphen */
        url('dejavu/DejaVuSans.ttf') 
        format('truetype');
}
/*bold version*/
@font-face {
    font-family: 'DejaVu Sans';
    src: url('dejavu/DejaVuSans-Bold.ttf'); 
    src: 
        local('DejaVu Sans'),
        local('DejaVu-Sans'),
        url('dejavu/DejaVuSans-Bold.ttf') 
        format('truetype');
    font-weight: bold;
}
/*italic version*/
@font-face {
    font-family: 'DejaVu Sans';
    src: url('dejavu/DejaVuSans-Oblique.ttf'); 
    src: 
        local('DejaVu Sans'),
        local('DejaVu-Sans'),
        url('dejavu/DejaVuSans-Oblique.ttf') 
        format('truetype');
    font-style: italic;
}
/*bold italic version*/
@font-face {
    font-family: 'DejaVu Sans';
    src: url('dejavu/DejaVuSans-BoldOblique.ttf'); 
    src: 
        local('DejaVu Sans'),
        local('DejaVu-Sans'),
        url('dejavu/DejaVuSans-BoldOblique.ttf') 
        format('truetype');
    font-weight: bold;
    font-style: italic;
}

1

不要忘记,对于大胆的变体,它是font-weight;对于斜体,它是font-style


与问题并没有太大关系@font-face,因此,我正尝试拒绝这个答案(但我不能,我没有足够的声誉)
FryingggPannn

是的,这不是问题的答案,而是应用答案时要记住的一件好事。问题是答案的评论部分已经有很多内容,因此此技巧将被掩埋
Ooker

好吧,然后我不知道
FryingggPannn
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.