我知道这个问题是前一段时间被问到的,但是,性能问题仍然存在。以下是不依赖滚动事件侦听器的替代解决方案。这最大限度地减少了由 Web 浏览器中常见的单独滚动线程引起的卡顿和延迟,定期更新 css,而不是在滚动窗口时。这意味着不会显示开发控制台警告。我个人不会太担心警告或使用滚动事件来处理诸如转动齿轮或更改css类之类的小事情,但是,如果用户体验直接依赖于效果,则会破坏页面的可用性。
var gear;
var lastPosition;
var refreshRate = 60; // fps; reduce for less overhead
var animation = "rotate(*deg)"; // css style to apply [Wildcard is *]
var link = 0.5; //what to multiply the scrollTop by
function replace(){
if(lastPosition != document.body.scrollTop){ // Prevents unnecessary recursion
lastPosition = document.body.scrollTop; // updates the last position to current
gear.style.transform = animation.replace("*", Math.round(lastPosition * link)); // applies new style to the gear
}
}
function setup(){
lastPosition = document.body.scrollTop;
gear = document.querySelector(".gear");
setInterval(replace, 1000 / refreshRate); // 1000 / 60 = 16.666... Invokes function "replace" to update for each frame
}
window.addEventListener("DOMContentLoaded", setup);
可以在我的 GitHub 上使用一个工作示例。我已经在 Firefox、Chrome 和 Edge(有效)上对其进行了测试。
避免警告的其他替代方法是使用css 粘性元素或使用与window.onscroll事件相关联的element.classList.add()和element.classList.remove()方法。
注意:使用 css 转换时要小心,如果转换的长度大于脚本更新 CSS 样式的间隔(例如基于滚动事件的更改)。基于 Webkit 的浏览器和 EdgeHTML 会以意想不到的方式运行,通常会停留在它们的初始位置,直到元素停止被脚本更新。除非这是您想要的效果,在这种情况下,它在 Firefox 中的工作方式不同。
Servo Webrender 集成到 Firefox 后将在一定程度上解决这些问题(或者至少可以相当大地提高性能)。虽然仍然会有其他浏览器来保持兼容性。