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

如何实现元素每次进入viewport时重新触发动画?

解决方法

你的代码里有两个导致动画仅触发一次的问题:一是调用了observer.unobserve(element.target)把元素从观察者中移除,二是没有在元素离开视口时移除动画类,导致再次进入时类已存在,动画无法重新执行。

修改步骤如下:

  1. 移除unobserve调用:这行代码会让观察者停止监听目标元素,删掉它才能保持持续监听。
  2. 处理元素离开视口的情况:当元素退出视口时,移除play-animation类,这样下次进入视口时重新添加类就能触发动画。

修改后的完整代码:

var observer = new IntersectionObserver(function(entries) {
    entries.forEach(function(entry) {
      if(entry.isIntersecting === true){  
        entry.target.classList.add("play-animation");
      } else {
        // 元素离开视口时移除动画类,为下次触发做准备
        entry.target.classList.remove("play-animation");
      }
    });
  }, { threshold: [0] });

// 用querySelectorAll简化批量监听逻辑
document.querySelectorAll('.progress-ai, .progress-dw, .progress-ps, .progress-ae, .progress-xd, .progress-id').forEach(element => {
  observer.observe(element);
});

额外说明:如果你的动画是CSS动画,若设置了animation-fill-mode: forwards保留动画结束状态,可能需要调整动画逻辑(比如通过重置元素状态或重新触发动画),但多数场景下,移除再添加类就能实现重复触发的效果。

内容的提问来源于stack exchange,提问作者Bud.420

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 01:57:30