马黑黑 发表于 2024-9-25 13:03

svg文本描边动画

本帖最后由 马黑黑 于 2024-9-25 18:05 编辑 <br /><br /><style>
.artbox { margin: 20px auto; }
.artbox > p { margin: 10px 0; font-size: 20px; }
.artbox mark { padding: 0 4px; background: lightblue; }
.tRed { color: red; }
</style>

<div class="artbox">
        <h2>一、需要用到的核心属性</h2>
        <p>(一)<span class="tRed">stroke-dasharray</span> :描边线段数值列表,单值表示线段长度和线段间的间隔距离一样,双值时第一个数指线段长度第二个数指间隔距离,三值时,比如a b c,线段长度a、间隔距离b、线段长度c接着间隔距离a、线段长度b、间隔距离c然后从头再来,其他多值列表时,偶数值参考双值变化、奇数值参考三值变化,原理是按“线段·间隔·线段·间隔···”方式循环取数值列表值,值用完从头再循环数值。双值以上用空格或逗号隔开各值。</p>
        <p>(二)<span class="tRed">stroke-dashoffset</span> :描边线段偏移,表示线段与路径起点的偏移距离,支持几乎所有的svg内部可视元素。属性值为数值,正数表示正向偏移,负数表示反向偏移。</p>
        <p>上述两个属性,第一个用来设置虚线,第二个用来设置虚线偏移。我们经常使用的CSS相抵路径运动来源于此,主要利用第二个属性加offset-path实现。svg文本标签没有path可用,所以需要第一个属性 <span class="tRed">stroke-dasharray</span> 来描述描边形态,再用第二个属性 <span class="tRed">stroke-dashoffset</span> 驱动描边偏移产生描边动画。</p>
        <h2>二、纯svg方式文本描边动画的实现</h2>
        <p>以下是效果和代码,后边略做解释:</p>
<div class="hE"><pre>
&lt;svg width="500" height="120" viewBox="-125 -30 250 60"&gt;
        &lt;text x="0" y="18" fill="none" stroke="teal" stroke-width="2" stroke-dasharray="60 10" font-size="50" font-weight="bold" text-anchor="middle"&gt;
                花潮论坛
                &lt;animate attributeName="stroke-dashoffset" from="-70" to="0" dur="2s" begin="0s" repeatCount="indefinite"/&gt;
        &lt;/text&gt;
&lt;/svg&gt;
</pre></div>
<div class="resbox"></div>
        <p>首先注意svg的宽高和viewBox属性设置的关系:它们按照2:1的方式设计+坐标系右下位移便于定位,需要说明的是,我们是在viewBox中作画,所以30的字体大小会放大一倍,其他数值很多依此类推。其次是动画的核心内容:<span class="tRed">text</span>标签做了常规属性设置,其中的<mark>stroke-dasharray="60 10"</mark>设置的是文本描边的线段样式;<span class="tRed">animate</span> 标签中的 <span class="tRed">stroke-dashoffset</span> 偏移范围从(from)-70 到(to)0 之间循环往复变化,from 的值应设置得当,动画的头尾衔接才相对正常。</p>
        <h2>三、使用CSS实现svg文本描边动画</h2>
        <p>CSS对svg的支持度很高,试看下面使用CSS实现上例效果的演示:</p>
<div class="hE"><pre>
&lt;style&gt;
.text {
        fill: none;
        stroke: teal;
        stroke-width: 2;
        stroke-dasharray: 60 10;
        font-size: 50px;
        font-weight: bold;
        text-anchor: middle;
        animation: textstroke 2s linear infinite;
}
@keyframes textstroke {
        from { stroke-dashoffset: -70; }
        to { stroke-dashoffset: 0; }
}
&lt;/style&gt;

&lt;svg width="500" height="120" viewBox="-125 -30 250 60"&gt;
        &lt;text class="text" x="0" y="18"&gt;花潮论坛&lt;/text&gt;
&lt;/svg&gt;
</pre></div>
<div class="resbox"></div>
        <p>这里,CSS设计了一个 .text 选择器,它将svg的text标签里的属性除了x、y之外都设置了,并加上一个<span class="tRed">animation</span>属性调用 <span class="tRed">@keyframes</span> 设计的名为 <span class="tRed">textstroke</span> 的CSS动画。CSS动画也是通过 <span class="tRed">from</span> 和 <span class="tRed">to</span> 描述 <span class="tRed">stroke-dashoffset</span> 的数值变化;CSS还可以使用百分比描述动画过程不同阶段的数值变化,功能等同于svg的 values 属性。</p>
        <p>svg动画和CSS动画到底用哪一个好?由于CSS天然启用设备的GPU进行加速,动画的执行性能更为卓越,一般的建议是,对复杂动画而言,能用CSS实现的动画就尽量使用CSS动画,实在不行的就用svg动画;简单动画则无需考虑什么,哪个更上手就用哪一个。</p>

