这是我参与更文挑战的第3天,活动详情查看: 更文挑战
前言
记得之前有段时间罗盘时钟特别火,大冰块也跟风写了一个罗盘时钟的 demo
,其中环形的文字大冰块使用了 transform
来制作。制作过程中,大冰块发现使用纯 css
实现文字沿指定路径排列的效果会显得特别复杂,如果路径发生了变化,就需要要改很多 css
属性来适应路径变化。
在这时候,SVG
的优势就凸显了出来,因为 SVG
原生支持以任意路径排列的文字,不只是环形,还有三角形、平行四边形等任意花里胡哨的形状路径都可以支持。
那么今天,来跟大冰块一起来复习一下 用 SVG
生成沿任意路径排布的文字 的问题吧~
SVG
的基础知识
什么是SVG
SVG
指可伸缩矢量图形 (Scalable Vector Graphics),在放大或改变尺寸的情况下其图形质量不会有所损失。SVG
使用XML
格式定义图形,用来定义用于网络的基于矢量的图形。SVG
是万维网联盟的标准,与诸如DOM
和XSL
之类的W3C
标准是一个整体。
路径元素
<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绘制一个圆形路径:
<style> .box { width: 200px; height: 200px; } </style>
<div class="box">
<svg viewBox="0 0 100 100">
<path d="M0, 50 a50, 50 0 1, 1 0, 1z"></path>
</svg>
<div>
如下图所示:
使用 <textPath>
让文本沿路径排布
<textpath>
元素用于沿路径(例如,圆形)排列文本。<text>
元素用于在SVG
图像中绘制文本。
我们可以使用一个 <textPath>
元素来包裹住这段文本,并通过 xlink:href="#xxx"
属性来把它链接到 ID
为 xxx
的<path>
定义路径的元素。字体的样式可以继承自外层的元素,所以不用单独给文本设置字体样式。然后我们再把 <textPath>
放在 <text>
元素中:
<style> body { background-color: #b0b0b0; } .box { width: 200px; height: 200px; margin: 50px; background-color: #fff; } </style>
<div class="box">
<svg viewBox="0 0 100 100">
<path d="M0,50 a50,50 0 1,1 0,1z" id="circle" ></path>
<text>
<textPath xlink:href="#circle">这是围绕路径生成的环形文字~</textPath>
</text>
</svg>
<div>
如下图所示:
从上图可以看到两个问题:
- 1,圆形路径被默认的黑色填充了。
- 2,
SVG
实际宽高继承自.box
盒子,宽高均为200px
,而文字溢出部分被隐藏了。
解决方式如下:
- 1,我们可以把
<path>
元素的fill设置为fill: none;
,这样,圆形路径的背景就是透明的了。 - 2,给
SVG
设置overflow: visible;
,这样,超出SVG
部分的文字就不会被隐藏了。
增加 css
代码如下:
.box svg {
overflow: visible;
}
.box path {
fill: none;
}
如下图所示:
完美!
制作沿任意路径排布的文字效果
有了上面的经验,我们把 <path>
元素的路径调整一下,比如可以使用SVG在线编辑器来制作path路径。然后我们给文字添加颜色渐变效果,字间距调整一下试试看:
<style> .box { width: 200px; height: 200px; margin: 50px; font-size: 12px; letter-spacing: 2px; } .box svg { overflow: visible; } .box path { fill: none; } </style>
<div class="box">
<svg viewBox="0 0 100 100">
<path d="m36.04045,45.99612c0.72238,0 18.78177,-17.27891 34.67404,-2.30385c15.89227,14.97505 -2.06122,51.71385 -33.12338,49.40999c-31.06217,-2.30385 -51.39459,-47.6821 -23.94431,-74.17643c27.45028,-26.49433 76.46594,-21.1417 90.427,-2.34993c13.96106,18.79177 9.22214,37.08444 7.59483,52.18238c-1.62731,15.09794 5.01952,28.13002 23.57052,28.88256c18.551,0.75254 68.69884,1.13642 61.38299,-46.48421" fill-opacity="null" id="circle" ></path>
<linearGradient id="myLinearGradient" x1="0%" y1="0%" x2="100%" y2="0%">
<stop offset="0%" stop-color="red"></stop>
<stop offset="15%" stop-color="orange"></stop>
<stop offset="30%" stop-color="yellow"></stop>
<stop offset="45%" stop-color="green"></stop>
<stop offset="60%" stop-color="cyan"></stop>
<stop offset="80%" stop-color="blue"></stop>
<stop offset="100%" stop-color="purple"></stop>
</linearGradient>
<text fill="url(#myLinearGradient)">
<textPath xlink:href="#circle">如何使用SVG制作沿任意路径排布的文字效果~来跟大冰块一起来复习一下吧~</textPath>
</text>
</svg>
</div>
如下图所示:
制作完成!是不是很简单呢?轻轻松松又掌握了一个小知识点~
后记
SVG
的内容其实不多,花一天的时间基本就能全部看明白了,除了 <path>元素
的绘制实在太复杂之外,其他元素和属性还都是比较容易让人接受的。我们不必去费尽心思领悟 SVG
<path>元素
语法的神秘魅力,反正即使学会了也会在几分钟内忘得一干二净【手动狗头】。学一下根据路径排列文字的方法还是很有用的,毕竟这个样式在设计图中也是会用到的~
PS: 今天是参加更文挑战的第3天啦,没有存稿的我,写一篇基础的博客起码也要费半天时间,不禁吐槽自己好慢啊。
虽然没多少人看,也还是给自己引引流吧~ 更文挑战的文章目录如下:
- 2021.06.01 《多图预警!详细谈谈Flex布局的容器元素和项目元素的属性~》
- 2021.06.02 《如何把css渐变背景玩出花样来》
今天的文章如何使用SVG制作沿任意路径排布的文字效果分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/14486.html