h5 - requestAnimationFrame

140 阅读1分钟

requestAnimationFrame 介绍

requestAnimationFrame()用于执行每一帧的回调函数,和setInterval、setTimeout使用上是一样的,只不过时间间隔是固定的一帧不需要传入,它也是宏任务

requestAnimationFrame 语法

同定时器一样都有返回值,通过cancelAnimationFrame取消,使用也同定时器相同

let timer = requestAnimationFrame(fn);
cancelAnimationFrame(timer)

requestAnimationFrame 特性

  1. 屏幕的刷新频率为60HZ也就是(1000/60 = 16.7)16.7ms会刷新一次,requestAnimationFrame回调函数执行会与浏览器屏幕刷新相匹配以达到不卡帧的情况,可以让动画更平滑
  2. 后台标签页或者隐藏的iframe标签,requestAnimationFrame() 会被暂停调用以提升性能和电池寿命,也就是说可以节省浏览器cpu消耗和内存消耗

与 setInterval、setTimeout 对比

定时器也可以做到每 16.7ms 执行一次,那为什么要出现 requestAnimationFrame?
这是因为 js属于单线程 而定时器有属于js异步中的宏任务,在同步(微任务)执行结束之后才会执行,所以没办法精准都控制在16.7ms这个时间段,相比之下requestAnimationFrame根据浏览器的绘制频率来的,采用系统的刷新间隔时间,是浏览器的宏任务,所以requestAnimationFrame 是为了解决js中定时器中时间间隔不稳定的问题,使用上也可以直接采用 requestAnimationFrame