假设您使用自定义字体设计了一些东西,而且设计稍微有点花哨。 也许某个单词的位置位于另一个单词下方升部之间。 某些文本的字距调整到与同一个单词的宽度相匹配。
我们可能会告诉从印刷转向网页的平面设计师避免这种做法。 它过于讲究。 太多难以调整、不可缩放的绝对定位。 来自不同字体渲染行为的风险太大。
但使用内联 SVG,我们可以做到,而且可以做得很好。
SVG <text>
这里最大的“技巧”是 SVG 有一个 <text>
元素,它正是文本。 不是文本的轮廓,只是普通的可选择、无障碍的网页文本。
<svg xmlns="http://www.w3.org/2000/svg"
width="800px" height="300px" viewBox="0 0 800 300">
<text x="25" y="55"
font-family="'Lucida Grande', sans-serif"
font-size="32">
Regular ol' text here. Hi.
</text>
</svg>
<text> 很乐意使用自定义字体
在您的网站上使用 @font-face
和自定义字体? 没问题。 该 SVG 很乐意使用它们。 这适用于内联 SVG,您可以在其中使用 CSS 设置 font-family
<text class="hook">Some Cool Text Yeah.</text>
.hook {
font-family: "proxima-nova", sans-serif;
}
但它甚至适用于 SVG 作为 <img>(或 background-image
,大概)也是如此,只要 font-family 引用了正确名称的自定义字体即可。
<text x="25" y="55"
font-family="'proxima-nova', sans-serif"
font-size="32">
使用设计软件
我还没有测试过很多不同的软件,但 Adobe Illustrator 可以“另存为”SVG。 当您使用文本元素进行设计时,您会在 .svg 文件中获得 <text>
。

您可能需要进行一些手动调整才能删除或调整字体属性/样式。
这样做的好处是它消除了使用 CSS 进行定位的繁琐任务,并允许您直接在擅长此任务的软件中进行操作。 然后,实际定位将通过该矩阵转换来完成。
完美缩放
如果您尝试仅使用 HTML/CSS 复制这样的设计,不仅定位会很麻烦,而且它也不可缩放。 像 font-size: 41px; top: 37px; left: 81px;
这样的代码仅在一种大小下有效。 也许您可以使用 vw
单位和百分比等来进行操作,但这在 SVG 中要容易得多。
在 SVG 中,您设置的字体大小是相对于 SVG 本身的大小,而不是整个文档的大小。 因此,如果您调整 SVG 的大小(它可以很容易地是流体宽度),您的排版设计将保持完好无损。
流体宽度的一种设置
<div class="ad-wrapper">
<svg class="ad">
<text ... />
<text ... />
<text ... />
</svg>
</div>
/*div*/.ad-wrapper {
height: 0;
padding-top: 100%;
position: relative;
}
/*svg*/.ad {
position: absolute;
width: 100%;
height: 100%;
top: 0;
left: 0;
}

使用您在网络上拥有的字体进行设计
如果您可以在本地软件中使用您也通过 @font-face 可用的字体进行操作,那么此工作流程最有效。 例如,如果您使用 Open Sans,您可以从 Font Squirrel 下载桌面版副本,然后通过 Google Fonts 在网络上使用它。
我认为 Typekit 的 桌面同步功能 使此工作流程非常不错。 当您选择字体时,您可以将它们添加到套件中以在网络上使用,并通过 Creative Cloud 工具在本地同步。

然后它们将在 Illustrator 中可用。

