滚动至#about区域时JavaScript动画未触发,求问题原因
你的代码存在几个关键问题,导致动画无法正常触发:
条件判断逻辑完全错误
!window.scrollY > document.querySelector('#about')里,document.querySelector('#about')返回的是DOM元素对象,并非可与window.scrollY(滚动距离数值)直接比较的数值。这种跨类型比较会得到无效结果(元素会被转为NaN),导致条件永远不符合预期。正确的做法是获取
#about元素的位置信息(比如用getBoundingClientRect()),判断元素是否进入视口:const aboutEl = document.querySelector('#about'); const rect = aboutEl.getBoundingClientRect(); // 判断元素是否进入视口范围 const isInView = rect.top <= window.innerHeight && rect.bottom >= 0;this指向丢失
setTimeout(this.startDelay, 300)中,this在setTimeout的回调里会指向全局对象(window),而非你的类实例。再次调用startDelay时,this.start()会找不到对应方法,直接报错。解决方法是绑定this,或者使用箭头函数:
setTimeout(() => this.startDelay(), 300); // 或者 setTimeout(this.startDelay.bind(this), 300);监听逻辑不合理
用递归setTimeout轮询滚动状态的性能很差,而且如果没有在页面初始化时主动调用startDelay(),这个函数根本不会启动。更合理的方式是监听scroll事件,在滚动时判断元素是否在视口内,触发动画后移除监听避免重复执行。逻辑取反错误
就算条件能正确判断滚动位置,!window.scrollY > ...的逻辑也不符合需求。!window.scrollY会把滚动距离转为布尔值(滚动距离为0时是true,否则是false),再和元素比较,完全无法实现“滚动到#about区域时启动动画”的目标。
内容的提问来源于stack exchange,提问作者Marco Kurepa

