我能用JavaScript检测CSS关键帧动画的百分比进度吗?

14

我在思考。我知道可以通过监听animationstart、animationiteration和animationend事件(显然我们在那里缺少浏览器前缀)来检测CSS动画何时开始、完成或重复,例如:

document.getElementById('identifier')
        .addEventListener("animationstart", function(){
          // do something...
        });

但我在想,是否有可能确定我们正在运行CSS动画的位置,例如,如何监听以下情况中到达关键帧动画50%的时间点:

<!DOCTYPE html>
<html>
<head>
<style>
#animateDiv {
    width: 100px;
    height: 100px;
    background-color: red;
    position: relative;
    animation-name: example;
    animation-duration: 4s;
}

@keyframes example {
    0%   {background-color:red; left:0px; top:0px;}
    25%  {background-color:yellow; left:200px; top:0px;}
    50%  {background-color:blue; left:200px; top:200px;}
    75%  {background-color:green; left:0px; top:200px;}
    100% {background-color:red; left:0px; top:0px;}
}
</style>
</head>
<body>
<div id="animateDiv"></div>
<script>
// what do I do here? How do I listen for the 50% event of the keyframes?
document.getElementById('animateDiv').addEventListener('animation at 50%?', function() {
 console.log('got it');
})
</script>
</body>
</html>

我不这么认为。除非你在动画旁边运行一个并发计时器函数。 - Paulie_D
1
https://dev59.com/xmMl5IYBdhLWcg3w76oI - Andrew Bone
1
http://codepen.io/Zeaklous/pen/GwBJa - Afsar
https://css-tricks.com/controlling-css-animations-transitions-javascript/ - CBroe
3个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
5
我不知道你是否可以从CSS动画中获取确切的关键帧,但是你可以使用一些数学方法来获取它,就像我们的朋友Paulie_D建议的那样。 根据你的代码,你的动画持续4秒,所以动画的50%关键帧在2秒后。
//......
//when the animation starts....
setTimeout(function(){
      //Enter your stuff here
}, 2000); //2 seconds delay, considering your animation length = 4s;
你还可以使用(需要jQuery):
$("#animated_element").bind("half_animation", function(){
      //Ya stuff here
});
//.........
//When the animation starts...
setTimeout(function()
{
     $("#animated_element").trigger("half_animation");
}, 2000);

或者:

$("#animated_element").bind("half_animation", function(){
      once = 0;
      setTimeout(function()
      {
           //Ya stuff here....
      }, 2000)
});
//........
//When the animation starts
$("#animated_element").trigger("half_animation");

1

这是我的看法。

  1. 获取动画持续时间。
  2. 像Vini建议的那样,加入一些数学。
  3. setTimeout()

代码:

const fn_runAtKeyframe = (DOMElement, keyframe, callback) => {
  const animationDuration = window.getComputedStyle(DOMElement).animationDuration;
  // animationDuration returns string, e.g. "5s" or "500ms", so need to parseInt()
  // if it is in seconds, change it to milliseconds
  let animationKeyframe
  if (animationDuration.replace(/[0-9]/g, '') === "s") {
    animationKeyframe = parseInt(animationDuration) * keyframe * 1000
  } else {
    animationKeyframe = parseInt(animationDuration) * keyframe
  }

  const doStuff = (e) => {
    setTimeout(() => {
      console.log(`Function "${callback.name}" will run at ${keyframe*100}% keyframe`)
      callback();
    }, animationKeyframe)
  }
  DOMElement.addEventListener("animationstart", doStuff); 
  // or use "animationiteration" depending on your usecase
}
运行它,
const animateDiv = document.querySelector("#animateDiv")
const keyframe = 0.5 // at 50% keyframe
const callback = () => {
  // do stuff here...
};
fn_runAtKeyframe(animateDiv, keyframe, callback)

0
就像Vini所说的,你有这个机会,我为自己做了这个,你可以根据需要更改"animation-play-state:"来实现任何功能。
//Animation pause at specific percentage, Example: pauseAnimationAt("myDiv",33,10)
    function pauseAnimationAt(l,p,d){
      percentage = p/d*1000;
      function pauseAnimation(){
        setTimeout(function(){ document.getElementById(l).style="animation-play-state: paused"; }, percentage);//l = Element ID, p = percentage when you wanna stopt animation, d = Duration of animation (Yes, you need to know that)
      }
      document.getElementById(l).addEventListener("animationstart", pauseAnimation());
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,