它有点奇怪,因为 font-family 名称会略有不同。 例如,您可能会从 Illustrator 中获得以下内容
<text font-family="'MarketOT'">Example</text>
但在网络上,它需要像这样
<text font-family="ff-market-web, cursive">Example</text>
但嘿,这只是工作的一部分。 也许有充分的理由这样做。 也许有一天他们可以同步这些东西。
何时使用
如果您在网站上的其他地方使用相同的自定义字体,那么这是一个明智之举,您可以根据需要使用 <text>
驱动的设计。 如果使用的字体没有在其他地方使用,那么只为一个图形包含整个自定义字体可能是一项艰巨的任务。 或者也许不是。 您需要自己权衡利弊。
在我的示例中,我使用了来自 Typekit 的 Proxima Nova 和 FF Market,该套件大小约为 115K。 如果网站的其他部分也使用这些字体,那么这并不算太糟糕。 但随后我将示例转换为轮廓(这意味着 <text>
已移除,并改用 <path>
来绘制字母形状),文件大小从令人难以置信的 4K 膨胀到令人难以置信的 260K(大于整个字体,尽管已解压缩)。
我确信在某些情况下,轮廓是有意义的,有时甚至视网膜光栅图形也能正常工作,假设您采取了所有必要的无障碍步骤(至少要有一个好的 alt
标签)。
演示
这是一个演示,展示了所有功能,包括缩放、可选择性和自定义字体。
查看 CodePen 上 Chris Coyier (@chriscoyier) 的 带有 <text> 元素的 SVG 示例。
我使用内联 SVG 作为我的徽标,以及将网站名称转换为轮廓。 我们是否需要考虑任何特殊支持问题? 或者我们可以继续进行并用 SVG
text
替换轮廓?哇! 关于我忽略的重要内容的精彩文章。 我一直都在使用轮廓,因为当我在浏览器中打开来自桌面的 .svg 时,文本显示为浏览器的默认字体。
这可以真正减少包含大量文本的图形的文件大小。 假设实验:想象一个低透明度的背景图形,用于代表计算机代码、报纸印刷、手写等。 作为轮廓文本,.svg 文件可能非常大,但作为文本,它的大小将可控。
它还使编辑 .svg 图形变得更加容易(想想一个宣传定期活动的图形——只需进入 .svg 并更改日期即可)。
是否有人知道**内联 .svg 文本是否具有 SEO 影响**? 搜索算法是否将其视为文本-文本(常规内容),还是像忽略轮廓文本一样忽略它?
谢谢!
我在您的 CodePen 中尝试了一下,发现如果您删除了围绕它的 div,SVG 部分就会显示出来。 是否有人知道这是为什么?
嘿 Karl,您是否找到了有关此问题的 SEO 影响的信息? 我也对此很感兴趣。
http://www.joningram.co.uk/article/svg-search-engine-friendly-accessible/
Iskael 提供了一个很好的链接,似乎暗示 Google 会索引 .svg 标签内部的内容:但这并非确凿的证据。 我希望 Google 能在这方面提供一些直接的指导。
我注意到你的大部分行内 SVG 示例在 Firefox 中都不起作用(SVG 部分完全没有显示),这很奇怪,因为它应该完全支持它。
我在您的 CodePen 中尝试了一下,发现如果您删除了围绕它的 div,SVG 部分就会显示出来。 是否有人知道这是为什么?
我在 Twitter 上听到有人说这个,结果是因为 div 具有“ad”的类名,而广告拦截器阻止了它的显示。
这让我很想在我的所有网站上都加上
<html class="ad">
。是的,Adblock 很蠢。我曾经花了几个月的时间来理解为什么我的自定义字体在我网站上没有显示。问题:Adblock 阻止了它,因为它被命名为“Reklame”。真是太糟糕了!
Reklame ≈ Reclame 来自西班牙语动词“Reclamar”。
Reclamar 的意思是“要求”。“要求”当然可以与广告联系起来,而且不止一种方式。
我实际上认为 AdBlocker 非常聪明,诚然,有时太聪明了。
有人知道如何在 Inkscape 中实现这个吗?经过快速测试,似乎 Inkscape 将文本元素保存在标签内
哈哈,当然会是这种愚蠢的事情。
(有些网站会友好地提醒用户他们的广告并不具有侵入性,并要求用户在 Adblock 中将其列入白名单,这可能是一个好主意。由于网络现状,我绝对不会完全卸载 Adblock,我相信很多人都和我一样。)
Reklame 实际上是德语中的广告。
html class="ad"
似乎没有作用(通过 Firebug)。仅供参考 - Google Fonts 还允许你下载本地副本,因此,如果这是你选择的网络字体供应商,则无需转到其他地方获取本地设计副本。另外,如果使用一次性字体存在问题,Google 有一项测试版功能可以让你将列表缩减到仅几个字形 - https://developers.google.com/fonts/docs/getting_started#Optimizing_Requests。
真的很棒。
有人知道如何在 Inkscape 中实现这个吗?经过快速测试,似乎 Inkscape 将文本元素保存在标签内。
你说的“将文本元素保存在标签内”一定是指
<tspan>
。Inkscape 希望所有文本对象都被此标签包裹,主要用于多行文本,SVG 对于单行或单格式文本元素不需要这样做。要生成类似于 Chris 示例的内容,你必须在
<tspan>
标签中维护 Inkscape 生成的 x 和 y 值,否则文本将消失(需要深入研究这一点)。另一个关于<tspan>
的问题是它不会根据其父级 div(在本例中为 .col)按比例缩放。为了实现可伸缩性,我将这些 xy 值复制到
<text>
标签中,并删除了包裹文本的<tspan>
,在其中添加了一个类,并将样式复制到该类名的样式表中,它可以工作!HTML
CSS
@Jimmy
如果只有那么简单。我刚刚测试了一下,Inkscape 使用自定义元素来表示文本,以便允许自动文本换行。即使你使用“另存为…”、“纯 SVG”选项,你仍然会得到所有这些不属于标准 SVG 规范的元素(它们是实验性规范,已被放弃),并且浏览器不会呈现这些元素。
对于 @hannenz 和所有遇到此问题的人,以下是如何将你的 Inkscape 流式文本转换为标准 SVG 文本元素的解决方案
选择每个文本块,然后在“文本”菜单中使用“转换为文本”将定位锁定为纯 SVG
<text>
和<tspan>
元素。将文件保存为“纯 SVG”。
在文本编辑器中打开文件,并删除所有额外的 Inkscape 杂项(
<flowRoot>
和</flowRoot>
之间的所有内容)。在 Inkscape 手册 中,你可以了解更多关于不同类型的文本元素以及如何创建它们的信息(因此,如果你只使用绝对定位的单行文本块,你可以跳过创建流式元素)。
你现在才发现这个吗?SVG 已经成为 W3C 标准超过十年了,为什么你之前没有使用 SVG 呢?
你是否意识到,由于不愿意学习和学习(太难了),你浪费了超过十年的工作时间?你依赖于他人来决定你做什么以及何时做,这并不令人钦佩。
嘿,James。你今天感觉怎么样,伙计?确保你睡得足够!
James,没有人声称 Chris 是这个领域的专家,也没有人声称他对前端了如指掌。他非常擅长撰写关于 CSS、HTML 和前端开发的文章,这也是他的博客如此受欢迎的原因,即使他只是在学习和发现旧事物。
“SVG 已经成为 W3C 标准超过十年了”。
但是,IE8 支持的缺乏以及 Web 开发社区对 .svg 的理解以及 .svg 图库艺术的可用性,一直限制着它的使用。博客文章的目的是帮助理解 .svg 并鼓励采用它。目前正在创建的新网站上相当一部分网络图像因为是 .jpg 或 .png,所以尺寸太大,分辨率太低。虽然我赞赏你,James,立即采用并理解所有 W3C 标准,但我们这些凡人有时需要赶上进度。
看起来 James 今天早上喝了大量的“黑心饮料™”。
除了 .svg 在各种浏览器中存在的问题外,创建 .svg 作品并不容易,它需要对 Illustrator、Inkscape 或等效软件的基本理解,这与 Photoshop 或几乎所有其他标准的位图程序大不相同。
考虑到 SVG 直到 IE9 版本才被整合到 IE 中(这还不包括那些即使 IE 达到 10 版本也未升级 IE8 的人),开发人员使用 W3C 标准的动机是什么?因为 80%+ 的人无法在不下载插件的情况下看到它。(想要让一般的互联网用户下载并安装浏览器插件,祝你好运。)IE9(最终支持 SVG)直到 2011 年才发布……所以除了试用和吹嘘之外,使用 SVG 有什么意义呢?
你的尖酸刻薄的评论对讨论毫无帮助。我们来这里是为了学习(亡羊补牢为时不晚)。请尊重这一点,或者找到其他地方散布你的消极情绪。
排版挑剔
来自你文章的开篇段落
文本不会“缩进”。文本会间距。字距调整是一种非常特殊的间距,它只适用于字母对,其中自然间距看起来不对劲。例如,在字母 A 和 V 之间。有时,字母对的特征会导致它们之间的间距看起来太多或太少。字距调整用于校正两个特定字母之间的视觉问题。
但这与对一个词或短语中的所有字母进行间距不同。那只是间距。
程序员经常弄错这一点。实际上,我目前正在进行一个使用 ImageMagick 的项目。它有一个用于字母间距的功能。但它称之为字距调整。CSS 实际上用“letter-spacing”属性做对了这件事。
还有一个,完全不相关
你的标题中的单引号看起来完全像是重音符 (`),属于像 è 这样的字母上,而不是单引号 (’ 和 ’)。
也许你没有注意到,也许你不在乎……它看起来太奇怪了。
根据 Dominic 对反引号文本的评论,我猜这就是 Twitter 链接按钮在 Chrome/OSX 中不起作用的原因。(我还是发了推文)。 ;-)
实际上,一组字母之间整体间距的正确术语是 *字距调整*。
有人知道 Google 是否会索引 .svg 元素内的文本吗?
答案在这里:http://googlewebmastercentral.blogspot.com/2010/08/google-now-indexes-svg.html
感谢 Iskael 的回答。我在发布问题之前阅读了那篇文章,但我无法完全理解 Google 说的是索引什么:.svg 的元数据、嵌入文本,还是它们只是将图像包含在图像搜索中?
尝试这个 URL:Google 图像搜索结果中的 Shop Talk SVG
Google 索引 SVG 的元数据,就像它们索引 IMG 标签的“alt”或“title”属性一样。
也许 Jon 的文章可以解释 Google 如何索引 SVG 内部的文本:http://www.joningram.co.uk/article/svg-search-engine-friendly-accessible/
我们可以为不支持 SVG 或完全不支持 SVG 的浏览器填充这个很棒的功能吗?
Chris 还有另一篇文章专门介绍了这个问题:https://css-tricks.cn/using-svg/
但看起来 SVG 现在得到了很好的支持,填充可能不值得你的时间。
IE8 不支持 .svg,而且痛苦的是,它仍然占有大约 10% 的市场份额。有很多(几十个)解决方案可以提供回退。将图像保存为 .png 和 .svg(如果图像透明,始终使用 .png 而不是 .jpg)并将它们放在服务器上的同一个位置并不费时。
大家好,
这个功能很棒,但是,如果在浏览器上安装了 AdBlock 或其他广告拦截器,它将无法正常工作。
感谢 Chris 的文章。
根据我的经验,SVG-as- 在跨浏览器方面存在一些重大问题(在 Firefox 中尝试),因为链接资源存在安全问题。
第二点:外部字体在 Firefox 中无法在用作图像的 SVG(<img> 标签或 CSS 背景)中工作。
其他吹毛求疵的建议
完美缩放部分中的代码片段应包含 viewBox 属性(否则图像根本不会缩放)。您的实时示例中有它,但并非所有人都知道它是必需的。
为了可访问性和 SEO,文本元素在代码中出现的顺序应与逻辑阅读顺序相匹配(“Graves Mountain Bluegrass Festival”)。理想情况下,对于任何单一短语,都应将其渲染为单个 <text> 元素内的 <tspan> 元素,但这需要使用 x/y 属性进行定位,而不是变换(因为您无法变换单个 tspan 元素)。
看起来您在“完美缩放”之后的第一个句子中不小心遗漏了一个词。不过,这是一篇实用的文章!
谢谢,我会调整的。
不知何故,演示在 Firefox(最新的 29.0.1/Win)中失败,但在 Chrome 和 IE 中运行。空格文本实际上并没有空格。你知道为什么吗?
Firefox 目前尚不支持
letter-spacing
CSS 属性,也不支持其他一些排版 CSS 属性。要在 Firefox 中使间距生效,您需要使用 dx 属性添加调整。然而,这有点麻烦,因为您必须为每个单独的字符提供调整列表
http://codepen.io/AmeliaBR/pen/EhAHi
附注:致 Chris:我看到您在 fork 的笔中实现了自动版权行:不错!不太好的是:块代码似乎没有在评论预览中正确编码。
感谢 Chris 的文章。SVG 很棒,它有一些缺点,但它仍然经常能提供很大帮助。
我喜欢这个可能如何帮助减小诸如文本徽标之类的文件大小。
我最近放弃了 SVG,改用缩放的 PNG 做徽标,因为 SVG 超过了 60k,而 PNG 小于 30k。我知道 SVG 文件大小之所以很大是因为文本路径。
我很高兴您也指出,除非您在其他地方使用自定义字体,否则文件大小节省可能微不足道。但是,如果自定义字体被大量子集化,以便它只包含徽标中使用的字符怎么办?稍等,我去试试…
就在我以为 SVG 无法变得更棒的时候,我发现另一个很棒的功能。
使用仅包含 1 个小数位的 SVG 以及 Illustrator 中的“简化路径”可以使 SVG 变小。此外,将外观相同的 SVG 部分使用符号可以减少数据量。当然,如果您在 AI 中使用路径查找器“剪切”了图像的某些部分,则始终需要在 AI 中使用刀具工具剪切这些路径,因为路径仍然存在,只是不可见。
无论如何,如果您使用的是阴影(很糟糕,很糟糕,很糟糕!——它作为位图在 data uri 中进行预渲染)并且对文本进行轮廓描边,那么所有这些都无法帮助您减小 SVG 的大小。如果您没有充分的理由,应避免这样做。
这是一篇很棒的文章,而且在我目前的时机非常完美。我有一个问题,有人知道搜索引擎是否能看到这些 SVG 吗?我想在产品页面顶部使用 SVG 作为产品标题,在正常情况下我会使用 H1,但我希望能够保留我为每个产品设计的漂亮排版设计,并且仍然有利于 SEO。也许我要求太多了:-) 任何帮助都将不胜感激。
这篇文章指出,它们确实会索引 svg。
http://googlewebmastercentral.blogspot.ca/2010/08/google-now-indexes-svg.html
然而,我一直都在搜索,但没有找到任何关于在 SVG 中使用 H1、H2 等等的信息。我猜想这是不支持的。我猜想您能做的最好的事情是用 H1 包裹您的代码,但这只有在您没有超过 2 种文本类型时才有效。(即:如果您的 SVG 理想情况下包含 H1 和 H2)
有人在这方面有更多知识吗?您可以在 SVG 中有效地放入除 之外的其他任何东西吗?
只是我脑海中想到的一个想法,尚未经过测试
将
h1
标签放在 SVG 的顶部(是的,您需要两次输入相同的文本,但这只是非常小的开销,如果有的话),然后对其执行众所周知的图像替换技术我会添加
margin:0;
和height:0;
以确保万无一失。这样您就可以两全其美:使用 SVG 实现漂亮的可缩放响应式文本,以及使用
h1
(或任何标题)实现 SEO“合规性”。——
http://www.zeldman.com/2012/03/01/replacing-the-9999px-hack-new-image-replacement/
我通常建议您将 SVG 放在标题标签内。
花哨的标题
http://codepen.io/AmeliaBR/pen/jicEw?editors=110
像 IE8 这样的旧浏览器无法识别 SVG,但仍然会为您提供基本的标题样式,搜索引擎和屏幕阅读器应将 SVG 内容识别为标题的一部分,并且您不会重复元素,因此不会出现编辑一个标题而忘记更改不可见标题文本以匹配的风险。
关于 Ben Smith 关于单个图像中表示的多个标题级别的评论,我认为在很多情况下,您可以将其分解为两个(可能重叠的)SVG,但是,如果这对您不起作用,您可以使用 ARIA 的“heading”角色 为每个文本或 tspan 元素指定结构级别。
对于高度风格化的文本(不仅仅是字体),或者为了代替只为一个 SVG(如徽标)包含字体
将任何特殊字体文本转换为轮廓
将文本包含在定位在轮廓文本之上的
text fill="transparent"
元素内现在,用户可以选择 SVG 中的文本,而无需使用特殊字体!
不知道这是否会被视为“黑帽”SEO 技术。
我认为这应该是“黑帽”。太像 90 年代末期那种老掉牙的黑帽策略了,在白色背景上用很小的白色文字插入大量关键字。我倾向于认为谷歌最终(如果他们现在还没有)将能够读取 .svg 文件内的文本。他们确实理解 alt 标签,我认为他们天才的算法可以理解,页面顶部的披萨店图片和“披萨店”文本之间没有实质性的区别。
我目前项目无法切换到 SVG 的主要原因是,当通过伪选择器插入 SVG 时,无法用 CSS 操作其填充颜色。
示例
据我所知,SVG 无法做到这一点。我错了吗?
Mouutaiu 到底是什么?
有人知道如何在 Inkscape 中实现这个吗?经过快速测试,似乎 Inkscape 将文本元素保存在标签内。
Chris 写的太好了!
我在 SVG 中使用文本元素来创建响应式图表标签,调整大小的效果非常好。唯一缺点是,如果想要将文本放在边界框内,必须在其下方添加另一个元素(例如矩形),并将该元素的大小调整为文本的宽度。
不过这也说得通,因为在 Illustrator 中你也会这样做。
演示只显示了两个复选框,其他什么也没有...
最有可能的是:你正在使用广告拦截器。并且该广告拦截器正在阻止类名为“ad”的 div。
我会更改它,但我认为这是一个有趣的教训。
我认为现在的广告拦截器没那么简单了。
…正如这个示例所证明的
http://jsfiddle.net/3qtsQ/
按照你的逻辑,文本不应该出现,但它出现了。所以一定有其他原因。
我认为很简单,只是它依赖于网站。CodePen 上确实有一个使用类名“ad”的广告。所以有人特意将其报告给了某个用来阻止事物的全局存储库,因此它在 CodePen 上被阻止了。
我对此并不感到苦恼,我只是不会为了取悦在我的网站上阻止广告的人而更改演示。
当然不会。但至少你現在知道这是一回事。
而且在任何项目中,class=ad 都不算是一个好主意。所以今天又学到了额外的知识。
我什么也看不到。Chrome 版本 34.0.1847.116 Ubuntu
我来参加 SVG 派对晚了一些,发现它们在 WebKit 中对响应式构建(我想在整个网站中都是如此)有問題...似乎无法控制 SVG 元素的垂直大小/间距。我发现支持也普遍不足 - 是不是这里有我遗漏的特定流程?(...目前我基本上只是使用直接从 Illustrator 粘贴的 SVG 嵌入代码)