以下是 Ian Marquette 的客座文章。 Ian 发现 SVG 可以拥有一个 <text>
元素,这意味着文本可以来自动态源,同时仍然能够对其执行很酷的自定义 SVG 特定操作。
我最近在一个基于 WordPress 的网站上工作,该网站需要一个信息图表。 作为响应式设计的支持者,我在 Illustrator 中绘制了信息图表,并将其导出为 SVG 以实现可扩展性。 在后端四处摸索时,我发现您可以将 WordPress 自定义字段添加到 SVG 文本元素,这些字段允许您从 WordPress CMS 中控制基于文本的内容。 这真是太棒了!
在这里,我将解释我是如何做到的,以及您可能会发现有用的其他一些选项。
准备 SVG 文件
在您选择的矢量编辑软件中创建图形。 在您想要包含用户控制文本的区域添加占位符文本。 在这里,我创建了一个简单的图形以进行演示。

现在使用您喜欢的编辑器打开您的 SVG 文件。 您需要对代码进行一些更改。 在我的示例中,该路径必须更改为 <textpath>
,并被赋予一个 ID,并使用 xlink 链接。 如果我没有这样做,文本中的每个字符都会有自己的标签、坐标等。
<svg width="1000px" height="300px" viewBox="0 0 1000 300"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink">
<defs>
<path id="MyPath"
d="M 100 200
C 200 100 300 0 400 100
C 500 200 600 300 700 200
C 800 100 900 100 900 100" />
</defs>
<use xlink:href="#MyPath" fill="none" stroke="green" />
<text font-family="Helvetica" font-size="42.5">
<textPath xlink:href="#MyPath">
SVG Text on a path for WordPress!
</textPath>
</text>
</svg>
这是一个在路径上显示一些文本的实时演示
查看 Pen JoakC by Chris Coyier (@chriscoyier) on CodePen.
您可以直接将标记复制粘贴到 WordPress 模板中。 您也可以使用其他方法在页面上使用 SVG,例如将文件链接为对象。 从本质上讲,它需要是内联 SVG,而不是用作 或 background-image 的 SVG。
您需要用以下代码替换 <text>
标签之间的内容,将 custom_field
替换为您想要给它起的名字
<?php
global $wp_query;
$postid = $wp_query->post->ID;
echo get_post_meta($postid, 'custom_field', true);
wp_reset_query();
?>
将其放到 SVG 中将看起来像这样
<svg width="1000px" height="300px" viewBox="0 0 1000 300"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink">
<defs>
<path id="MyPath"
d="M 100 200
C 200 100 300 0 400 100
C 500 200 600 300 700 200
C 800 100 900 100 900 100" />
</defs>
<use xlink:href="#MyPath" fill="none" stroke="green" />
<text font-family="Helvetica" font-size="42.5">
<textPath xlink:href="#MyPath">
<?php
global $wp_query;
$postid = $wp_query->post->ID;
echo get_post_meta($postid, 'custom_field', true);
wp_reset_query();
?>
</textPath>
</text>
</svg>
现在在 WordPress CMS 中创建具有此标签的自定义字段,并对其进行填充。

现在,如果您查看该页面,您应该会看到自定义文本位于您的自定义 SVG 图形中! 当然,自定义字段只是一种非常可扩展的实现方式。 您也可以用这种方式使用帖子标题、菜单或任何其他从任何 CMS 中动态输出文本的内容。

一旦它在那里,文本就可以像普通标记一样被样式化。 例如
...
<textpath class="text-path" ... >
...
.text-path {
fill: orange;
}
或任何其他 SVG CSS 属性。 这意味着使用 @font-face 的自定义字体可以正常工作。 您还可以使用 SVG 过滤器和动画等功能。
浏览器对它的支持情况如何?
每个能够使用内联 SVG 的浏览器都应该能够显示它。 对于 IE 来说,这意味着 IE 9 及更高版本。
SVG 令人惊讶地好,IE 9 及更高版本。-> HTML5 请
IE8- 仍然会显示原始文本,没有 SVG 效果,因此即使没有 SVG 支持,它仍然是可访问的。 如果您将整个 SVG 包裹在一个
<span>
或标题标签中,您甚至可以针对它进行单独的样式设置,如果您有一个针对旧版浏览器的样式表。出于语义/可访问性原因,如果您使用 SVG 效果来装饰页面标题,最好将图形包裹在一个有意义的标签中。
我不确定是否是 CodePen 问题,但我使用的是 Windows 上的 Firefox 27.0.1,对我来说什么都没有显示,即使我使用的是完整的 CodePen 网站。 Chrome 33 工作正常,IE 10 也一样。 现在我只有这些安装了。
这太酷了。 谢谢!
很棒的文章。 我使用类似的技术来获取用户选择的颜色并将其包含在 SVG 图形中。
小小的挑剔,截图显示
custom_svg_text
作为 WordPress 的自定义字段,但将custom_field
称为 PHP 调用中的键。除此之外,很棒的文章! IMO SVG 被低估了。 我认为我们将在未来看到更多这种技术。 它显然过于超前。 还有人记得 Adobe LiveMotion 吗?在 Adobe 因为 Flash 而将其杀死之前? 我们几乎回到了原点…
这些代码片段中的一些 WordPress 内容非常糟糕。
首先,调用
global $wp_query
完全没有必要来获取帖子 ID。 在循环中,只要使用get_the_ID()
函数就足够了。 或者,最糟糕的情况,只是声明global $post
并获取$post->ID
,但不需要$wp_query
或wp_reset_query()
的东西。wp_reset_query()
会重置整个$wp_query
和$post
变量,通常是没必要的,即使您正在执行自定义循环。 为了获取帖子 ID,这绝对是过分了。 我最近发布了关于wp_reset_query()
、wp_reset_postdata()
以及踩踏这些主要变量的文章,其中包含一些针对不熟悉这些内容的人的优质资源。tl;dr - 在该示例中,您只需执行
get_post_meta( get_the_ID(), 'custom_field', true);
,只要您在循环中。 不需要其他内容,而且它不是很好的做法。我完全同意你的观点。
这与主要浏览器兼容吗?
你抓住了我的 WP 代码,对不起。 我猜这是匆忙的结果。
我们在最近的一个 WP 网站中使用了这种技术,rufinaehijas.com,如果您想检查浏览器兼容性。
我们发现的问题是在 Firefox 上应用字距调整,因为它看起来像是存在一个错误(有人知道在 textPath 上使用
kerning=" "
的解决方案吗?)。同样非常重要的是,由于排版的升部高度、大小以及路径的波浪程度,排版的内部曲线会卡在更高的部分。 我们通过使用
'dy'
属性对<tspan>
进行垂直定位来解决这个问题,这样排版就会位于路径的中间。哇,我将到处使用它! 真是个好发现。
这太酷了!
SVG 如今在很多方面都非常有用。