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);
 }
});