2016-02-19 169 views
2

在使用关键帧动画构建CSS3加载器时遇到一些问题。停止无限的CSS3动画并顺利恢复到初始状态

加载程序包含4个动画上下移动的框。我遇到的问题是,当动画应该停止时,这些框会跳到最初的位置。我正在寻找的行为是:加载程序无限制地进行动画,直到加载完成,此时它应该动画到初始位置并停止,有点像animation-iteration-count: infinite并将其更改为animation-iteration-count: 1以停止动画。 (这不工作顺便说一句)。

看到这个小提琴明白我的意思:https://jsfiddle.net/cazacuvlad/qjmhm4ma/(点击停止按钮时,箱子应该动画到初始位置,而不是跳跃)

基本设置是:

<div class="loader-wrapper"><span></span><span></span><span></span><span></span></div> 

要启动加载程序,我要将包含动画的loader-active类添加到loader-wrapper

LESS:

.loader-wrapper { 
    &.loader-active { 
    span { 
     .animation-name(loader); 
     .animation-duration(1200ms); 
     .animation-timing-function(ease-in-out); 
     .animation-play-state(running); 
     .animation-iteration-count(infinite); 

     &:nth-child(1) { 
     } 
     &:nth-child(2) { 
     .animation-delay(300ms); 
     } 
     &:nth-child(3) { 
     .animation-delay(600ms); 
     } 
     &:nth-child(4) { 
     .animation-delay(900ms); 
     } 
    } 
    } 
} 

我尝试添加动画在loader-wrapper类的跨度W/O loader-activeloader-active是没有任何的运气加入animation-iteration-countanimation-play-state玩耍。

谢谢!

+0

你不能做到这一点与CSS。你会需要我怀疑会快速复杂的Javascript。 –

+0

在JS中做它是备份解决方案。我认为这是动画的有效用例,应该有一个纯CSS的方式来做到这一点。 –

+0

动画很好,但CSS无法检测动画在(中)周期中的位置,然后根据条件运行。我甚至不确定JS是否可以做到这一点,但如果可以的话,那将是一种方式。 –

回答

4

找到一个非常简单的解决方法。仍然不是纯粹的CSS,它涉及到一些JS,但它运作良好。

更新小提琴:https://jsfiddle.net/cazacuvlad/qjmhm4ma/2/

我所做的是把loader-active类移动到每个跨度(而不是包装),听取各跨度animationiteration事件和停止动画即可。

$('.loader-wrapper span').on('animationiteration webkitAnimationIteration', function() { 
    var $this = $(this); 

    $this.removeClass('loader-active'); 

    $this.off(); 
}); 

这基本上在迭代周期的最后停止动画。

更新LESS

.loader-wrapper { 
    span { 
    &.loader-active { 
     .animation-name(loader); 
     .animation-duration(1200ms); 
     .animation-timing-function(ease-in-out); 
     .animation-play-state(running); 
     .animation-iteration-count(infinite); 

     &:nth-child(1) { 
     } 
     &:nth-child(2) { 
     .animation-delay(300ms); 
     } 
     &:nth-child(3) { 
     .animation-delay(600ms); 
     } 
     &:nth-child(4) { 
     .animation-delay(900ms); 
     } 
    } 
    } 
} 
+0

这实际上是一个非常好的主意。我喜欢它:)我链接的情况更复杂,因为那些需要逐渐停顿而不是完成迭代。 – Harry

+0

不幸的是,如果'animation-direction'是'alternate',这不起作用。我们必须*手动结束*。不错的解决方案!可能的解决方法是获取当前的'animation-duration'并将其与'elapsedTime'进行比较。 – yckart