浏览器提供的requestAnimationFrame API详解

7 min read

requestAnimationFrame(简称RAF)是一种用于动画的高效的API。它是一个函数,通常用于在浏览器中创建动画或进行UI交互,通过浏览器在每个刷新周期(通常是每秒60帧)时回调一个函数来实现动画效果,以避免重复计算和减少性能开销。

使用requestAnimationFrame需要两步:首先定义一个回调函数,第二个参数是指定在页面上执行回调函数的元素,如果未指定,则默认为window。

下面是使用requestAnimationFrame的一个简单示例:

function animate() {
  requestAnimationFrame(animate);
  //draw the animation for the next frame here
}
animate();

在这个例子中,我们定义了一个名为animate的函数来执行动画,并在函数内调用requestAnimationFrame函数。我们使用requestAnimationFrame函数的目的是让浏览器在下一次刷新时调用animate函数。这样,我们就可以在页面上以流畅的60帧刷新率运行我们的动画了。

在每个刷新周期中,RAF都会传递一个回调参数给我们,这个回调参数是一个“timestamp”(时间戳),它表示浏览器的时间。我们可以使用这个时间戳来计算我们的下一帧应该显示的内容。例如:

let previousTimestamp = 0;
function animate(timestamp) {
  requestAnimationFrame(animate);
  const timeDifference = timestamp - previousTimestamp;
  previousTimestamp = timestamp;
  //calculate the next frame and update the DOM here
}
animate();

在这个例子中,我们用前一个时间戳timestamp和当前时间的时间戳previousTimestamp之差来计算每个帧之间的时间增量。我们可以使用这个值来计算每个帧应该显示的内容,并更新页面的DOM元素。

此外,requestAnimationFrame还有其他一些优势,比如它会自动停止或暂停动画,如果页面被隐藏或缩小,它会自动停止动画,并在需要时自动恢复动画。更重要的是,requestAnimationFrame与浏览器的重绘机制协调良好,可以最大程度地减少页面重新渲染所需的CPU时间,并减少电量消耗。

总而言之,requestAnimationFrame是一种高效且易于使用的API,用于构建动画和用户交互效果。它是一种将动画与浏览器的重绘循环同步的最佳方法,可最大限度地减少资源和电池消耗,同时也可以提供出色的性能和流畅的用户体验。