时间:2022-9-5 作者:悬浮的青春 分类: javascript
最近项目里面用到了这个文字路径动画,不得不说确实挺好玩的,如果有需要的小伙伴可以参考!
由于公司之前项目里也用到过,但是我是第一次写,所以第一时间还是先看看前辈是怎么处理的,借鉴一下长长经验哈哈,所以就找到了这个svg文字路径,上代码
(gif中第一个文字路径1
)
<svg
id="textPathDemo"
class="round-text"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
width="500"
viewBox="0 0 500 500"
>
<path
id="text-path1"
class="text-path"
d="M40 12 H200 A28 28 0 0 1 226 40 V305 A28 28 0 0 1 200 332 H40 A28 28 0 0 1 12 306 V40 A28 28 0 0 1 40 12 H200 A28 28 0 0 1 226 40 V305 A28 28 0 0 1 200 332 H40 A28 28 0 0 1 12 306 V40 A28 28 0 0 1 40 12 z"
fill="#ccc"
stroke="#FF4444"
stroke-dasharray="5,2"
stroke-width="1"
/>
<text class="circle-text">
<textPath xlink:href="#text-path1" class="text-content" textLength="280" startOffset="0">
svg文字路径动画111111111111111111
<animate attributeName="startOffset" from="0" to="1020" begin="0s" dur="8s" repeatCount="indefinite" />
</textPath>
<textPath xlink:href="#text-path1" class="text-content" textLength="280" startOffset="520">
svg文字路径动画222222222222222222
<animate attributeName="startOffset" from="520" to="1540" begin="0s" dur="8s" repeatCount="indefinite" />
</textPath>
</text>
</svg>
找到代码后,就需要看一下属性都是什么意思了,介绍一下这里涉及到的属性
svg
标签path
标签也就是用来定义svg路径的标签文字路径1和文字路径2
,灰色区域,设置填充颜色#ccc数值列表
,第一个值表示线段的长度,第二个值表示线段间空白的长度
,gif中stroke-dasharray="5 2"中,第一个数字 5 表示虚线中的线段的长度,而第二个数字 2 表示两个线段间的长度是 2px。所以出来的效果是每段虚线的间隔都是一样的。其实这个dasharray可以不只两个值,可以有很多个,会循环依次用到线段和空白之间。gif中最后一个文字路径9
设置的stroke-dasharray="(20,5)",是不是能明显感受到差别文字路径9
为3,其他的都是1,类似border-widthtextPath
标签也就是直接关系到文字的标签了,定义文字按照什么路径排列的path
那设置的 id 属性。animate
标签就是动画了attributeName
,通过改变文字的偏移量让文字动起来。gif中每个例子中的长度其实都是我一点点调的,到现在我也不太清楚这个计算方式应该是怎么算。
我们看一下gif中,前面两组看不出任何破绽,都是无限重复循环的,但是这个路径长度如果计算不好会怎么样呢,看一下最右边那组文字路径8
,很明显在走完一遍后文字消失在了最右边,这就是长度写的太长了,导致文字已经到达文字边缘了,但是还有一截长度没走完,页面上看起来就消失了,但是上面路径6
和路径7
长度写的就会短一些,所以到最后还灭消失的时候又返回到了起点。
建议如果也不知道咋写的可以慢慢调试,但是作为程序员,写数据类的东西还是要精确一点。所以我又去找了各大文档文章等,然后看到了snap.svg.js的库,然后有个方法是可以计算出路径长度的Snap.path.getTotalLength(path)
let path = "M40 12 H200 A28 28 0 0 1 226 40 V305 A28 28 0 0 1 200 332 H40 A28 28 0 0 1 12 306 V40 A28 28 0 0 1 40 12 H200 A28 28 0 0 1 226 40 V305 A28 28 0 0 1 200 332 H40 A28 28 0 0 1 12 306 V40 A28 28 0 0 1 40 12 z"
let pathLength = Snap.path.getTotalLength(path)
console.log(pathLength)
由于我项目里面那个文字动画已经搞定了,所以就没有继续引这个库去尝试,大家可以参考一下,如果项目允许的话可以尝试一下~
//文字路径5 圆形
d="M 200 200 m -96 0 a 96 96 0 1 0 192 0 a 96 96 0 1 0 -192 0 M 200 200 m -96 0 a 96 96 0 1 0 192 0 a 96 96 0 1 0 -192 0"
//最后一组 路径都一样,只是属性不一样
d="M10,180 q100,120 120,20 q140,-50 160,0 q100,120 120,20 q140,-50 160,0"
文字动画最重要的是路径,要文字沿着怎样的路径去运动,先确定路径之后再去看路径长度,路径长度比较笨的办法是自己一点点调,当然项目允许的话肯定还是要引库进去,能更精确一些。