</div>

<script>
var sc = document.createElement('script');
sc.chartset = 'utf-8';
sc.src = 'https://638183.freep.cn/638183/web/js2024/helight.js';
document.body.appendChild(sc);
var resboxes = document.querySelectorAll('.resbox'), pres = document.querySelectorAll('pre');
resboxes.forEach((resbox,key) =>{
        resbox.innerHTML = pres.innerText;
});
</script>

起个网名好难 发表于 2024-9-25 18:00

https://img.cjyun.org/a/10085/201801/cf20aca3083ad28dbd1c19ace5278690.gif

红影 发表于 2024-9-25 19:42

这个讲解十分详细,描边字也极漂亮,太棒了!

红影 发表于 2024-9-25 19:46

看起来还是svg的代码更渐变呢。

小辣椒 发表于 2024-9-25 20:26

这个文字效果有点像蚂蚁字,但又不一样

花飞飞 发表于 2024-9-25 20:26

这个SVG动画可以封神了,又简洁,效果又好看。。。
保存为SVG图片后用途多多,想想就乐,超级好用。。{:4_173:}

马黑黑 发表于 2024-9-25 20:29

红影 发表于 2024-9-25 19:42
这个讲解十分详细,描边字也极漂亮,太棒了!

字体也很重要。这个没有设置字体,貌似使用了宋体

马黑黑 发表于 2024-9-25 20:29

小辣椒 发表于 2024-9-25 20:26
这个文字效果有点像蚂蚁字,但又不一样

{:4_189:}

马黑黑 发表于 2024-9-25 20:30

红影 发表于 2024-9-25 19:46
看起来还是svg的代码更渐变呢。

其实差不多的:属性差不多一样

马黑黑 发表于 2024-9-25 20:31

花飞飞 发表于 2024-9-25 20:26
这个SVG动画可以封神了,又简洁,效果又好看。。。
保存为SVG图片后用途多多,想想就乐,超级好用。。{:4_ ...

保存为.svg文档时请注意 svg 标签的命名空间

花飞飞 发表于 2024-9-25 20:37

马黑黑 发表于 2024-9-25 20:31
保存为.svg文档时请注意 svg 标签的命名空间

命名空间啥意思,命 名不是应该是规则么,.svg就行了

马黑黑 发表于 2024-9-25 20:38

花飞飞 发表于 2024-9-25 20:37
命名空间啥意思,命 名不是应该是规则么,.svg就行了

其实我多次提到额

花飞飞 发表于 2024-9-25 20:42

马黑黑 发表于 2024-9-25 20:38
其实我多次提到额

听你的我存成.svg上传它就能用了{:4_173:}

马黑黑 发表于 2024-9-25 20:44

花飞飞 发表于 2024-9-25 20:42
听你的我存成.svg上传它就能用了

不是酱紫的。

.svg 文档要能正常运行,svg 标签的命名空间一点错都不能有。你可以随便看看我上传的任意一个,查看源码

小辣椒 发表于 2024-9-25 20:49

马黑黑 发表于 2024-9-25 20:29


感觉漂亮是蛮漂亮的

荷上露珠 发表于 2024-9-25 20:54

是不是只要改那个汉字就可以了?

花飞飞 发表于 2024-9-25 20:55

马黑黑 发表于 2024-9-25 20:44
不是酱紫的。

.svg 文档要能正常运行,svg 标签的命名空间一点错都不能有。你可以随便看看我上传的任 ...

{:4_198:}
什么~~我去看看。。

红影 发表于 2024-9-25 21:51

马黑黑 发表于 2024-9-25 20:29
字体也很重要。这个没有设置字体,貌似使用了宋体

这个字体就挺漂亮了,主要这描边好看,怎么看都好{:4_187:}

红影 发表于 2024-9-25 21:52

马黑黑 发表于 2024-9-25 20:30
其实差不多的:属性差不多一样

代码的数量更少啊{:4_173:}

马黑黑 发表于 2024-9-25 22:25

红影 发表于 2024-9-25 21:52
代码的数量更少啊

那不见得的,也是差不多的:只是CSS分行写每一个属性了。
页: [1] 2 3
查看完整版本: svg文本描边动画