I have the following HTML:
<div class="rotate"></div>
And the following CSS:
@-webkit-keyframes rotate { to { -webkit-transform: rotate(360deg); } } .rotate { width: 100px; height: 100px; background: red; -webkit-animation-name: rotate; -webkit-animation-duration: 5s; -webkit-animation-iteration-count: infinite; -webkit-animation-timing-function: linear; }
I want to know if there is a way (using JavaScript) to stop the animation but let it finish its current iteration (preferably by changing one or a few CSS properties). I have tried setting -webkit-animation-name
to have a blank value but that causes the element to jump back to its original position in a jarring fashion. I have also tried setting -webkit-animation-iteration-count
to 1
but that does the same thing.
The only way to truly pause an animation in CSS is to use the animation-play-state property with a paused value. In JavaScript, the property is “camelCased” as animationPlayState and set like this: element. style.
Use a transition time of 0.6s when you hover and an animation time of 0.01 when you hover off. This way, the animation will reset itself to its original position pretty much immediately and stop the funky behaviour.
The animation-play-state CSS property sets whether an animation is running or paused.
The animation-fill-mode property specifies a style for the element when the animation is not playing (before it starts, after it ends, or both). CSS animations do not affect the element before the first keyframe is played or after the last keyframe is played. The animation-fill-mode property can override this behavior.
Stop the animation upon receiving an animationiteration
event. Something like this (using jQuery):
CSS
@-webkit-keyframes rotate { to { -webkit-transform: rotate(360deg); } } .rotate { width: 100px; height: 100px; background: red; } .rotate.anim { -webkit-animation-name: rotate; -webkit-animation-duration: 5s; -webkit-animation-iteration-count: infinite; -webkit-animation-timing-function: linear; }
HTML
<div class="rotate anim">TEST</div> <input id="stop" type="submit" value="stop it" />
JS (JQuery)
$("#stop").click(function() { $(".rotate").one('animationiteration webkitAnimationIteration', function() { $(this).removeClass("anim"); }); });
Fiddle: http://jsfiddle.net/sSYYE/1/
Note that I'm using .one
here (not .on
) so that the handler only runs once. That way, the animation can later be restarted.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With