如何将Google Web字体嵌入SVG?


48

我在我的网站上写了一篇有关新Web技术的优势的文章,其中包括HTML5,CSS3和SVG的优势,后者的优势之一是能够在原本有效的图像中选择文本。

我是SVG的新手,刚刚在Illustrator中制作了我的第一张像样的图形。我将其嵌入到带有标签中的Ubuntu字体的GWF脚本的页面中。事实证明,Ubuntu字体可以正常文本正确显示,但是要使此技巧在SVG中起作用,必须将Google脚本嵌入到SVG本身中。我怎样才能做到这一点?


1
关于基于@import的解决方案的重要说明:它们不适用于背景图片。您必须通过base64嵌入字体,或者使用图像/对象标签。
米奇

Answers:


39

您通过使用base64编码将字体嵌入CSS。您可以使用元素在类似于CSS的SVG文档中应用样式<style />。因此,如果您有WOFF字体,则可以这样嵌入:

<style>
@font-face {
    font-family: "Sample font";
    src: url("data:application/font-woff;charset=utf-8;base64,...");
}
</style>

...base64编码的字体数据在哪里。

您可以通过查看Typekit的样式表找到示例。我不确定的mime类型font/woff是否正确,因为我也看到人们声称它应该是application/font-woff。虽然font/wofffont/truetypefont/opentype等似乎更受欢迎。

或者,您实际上可以采用Web字体的SVG版本,并将SVG字体的描述标记嵌入文档中(尽管Luke在评论中指出,浏览器支持仍然非常有限)。

但是,您还应该能够根据SVG规范链接到外部字体。如果您将有多个引用该字体的SVG文档,那么这似乎是最佳解决方案。


2
.woff的正确MIME类型现在是application/font-woffstackoverflow.com/a/5142316/90674
sshow 2013年

3
关于“您实际上可以获取Web字体的SVG版本并将SVG字体的描述标记嵌入到文档中”,您应该意识到“当前仅Safari和Android浏览器支持SVG字体。” 见developer.mozilla.org/en-US/docs/Web/SVG/Tutorial/SVG_fonts(也caniuse.com/#feat=svg-fonts
卢克

1
这个线程有很大帮​​助,但是问题就变成了如何将字体转换为base64。这个网站transfonter.org起到了很大作用,并且允许人们只选择要转换的字体的一个子集,以减小文件大小。
Fabien Snauwaert '16

这个答案看起来很诱人,但最终我发现这些步骤更简单,因此我分享了它们:graphicdesign.stackexchange.com/a/124900/45239
Ryan

当我在Adobe illustrator中打开该svg时,未加载字体。有什么帮助吗?
Aamir Nakhwa

13

<defs>像这样的部分

<defs>
  <style type="text/css">@import url(http://fonts.googleapis.com/css?family=Indie+Flower);</style>
</defs>

作品。


13
在当前(2016年2月)的Web浏览器中,此功能仅在单机加载SVG文件时有效。有关示例,请参见marians.github.io/test-webfonts-in-svg/test.svg。在HTML页面中打开相同的SVG,不会加载/渲染字体。以marians.github.io/test-webfonts-in-svg为例。
玛丽安

1
独立的SVG和HTML页面在Chrome版本73.0.3683.103(正式版本)(64位)中似乎都可以正常工作。
Paul Grime

当我在浏览器上打开svg时,它正在加载字体,但是当我在Adobe Illustrator中打开相同的svg文件时,它不在加载字体。有什么帮助吗?
Aamir Nakhwa

3

您可以使用Nano直接将Google Web字体嵌入到SVG中。它会自动扫描SVG并有选择地仅嵌入所需的字体,以确保您的Ubuntu字体在所有现代浏览器上看起来都一样。就我而言,我需要将Roboto嵌入到我的SVG中:

在此处输入图片说明

免责声明:我和Nano背后的团队在一起,我们也遇到了以前相同的问题,因此决定通过构建Nano来解决自己的问题。希望这会有所帮助!

编辑:这是有关幕后发生情况的快速说明:

要将字体嵌入SVG中,您首先必须知道使用了哪些字体系列。然后,您需要找到这些字体文件并下载。下载后,您必须将常规,粗体,斜体和粗体斜体转换为基于64的编码。如果您手动进行操作,则要了解大量文件,要知道哪个文件使用粗体,而哪些文件不使用粗体,则需要进行大量工作。然后,您必须将所有4个base 64编码的字符串复制到SVG中。

这就是为什么我们构建Nano并确保其自动扫描SVG并仅插入所使用的字体的原因。例如,如果不使用粗体或不存在任何文本,则不会嵌入任何字体。您需要做的就是将SVG拖放到Nano中,它就像一个魅力!您可以在此处了解更多信息:https : //vecta.io/blog/making-svg-easier-to-use


好,看起来不错。不幸的是,现在上传到一个很高兴接受SVG的Wordpress网站将不会“对不起,出于安全原因,不允许使用此文件类型。” -我需要回想一下才能完成这项工作?
克里斯·平克

1

这可能过于简化,但是您是否考虑过从Google以zip文件格式下载字体,然后让Illustrator根据需要将其转换为SVG文件输出?

这只是理论上的,因为我还没有尝试过,但是理论上似乎是可行的。


0

<desc>标签后添加以下内容

<defs>
<style type="text/css">@import url('http://fonts.googleapis.com/css?family=Lobster|Fontdiner+Swanky|Crafty+Girls|Pacifico|Satisfy|Gloria+Hallelujah|Bangers|Audiowide|Sacramento');</style>
</defs>

为什么要包含这么多的Google字体?它甚至不是全部,也不是我看到的最多的,并且会增加SVG的整体重量。
MrMesees

当我在浏览器上打开svg时,它正在加载字体,但是当我在Adobe Illustrator中打开相同的svg文件时,它不在加载字体。有什么帮助吗?
Aamir Nakhwa

0

更新我的答案。我现在在此页面上更喜欢使用Nano的其他答案:https : //graphicdesign.stackexchange.com/a/121950/45239

假设您已经在系统上下载并安装了Web字体并创建了SVG(也许使用了与我在下面介绍的许多步骤相同的步骤,但未选择“字体:转换为轮廓”),则可以将SVG上传到Nano并查看“嵌入字体:是”选项,然后单击“下载”。

我以前的回答:

如果您愿意牺牲可选择的文字和SEO:

  1. 下载网络字体。
  2. 在本地安装。
  3. 打开Adobe Illustrator
  4. 输入您的文字。
  5. 文件>导出>导出为...
  6. 选择“ .SVG”
  7. 选择以下设置:

    • 样式:内联样式
    • 字体:转换为轮廓
    • 图片:保留
    • 对象ID:层名称
    • 小数:2
    • (启用)缩小
    • (启用)响应式
  8. (可选)将生成的svg上传到https://vecta.io/nano(它能够将文件大小减少8.2%)


不幸的是,对于较小的文本,“转换为轮廓”不是一个很好的选择。
克里斯·平克

@ChrisPink,是的,您是对的!,如果发现字体较小的其他选择,请分享
超级模特

1
@SuperModel我使用Nano取得了巨大的成功,字体从随附的文档中挑选了样式。我的第一次尝试失败了,但是在Nano团队的帮助下,我们确定了确保SVG标头保持完整的情况。
克里斯·平克
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.