【发布时间】:2012-07-12 01:55:33
【问题描述】:
我有一个想要分发的独立 HTML 文档,没有任何外部依赖项。我在本文档中使用了一种非标准字体,只有我的一些用户会安装它。
对于那些没有安装字体的用户,我在<body> 顶部的嵌入式 SVG 文档中包含了字体的副本。 (本例我使用的是单字形字体,实际文档使用的是完整字体。)
<svg style="display: none;"><defs>
<font id="MyFontElement">
<font-face font-family="MyFont" />
<glyph unicode="A" horiz-adv-x="950" d="M0,0L0,100L100,100L100,200L0,200L0,300L100,300L100,400L200,400L200,500L300,500L300,600L400,600L600,600L600,500L700,500L700,400L800,400L800,300L900,300L900,200L800,200L800,100L900,100L900,0L600,0L600,100L700,100L700,200L800,200L800,300L100,300L100,200L200,200L200,100L300,100L300,0L0,0M300,400L600,400L600,500L300,500L300,400Z" />
</font>
</defs></svg>
SVG 字体看起来不如普通字体好,所以我只希望在本地未安装该字体的情况下使用 SVG 字体。如果字体是在外部 SVG 文档中定义的,我可以使用它的优先级低于本地安装的字体,如下所示:(fiddle)
<style>
@font-face {
font-family: "My Font";
src: local("My Font"), url("fonts.svg#MyFontElement") format("svg");
}
</style>
<p style="font: 3em 'My Font';">
Alphabet
</p>
不幸的是,当前文档中的字体似乎都没有明显的变化:(fiddle)
src: local("My Font"),
url("./#MyFontElement") format("svg"),
url("./#MyFontElement"),
url("#MyFontElement") format("svg"),
url("#MyFontElement");
即使没有@font-face 声明,该字体在文档中也已作为MyFont 可用,font-family 在<font-face /> 中指定。但是,这将在比名为MyFont 的原生字体更高的优先级下使用,因此不是解决方案。
我希望我可以将其称为local("MyFont")... (fiddle)
src: local("My Font"), /* local */
local("MyFont"); /* embedded */
...但这也不起作用。
我可以给嵌入的字体一个不同的名称并以较低的优先级使用它,style="font-family: LocalFont, EmbeddedFont",但我允许用户将 sn-ps 从本地文件导入到文档中,这些本地文件将引用该字体仅通过标准名称。导入时可以重写这些引用,但我不喜欢这种解决方案。
如何从 @font-face 声明中引用嵌入在当前文档中的 SVG 字体?
【问题讨论】:
-
读者应该知道 SVG 字体支持已从 Google Chrome 中删除,并且从未在 Mozilla Firefox 中实现。不过,Apple 似乎仍在 Safari 中维护它。
-
显然 Firefox 目前确实支持基于 SVG 的字形...嵌入在 OpenType 文件中!哎……