SVG @font-face在SVG中有效,但在页面中包含时无效。

35

我有一个包含某种字体的svg文件,使用@font-face语法。这个svg文件位于服务器上的/logo/logo-big-web.svg,而字体则在/font/MDN/MDN.ttf中。

当我在浏览器中打开http://www.mywebsite/logo/logo-big-web.svg时,一切都正常工作,字体正确加载,svg文件正确显示。

然而,当我尝试将svg文件嵌入到一个html文件中,例如index.html

<img src="/logo/logo-big-web.svg" ... ></img>

当我在浏览器中打开http://www.mywebsite/index.html时,字体无法正确加载,svg 显示了丑陋的默认字体。

是否有其他人遇到过这个问题?如何解决?

我知道我可以将字体作为 svg 字形嵌入到 svg 文件中,但这在 Firefox 中不起作用,并且会增加 svg 文件的文件大小,而我仍然要为网页本身加载字体(看起来很浪费)。因此,嵌入字形不是选择。对于嵌入的 data: uri,情况也是一样的。

更新:

字体在 svg 文件中指定为:

<defs>
    <style>
        @font-face {
            font-family: MDN;
            src: url("/font/MDN/MDN.ttf"); }
    </style>
</defs>

我使用它的方式如下:

<text font-family="MDN" font-size="11"> <textPath ... > ... </textPath> </text>

更新2:

我试图通过在单独的样式表中定义字体并像这样包含它来规避问题:

<?xml-stylesheet type="text/css" href="/style/slyle.css" ?>

但是这似乎有相同的问题:当我直接在浏览器中打开svg文件时,它可以工作(http://www.mywebsite/logo/logo-big-web.svg),但是当我将svg用作html img标签或作为html元素的背景时,它会出现错误。


字体URI是否在SVG内部是相对的?如果是这种情况,您应该在检查器的网络选项卡中看到404。 - RoelN
1
字体 URI 被指定为:url("/font/MDN/MDN.ttf")。如果我没记错的话应该可以工作吧? - romeovs
您可以在矢量编辑软件中将字体转换为路径。 - SeinopSys
@DJDavid98:是的,但我想把它作为最后的选择,Z计划,因为它不具有良好的可扩展性。我将会有很多标志使用相同的字体,但文本略有不同。 - romeovs
1个回答

44
根据与相关问题有关的此答案嵌入式svg图片必须是独立的图片。如上面的评论中所提到的,可以通过将所有外部资产嵌入到其中来使svg“独立”。因此,在我的情况下,我必须做这些事情之一:
  1. 使用数据uri嵌入字体src:url(“data:application / font-woff; base64,<base64编码字体在此处”)
  2. 将字体嵌入为svg字形,但我已经排除了这种方法,因为缺乏Firefox支持
  3. 在我的编辑软件中将字体转换为路径(例如Adobe Illustrator中的展开路径)。
这些方法中没有一个似乎令人满意,因为我真的很喜欢尽可能保持svg文件的轻量化。
绕过整个问题的另一个解决方案是使用html object标记而不是img标记。这样,svg被允许不仅是独立的图像,还可以使用完整的xml包含方法来包含其他资产。如上述问题中已经指出的
我选择使用object方法嵌入svg。如果我发现这样做与使用适当的img元素有根本性的区别,我会更新这个答案。

在AI中为什么要使用expand path而不是join path - Danger14
@Danger14,可能是因为我的人工智能知识不够好,这是我唯一知道的东西。你认为“连接路径”可以解决这个问题吗? - romeovs
@romeovs 这个可以运行,但是该死的现在我的页面崩溃了。 - vallentin
一个更正确的工具是使用创建轮廓,在类型菜单下。扩展工具似乎也可以为类型对象执行此操作,但它做的远不止这些(即它用于将任何对象转换为纯填充和描边,甚至将描边转换为填充)。路径连接工具在这里完全是错误的选择。它不能用于对类型对象进行任何操作。 - Elmo Allén
1
不幸的是,如果网站使用头文件“X-Frame-Options:deny”,则使用“object”、“iframe”和“embed”标签的解决方案将失败。 - Will P.
1
如果您想使用第一种解决方案(使用数据URI嵌入字体),我建议使用以下网站:https://transfonter.org(不要忘记切换“Base64编码”选项)。 - Mathieu Castets

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接