我正在尝试建立一个视差网站,它会在滚动网站时移动一些元素。但是,在阅读了Paul Irish的这篇文章以及这段视频说滚动侦听器有点错误之后,我没有使用滚动事件侦听器,而是使用requestAnimationFrame
。我的问题是:
- 它在Chrome中看起来很流畅,但在Firefox中闪烁得很厉害。我在这里做错了什么吗?
- 我的代码实际上是否比使用普通滚动事件侦听器占用更多资源?每次我玩这个代码时,我都能听到我的笔记本电脑风扇在燃烧。
我的文件位于 http://www.socialbuzz.com.au/index.html,请滚动到页面底部以查看从javascript操作的元素。
你应该有一个滚动事件触发requestAnimationFrame循环。不要让 requestAnimationFrame 由滚动事件本身触发。你应该有一个类似变量滚动的东西 = true;发生这种情况时,运行 requestAnimationFrame 循环,该循环引用滚动事件中的事件数据。完成后,您需要对滚动事件进行去抖动以关闭循环,这是一件苦差事,但结果是值得的。希望这有帮助。
您不是在执行动画;也就是说,您不会在没有用户交互的情况下连续修改图形。仅当用户滚动时,才会对页面进行操作,并且在用户停止滚动后不会继续。因此,使用 requestAnimationFrame
没有任何好处,您应该坚持使用简单的事件处理程序。
requestAnimationFrame
的目的是为连续动画提供最佳行为;它的优点在这里都不适用。如果循环的每个步骤都以某种方式更新图形,则循环requestAnimationFrame
在循环内不执行任何操作(如您当前拥有的(是完全合适的,但是由于当用户不滚动时,此处没有任何变化,因此循环除了浪费 CPU 时间外什么都不做。
何时应该使用 requestAnimationFrame
的一个例子是,如果您的元素故意落后于滚动并在片刻后赶上。追赶动画应在从滚动事件处理程序启动的requestAnimationFrame
循环中完成,并且该循环应在追赶完成时自行停止。
我也有过类似的经历,在多次尝试鼠标移动侦听器和setInterval
以增加动画步骤的频率之后,我又回到了只使用onscroll
,发现在FF10和FF 15上它工作得很好。
也许我的要求与您的要求不同 - 它是一个跟踪滚动条的元素,因此 onscroll 是更改框位置的提示。 它在FF上落后并且生涩,但在WebKit和IE上运行良好。 我发现onscroll
在FF上不像在Chrome/IE上那样频繁地触发。
当我最初尝试这样做时,它会在 FF 5 或 6 上。 使用鼠标移动侦听器或频繁的间隔,我能够增加调用句柄滚动函数的频率 - 但这实际上具有使定位看起来不稳定的效果。 现在在 10 ESR 和 15 上使用 onscroll 似乎对我有用,也许他们修复了一些东西。