优化实战 第 15 期 - 巧用浏览器的绘制周期做优化

810 阅读1分钟

为什么会出现卡顿

  • 什么是FPS

    浏览器每秒绘制的帧数,也可以理解为每秒画面的更新次数

    目前大多数设备的屏幕刷新率为 60次/秒,也就是说每 1000 / 60 ≈ 16.67ms 浏览器绘制一次

  • 卡顿原理

    页面是一帧一帧绘制出来的

    当每秒绘制的帧数 FPS 达到 60 时,页面是流畅的,小于这个值时,用户就会感觉到卡顿

  • 为双核浏览器指定默认渲染内核

    <meta name="renderer" content="webkit">
    

浏览器的绘制周期

  • requestAnimationFrame() 的作用

    告诉浏览器,我们希望执行一个动画,并且要求浏览器在下次重绘之前调用指定的回调函数来更新动画

    充分利用显示器的刷新机制,以节省系统资源

  • 基本语法

    const requestId = window.requestAnimationFrame(callback)
    
    // 取消动画帧请求
    window.cancelAnimationFrame(requestId)
    

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

    回调函数执行次数通常是每秒 60 次(与浏览器的屏幕刷新次数相匹配)

  • 性能解析

    为了提高性能和电池的寿命,在大多数浏览器里,后台标签页、隐藏或不可见的元素中,该方法会被暂停调用

滚动到页面顶部

{
  let requestId = null
  const scrollToTop = () => {
    const height = document.documentElement.scrollTop || document.body.scrollTop
    if (height > 0) {
      requestId = window.requestAnimationFrame(scrollToTop)
      window.scrollTo(0, height - height / 8)
    } else {
      window.cancelAnimationFrame(requestId)
    }
  }
  scrollToTop()
}

注意事项

如果想在浏览器下次重绘之前继续更新下一帧动画,那么回调函数自身必须再次调用 window.requestAnimationFrame()

一起学习,加群交流看 沸点