如何使用 SVG 制作沿任意路径排布的文字效果
前言
记得之前有段时间罗盘时钟特别火,大冰块也跟风写了一个罗盘时钟的 demo
,其中环形的文字大冰块使用了 transform
来制作。制作过程中,大冰块发现使用纯 css
实现文字沿指定路径排列的效果会显得特别复杂,如果路径发生了变化,就需要要改很多 css
属性来适应路径变化。
在这时候,SVG
的优势就凸显了出来,因为 SVG
原生支持以任意路径排列的文字,不只是环形,还有三角形、平行四边形等任意花里胡哨的形状路径都可以支持。
那么今天,来跟大冰块一起来复习一下 用 SVG
生成沿任意路径排布的文字 的问题吧~
SVG
的基础知识
什么是SVG
SVG
指可伸缩矢量图形 (Scalable Vector Graphics),在放大或改变尺寸的情况下其图形质量不会有所损失。
SVG
使用XML
格式定义图形,用来定义用于网络的基于矢量的图形。
SVG
是万维网联盟的标准,与诸如DOM
和XSL
之类的W3C
标准是一个整体。
<path>路径元素
<path>
元素是用来定义形状的通用元素,理论上,我们可以用<path>
元素来定义的任何路径。
我们来看一下 <path>
元素的某些基本操作:
M:将笔移动到指定点 x,y 而不绘图。
a:从当前点到点 x,y 绘制一个椭圆弧。
z:通过从当前点到第一个点画一条线来封闭路径。
viewBox
属性
viewBox(视图框)
属性用来定义<svg>
所占的空间大小。两个坐标定义元素左上角的用户坐标,后两个坐标定义右下角的用户坐标。
<svg>
所占的空间大小就是ViewBox
左上坐标到右下坐标的空间。
如果我们给 SVG
设置 width:500px; height:500px; viewBox="0 0 50 20"
在这种情况下, 视图框(ViewBox)
从(0,0)处开始,并且 100 宽,100 高。也就是说,500 x 500 像素的 <svg>
元素,在内部使用从(0,0)到(100,100)的坐标系,相当于它被分成了 100*100 个单元格。所以当前 SVG
形状坐标中的每 1 个单位对应宽度为:500/100 = 5 像素,高度为:500/100 = 5 像素。
如果此时我们给这个 SVG
内部某元素设置 x="10" y="10" width="20" height="20"
,则表示这个元素距离 SVG
元素的上面 50px
,左边 50px
,宽为 100px
,高也是 100px
。
掌握了上面的知识,下面我们尝试用 path 绘制一个圆形路径:
如下图所示:
使用 <textPath>
让文本沿路径排布
<textpath>
元素用于沿路径(例如,圆形)排列文本。<text>
元素用于在SVG
图像中绘制文本。
我们可以使用一个 <textPath>
元素来包裹住这段文本,并通过 xlink:href="#xxx"
属性来把它链接到 ID
为 xxx
的<path>
定义路径的元素。字体的样式可以继承自外层的元素,所以不用单独给文本设置字体样式。然后我们再把 <textPath>
放在 <text>
元素中:
如下图所示:
从上图可以看到两个问题:
1,圆形路径被默认的黑色填充了。
2,
SVG
实际宽高继承自.box
盒子,宽高均为200px
,而文字溢出部分被隐藏了。
解决方式如下:
1,我们可以把
<path>
元素的 fill 设置为fill: none;
,这样,圆形路径的背景就是透明的了。2,给
SVG
设置overflow: visible;
,这样,超出SVG
部分的文字就不会被隐藏了。
增加 css
代码如下:
如下图所示:
完美!
制作沿任意路径排布的文字效果
有了上面的经验,我们把 <path>
元素的路径调整一下,比如可以使用SVG在线编辑器来制作 path 路径。然后我们给文字添加颜色渐变效果,字间距调整一下试试看:
如下图所示:
制作完成!是不是很简单呢?轻轻松松又掌握了一个小知识点~
后记
SVG
的内容其实不多,花一天的时间基本就能全部看明白了,除了 <path>元素
的绘制实在太复杂之外,其他元素和属性还都是比较容易让人接受的。我们不必去费尽心思领悟 SVG
<path>元素
语法的神秘魅力,反正即使学会了也会在几分钟内忘得一干二净【手动狗头】。学一下根据路径排列文字的方法还是很有用的,毕竟这个样式在设计图中也是会用到的~
版权声明: 本文为 InfoQ 作者【南极一块修炼千年的大冰块】的原创文章。
原文链接:【http://xie.infoq.cn/article/56e3c016d9f602348fa9c3500】。文章转载请联系作者。
评论