作者: hhhhhanako | 来源:发表于2018-08-27 20:14 被阅读0次

    前端性能优化


    网页生成过程:

    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()*

    指定只有当一帧的末尾有空闲时间,才会执行回调函数。

    相关文章

      网友评论

          本文标题:

          本文链接:https://www.haomeiwen.com/subject/bxotwftx.html