如何使 SVG 动画无缝流畅?

Posted

技术标签:

【中文标题】如何使 SVG 动画无缝流畅?【英文标题】:How can I make the SVG animation seamless and smooth? 【发布时间】:2020-09-26 10:40:35 【问题描述】:

我已经为SVG制作了动画,为了给手写效果,我想让动画更加无缝,因为字母“W”出现在动画中,它使字母的其他部分也出现了,我可以'不要减小笔画宽度,因为字母的其余部分不会完全显示,请指导我可以做什么。

由于我无法在此处上传代码,它的 SVG 和超过 35,000 个字符,所以请检查 CodePen。

html 代码

<defs>
    <clipPath id="clip-path" transform="translate(0 0)">
        <path id="w" d="M47.205,44.721c-.1.062-.191.119-.262.169a1.172,1.172,0,0,0-.192.17,1.237,1.237,0,0,0-.155.208,1.71,1.71,0,0,0-.13.285L42.677,55.6q-.354-.956-.708-1.9-.307-.8-.655-1.694t-.623-1.6L38.8,55.6Q37.7,52.9,36.825,50.73q-.37-.925-.739-1.818c-.247-.6-.467-1.134-.662-1.618s-.357-.883-.485-1.2-.2-.508-.223-.57a1.835,1.835,0,0,0-.293-.47,1.326,1.326,0,0,0-.539-.332H36.7a.519.519,0,0,0-.355.4.832.832,0,0,0,.093.539l2.836,7.18,1.077-3.3q-.215-.57-.493-1.247t-.532-1.279c-.17-.4-.313-.747-.432-1.04s-.187-.464-.208-.516a1.529,1.529,0,0,0-.223-.409,1.143,1.143,0,0,0-.532-.332h2.711a.5.5,0,0,0-.315.4,1.016,1.016,0,0,0,.07.539l.817,2.033.8-2.2a.886.886,0,0,0,.068-.479q-.039-.2-.347-.293h1.633a2.841,2.841,0,0,0-.254.17,1.007,1.007,0,0,0-.169.161,1.148,1.148,0,0,0-.124.185,2.582,2.582,0,0,0-.116.254l-1.155,3.034,1.556,4.313L45.652,45.6a1.01,1.01,0,0,0,.062-.533.513.513,0,0,0-.355-.346h1.849Z" style="fill: none" />
    </clipPath>
</defs>

<g id="w-grp">
    <g style="clip-path: url(#clip-path)">
        <polyline class="logo-path m-1" id="w-path" points="35.084 43.989 39.663 55.599 38.796 55.599 38.609 55.136 42.916 43.989 38.968 43.989 43.484 55.599 42.677 55.597 42.474 55.101 46.67 43.989" style="fill: none;stroke: #191717;stroke-miterlimit: 10;stroke-width: 3px" />
    </g>
</g>

代码笔:https://codepen.io/ToxifiedM/pen/MWKeERr

相关问题 1:A JQuery Function For SVG, To Execute 2nd Animation As Soon As, 1st Animation Completes?

相关问题 2:To Control SVG CSS Based Animation Using Jquery?

相关问题3:To Control The Speed Of Multiple SVG Elements Using Jquery?

【问题讨论】:

【参考方案1】:

我会这样做:

我正在使用一个折线元素,我正在使用类似 V 的路径进行剪切。为了制作 W,我使用了剪裁的折线两次。我正在为 use 元素的stroke-dashoffset 设置动画,第二个元素延迟 1s

svgwidth:300px;border:solid

use
  stroke-dasharray: 255;
  stroke-dashoffset: 255;
   animation: dash 1s linear forwards;

use:nth-of-type(2)
 animation-delay:1s


@keyframes dash 
  to 
    stroke-dashoffset: 0;
  
<svg viewBox="30 80 250 150">
  <defs>  
  <clipPath id="clip">
  <path id="V" xmlns="http://www.w3.org/2000/svg" d="M52,90L103,210 110,210 160,90 152,90  110,190 66,90 52,90" stroke="black" fill="none" />
  </clipPath>
  
  <polyline id="poly" points="58,85 107,203 156,85" stroke="red" fill="none" stroke- clip-path="url(#clip)" />
  
  </defs>
  
  <use xlink:href="#poly" x="0" />
  <use xlink:href="#poly" x="50" />
  

</svg>

【讨论】:

嘿,@enxaneta,我应用了你的技术,但我必须在它相交的任何地方剪切对象,并绘制一条路径并将其转换为剪贴蒙版,给路径一个笔划宽度,你的解决方案给出了我做了一个简短的想法,由于字体太复杂,我花了很多时间,你可以在这里检查笔。 codepen.io/ToxifiedM/pen/mdVeJxW,我在想是否有什么方法可以在第一个动画完成时开始第二个动画,并且它只是继续为动画提供更流畅的效果和完美的时机,实现 jquery? 好笔!您可以在不同的问题中提出所有这些问题。 谢谢 enxaneta,我现在就做 :)

以上是关于如何使 SVG 动画无缝流畅?的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 CSS 使 SVG 元素动画化

为啥这个 SVG 蒙版动画在 Firefox 中断断续续,但在 Chrome 中却很流畅?

如何在不改变高度的情况下让 SVG 具有流畅的宽度?

XAML 使动画流畅

重新启动时如何使这个 CSS 关键帧动画平滑?

SVG 动画不透明度变量值