使用原生 javascript 监听滚动事件,当视口首次到达目标元素位置时精确触发一次计数更新,并自动移除监听器,避免重复执行。
在网页交互开发中,常需实现“滚动触发动画”或“进入可视区域后计数”的效果,而关键在于仅执行一次——例如统计用户是否已浏览到某模块。以下是一个不依赖任何第三方库的轻量、健壮的实现方案。
目标区域:请向下滚动至此
计数器当前值:0
/* CSS(增强可观察性) */
.oops {
border: solid red 1px;
padding: 40px;
margin: 80vh 0; /* 确保需滚动才能到达 */
background-color: #fff9f9;
}// JavaScript(原生实现)
let counter = 0;
const counterDisplay = document.getElementById('counter-display');
const section = document.querySelector('#counter-section');
if (section) {
const sectionTop = section.offsetTop;
const handleScroll = () => {
if (window.scrollY >= sectionTop) {
counter++;
counterDisplay.textContent = counter;
// ✅ 关键:移除自身监听器,保证仅执行一次
window.removeEventListener('scroll', handleScroll);
}
};
window.addEventListener('scroll', handleScroll);
} else {
console.warn('目标元素 #counter-section 未找到');
}
推荐用 DOMContentLoaded 或 IntersectionObserver(进阶替代方案)。该方案简洁、可靠、零依赖,精准满足“滚动到达即更新一次”的核心需求。它不仅是计数器的基础,更是理解滚动触发机制的重要范例——状态判断 + 单次执行 + 主动清理,是前端事件控制的黄金三角。