如何实现元素每次进入viewport时重新触发动画?
解决方法
你的代码里有两个导致动画仅触发一次的问题:一是调用了observer.unobserve(element.target)把元素从观察者中移除,二是没有在元素离开视口时移除动画类,导致再次进入时类已存在,动画无法重新执行。
修改步骤如下:
- 移除
unobserve调用:这行代码会让观察者停止监听目标元素,删掉它才能保持持续监听。 - 处理元素离开视口的情况:当元素退出视口时,移除
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
相关产品推荐
相关产品推荐

