为了账号安全,请及时绑定邮箱和手机立即绑定

如何在 Web Animation API 中反转无限动画?

如何在 Web Animation API 中反转无限动画?

幕布斯6054654 2023-07-20 10:21:57
在Web Animation API中,我们可以通过Element.animate接口对元素进行动画处理。返回的Animation对象可以通过 、和进行播放、暂停或.play()反转。.pause().reverse()let img = document.querySelector('#happy-boy');const boy_animation = [    { transform: 'rotate(0)' },    { transform: 'rotate(360deg)' },];const boy_timing = {    duration: 3000,    iterations: Infinity,}let animation = img.animate(boy_animation, boy_timing);animation.reverse(); // <-- fails with DOM exception当我尝试反转()动画时出现此错误:Cannot play reversed Animation with infinite target effect end.
查看完整描述

1 回答

?
慕容森

TA贡献1853条经验 获得超18个赞

的行为reverse(),如play(),是如果动画处于“结束”,它会跳回到开头并开始播放。

reverse()意味着如果您调用它时当前时间为零(如您的示例中所示),那么它应该跳回到开头。然而,如果你的动画有无限长度,那就意味着跳到无限!

如果您只想向后运行动画的关键帧,则可以使用该direction属性。

例如:

animation.effect.updateTiming({ direction: 'reverse' });

但请注意,与 不同的是reverse(),在动画进行过程中更新方向可能会导致动画跳转位置。

如果您希望能够在动画进行过程中前后更改动画方向使其永远重复,您可以:

  1. 设置一个非常长的迭代计数并在该范围的中间开始动画,或者

  2. 使用updateTiming({ direction: 'reverse' })并调整currentTime使其不会跳跃。像下面这样的东西可能会起作用:

     const ct = animation.effect.getComputedTiming();
     animation.currentTime =
         ct.currentInteration * ct.duration +
         (ct.duration - ct.localTime % ct.duration);

updateTiming进一步注意,如果动画异步运行(例如大多数变换和不透明动画),即使使用 (2) 中的 as 也可能导致动画稍微跳跃,因为 Javascript 运行的主线程上的计时之间可能存在一些小延迟以及运行动画的线程/进程。

使用(1)(或)reverse()中的 as可以避免该问题,因为它会在更新任何异步动画之前对其进行同步。updatePlaybackRate()


查看完整回答
反对 回复 2023-07-20
  • 1 回答
  • 0 关注
  • 94 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信