You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用linear时间函数时animationend事件为何延迟触发?

解决animationend事件延迟触发问题

你的需求是让animationend在动画视觉完成的瞬间立即触发,但即使使用linear缓动也没解决延迟问题。这是因为你的动画首尾关键帧(0%和100%)的letter-spacing值完全一致,浏览器可能会因为这个原因延迟或不准确地触发animationend事件。

可行解决方案

方案1:微调动画关键帧,打破首尾属性一致性

修改动画的100%帧属性,设置一个和初始值极其接近但有微小差异的数值,让浏览器能精准识别动画结束节点:

@keyframes morph {
  0% {
    letter-spacing: -500px;
  }
  40% {
    letter-spacing: 0px;
  }
  60% {
    letter-spacing: 0px;
  }
  100% {
    letter-spacing: -500.01px; /* 微小差异触发精确结束判断 */
  }
}

这个改动不会影响视觉效果,但会让浏览器准确捕捉动画结束时刻,animationend会在视觉完成瞬间触发。

方案2:手动监听动画状态,自定义触发时机

通过requestAnimationFrame实时检测元素的计算样式,当达到目标状态时手动执行回调,完全规避原生事件的延迟问题:

const aniElement = document.querySelector('h1.ani');

function checkAnimationComplete() {
  const style = window.getComputedStyle(aniElement);
  const currentSpacing = parseFloat(style.letterSpacing);
  // 考虑浮点精度误差,判断是否接近目标值
  if (Math.abs(currentSpacing + 500) < 0.1) {
    console.log("invoked");
    return;
  }
  requestAnimationFrame(checkAnimationComplete);
}

// 启动监听
checkAnimationComplete();

这种方式完全由你控制触发时机,适合需要更灵活动画控制的场景。

内容的提问来源于stack exchange,提问作者Mohammed Malleck

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 08:02:34