基于百分比的 SCSS 停止关键帧 SVG 圆形动画

Posted

技术标签:

【中文标题】基于百分比的 SCSS 停止关键帧 SVG 圆形动画【英文标题】:SCSS stop keyframe SVG circle animation based on percentage 【发布时间】:2019-08-17 02:31:59 【问题描述】:

刚刚创建了我的第一个关键帧进度指示器,我在我的 react 项目中使用它。我想将百分比状态推送到此关键帧,以便我可以将百分比填充到某个点。现在,它填充但我不明白如何停止动画。例如,我希望当我推动一个带有 '50' 的道具时,填充物在 50% 处停止。

JSfiddle example

<svg   class="circle--static">
  <circle cx="100" cy="100" r="71" stroke="#cde9db" stroke- fill-opacity="0" />
</svg>
<svg   class="circle--animated">
  <circle cx="100" cy="100" r="71" stroke="#68c087" stroke- fill-opacity="0" />
</svg>
.circle--static 
      circle 
         stroke-dasharray: 4;
         animation: stroke 2s ease-out forwards;
       
   

   .circle--animated 
      top: 0;
      left: 0;
      position: absolute;

      circle 
         stroke-dasharray: 1000;
         stroke-dashoffset: 1000;
         animation: stroke 60s ease-out forwards;
         animation-iteration-count: infinite;
      

      @keyframes stroke 
         to 
            stroke-dashoffset: 0;
         
      

      @keyframes fadeIn 
         to 
            opacity: 1;
         
      
   

【问题讨论】:

【参考方案1】:

可以使用getTotalLength 方法找到 SVG 中路径的总长度。在您的情况下,您还可以使用圆的周长公式 (2*Math.PI*r)。

无论如何,您需要知道要设置动画的路径的长度,在本例中为 445。

stroke-dasharray: 445;
stroke-dashoffset: 445;

如果您想在 50% 处停止动画,这意味着您必须将其停止在 445 / 2 = 222.5

 @keyframes stroke 
      to 
        stroke-dashoffset: 222.5;
      
    

接下来是演示。希望对你有帮助。

svg 
  border: 1px solid;


.circle--static circle 
  stroke-dasharray: 4;
  animation: stroke 2s ease-out forwards;


.circle--animated 
  top: 0;
  left: 0;
  /*position: absolute;*/

.circle--animated circle 
  stroke-dasharray: 445;
  stroke-dashoffset: 445;
  animation: stroke 6s ease-out forwards;
  animation-iteration-count: infinite;

@keyframes stroke 
  to 
    stroke-dashoffset: 222.5;
  

@keyframes fadeIn 
  to 
    opacity: 1;
  
<svg   class="circle--static">
  <circle cx="100" cy="100" r="71" stroke="#cde9db" stroke- fill-opacity="0" />
</svg>


<svg   class="circle--animated">
  <circle id="kk" cx="100" cy="100" r="71" stroke="#68c087" stroke- fill-opacity="0" />
</svg>

【讨论】:

非常感谢,很好的解释! :) 只是一个额外的小问题,我们可以通过什么属性更改动画的起点,因为它应该从顶部 (0%) 而不是 25% 开始:) 在这种情况下,您可能需要旋转 svg 画布或考虑使用 &lt;path&gt; 而不是圆形。

以上是关于基于百分比的 SCSS 停止关键帧 SVG 圆形动画的主要内容,如果未能解决你的问题,请参考以下文章

iOS基本动画/关键帧动画/利用缓动函数实现物理动画效果

第1433期CSS3动画实战之多关键帧实现无限循环动效的时间间隔

svg中stroke-dashoffset实现简单动效

scss 在最后一帧停止动画

scss SCSS Rect Motion关键帧

SCSS 的关键帧动画不起作用