page contents

对requestAnimationframe的理解?

轩辕小不懂 发布于 2021-12-01 15:02
阅读 465
收藏 0
分类:WEB前端开发
  • CSS
  • 2546
    Nen
    Nen
    - 程序员

    实现动画效果的方法比较多,Javascript 中可以通过定时器 setTimeout 来实现,CSS3 中可以使用 transition 和

    animation 来实现,HTML5 中的 canvas 也可以实现。除此之外,HTML5 提供一个专门用于请求动画的API,那

    就是 requestAnimationFrame,顾名思义就是请求动画帧。

    MDN对该方法的描述:

    window.requestAnimationFrame() 告诉浏览器——你希望执行一个动画,并且要求浏览器在下次重绘之前调用指定的回调函数更新

    动画。该方法需要传入一个回调函数作为参数,该回调函数会在浏览器下一次重绘之前执行。

    语法: window.requestAnimationFrame(callback); 其中,callback是下一次重绘之前更新动画帧所调用的
    函数(即上面所说的回调函数)。该回调函数会被传入DOMHighResTimeStamp参数,它表示
    requestAnimationFrame() 开始去执行回调函数的时刻。该方法属于宏任务,所以会在执行完微任务之后再去执
    行。
    取消动画: 使用cancelAnimationFrame()来取消执行动画,该方法接收一个参数——requestAnimationFrame默
    认返回的id,只需要传入这个id就可以取消动画了。
    优势:
    CPU节能:使用SetTinterval 实现的动画,当页面被隐藏或最小化时,SetTinterval 仍然在后台执行动画任务,由于此时页面处于不可见或不
    可用状态,刷新动画是没有意义的,完全是浪费CPU资源。而RequestAnimationFrame则完全不同,当页面处理未激活的状态下,该页面的屏
    幕刷新任务也会被系统暂停,因此跟着系统走的RequestAnimationFrame也会停止渲染,当页面被激活时,动画就从上次停留的地方继续执
    行,有效节省了CPU开销。
    函数节流:在高频率事件( resize, scroll 等)中,为了防止在一个刷新间隔内发生多次函数执行,RequestAnimationFrame可保证每个刷新间隔
    内,函数只被执行一次,这样既能保证流畅性,也能更好的节省函数执行的开销,一个刷新间隔内函数执行多次时没有意义的,因为多数显示
    器每16.7ms刷新一次,多次绘制并不会在屏幕上体现出来。
    减少DOM操作:requestAnimationFrame 会把每一帧中的所有DOM操作集中起来,在一次重绘或回流中就完成,并且重绘或回流的时间间隔
    紧紧跟随浏览器的刷新频率,一般来说,这个频率为每秒60帧。
    setTimeout执行动画的缺点:它通过设定间隔时间来不断改变图像位置,达到动画效果。但是容易出现卡顿、抖
    动的现象;原因是:
    settimeout任务被放入异步队列,只有当主线程任务执行完后才会执行队列中的任务,因此实际执行时间总是比设定时间要晚;
    settimeout的固定时间间隔不一定与屏幕刷新间隔时间相同,会引起丢帧。
    请先 登录 后评论