requestAnimationFrame
这个方法会告诉浏览器要执行动画 了,于是浏览器可以通过最优方式确定重绘的时序。
requestAnimationFrame()方法接收一个参数,此参数是一个要在重绘屏幕前调用的函数。
cancelAnimationFrame
与 setTimeout()类似,requestAnimationFrame()也返回一个请求 ID,可以用于通过另一个 方法 cancelAnimationFrame()来取消重绘任务。
let requestID = window.requestAnimationFrame(() => {
console.log('Repaint!');
});
window.cancelAnimationFrame(requestID);通过 requestAnimationFrame 节流
这样,计时器可以限制实际的操作执行间隔,而 requestAnimationFrame 控制 在浏览器的哪个渲染周期中执行。下面的例子可以将回调限制为不超过 50 毫秒执行一次:
let enabled = true;
function expensiveOperation() {
console.log('Invoked at', Date.now());
}
window.addEventListener('scroll', () => {
if (enabled) {
enabled = false;
window.requestAnimationFrame(expensiveOperation);
window.setTimeout(() => enabled = true, 50);
}
});