前端性能优化


网页生成过程:

  1. HTML代码转化成DOM
  2. CSS代码转化成CSSOM(CSS Object Model)
  3. 结合DOM和CSSOM,生成一棵渲染树(包含每个节点的视觉信息)
  4. 生成布局(layout),即将所有渲染树的所有节点进行平面合成
  5. 将布局绘制(paint)在屏幕上
渲染:耗时的第四步(生成布局\flow)和第五步(绘制\paint)

重排(reflow)和重绘(repaint)

  • 重绘不一定重排(例如仅改变文字颜色)
  • 重排一定重绘(例如改变文字位置)

对于性能的影响

将CSS的读操作和写操作分离

提高性能的九个技巧

  1. 同上条。不要在两个读操作之间,加入一个写操作。
  2. 如果某个样式是通过重排得到的,那么最好缓存结果。
  3. 不要一条条地改变样式,而要通过改变class,或者csstext属性,一次性地改变样式。
  4. 尽量使用离线DOM,而不是真实的DOM来改变元素样式。
    • 例如操作Document Fragment对象,完成后再把这个对象加入DOM。
    • 例如使用 cloneNode() 方法,在克隆的节点上进行操作,然后再用克隆的节点替换原始节点。
  5. 先将元素设为display: none(需要1次重排和重绘),然后对这个节点进行100次操作,最后再恢复显示(需要1次重排和重绘)。这样就用两次重新渲染,取代了可能高达100次的重新渲染。
  6. position属性为absolute或fixed的元素,重排的开销会比较小,因为不用考虑它对其他元素的影响。
  7. 只在必要的时候,才将元素的display属性为可见,因为不可见的元素不影响重排和重绘。(visibility : hidden的元素只对重绘有影响,不影响重排。)
  8. 使用虚拟DOM的脚本库,比如React等。
  9. 使用 window.requestAnimationFrame()、window.requestIdleCallback() 这两个方法调节重新渲染(详见后文)。

window.requestAnimationFrame()*

可以将某些代码放到下一次重新渲染时执行。

window.requestIdleCallback()*

指定只有当一帧的末尾有空闲时间,才会执行回调函数。
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容