粥里有勺糖

vuePress-theme-reco 粥里有勺糖    2018 - 2023
粥里有勺糖 粥里有勺糖

Choose mode

  • dark
  • auto
  • light
关于我
备战春秋
  • 心得总结
  • 校招考点汇总
  • 面经汇总
  • 复习自查
技术笔记
  • 技术教程
  • 模板工程
  • 源码学习
  • 技术概念
  • 个人作品
  • 学习笔记
计算机基础
  • 算法与数据结构
  • 操作系统
  • 计算机网络
  • 设计模式
  • 剑指offer
大前端
  • javascript
  • vue
  • html
  • css
  • 🌏浏览器专题
  • Web性能优化
  • regexp
  • node
面试
  • 问解
  • javascript
  • css
  • 手撕代码
  • 性能优化
  • 综合问题
  • 面经汇总
  • 小程序
手撕代码
  • 数据结构与算法
  • javascript
  • css
个人站点
  • GitHub (opens new window)
  • 博客园 (opens new window)
  • 掘金 (opens new window)
线上作品
  • 轻取(文件收集) (opens new window)
  • 个人图床 (opens new window)
  • 考勤小程序 (opens new window)
  • 时光恋人 (opens new window)
  • 在线简历生成 (opens new window)
留言板
Github (opens new window)
author-avatar

粥里有勺糖

285

文章

40

标签

关于我
备战春秋
  • 心得总结
  • 校招考点汇总
  • 面经汇总
  • 复习自查
技术笔记
  • 技术教程
  • 模板工程
  • 源码学习
  • 技术概念
  • 个人作品
  • 学习笔记
计算机基础
  • 算法与数据结构
  • 操作系统
  • 计算机网络
  • 设计模式
  • 剑指offer
大前端
  • javascript
  • vue
  • html
  • css
  • 🌏浏览器专题
  • Web性能优化
  • regexp
  • node
面试
  • 问解
  • javascript
  • css
  • 手撕代码
  • 性能优化
  • 综合问题
  • 面经汇总
  • 小程序
手撕代码
  • 数据结构与算法
  • javascript
  • css
个人站点
  • GitHub (opens new window)
  • 博客园 (opens new window)
  • 掘金 (opens new window)
线上作品
  • 轻取(文件收集) (opens new window)
  • 个人图床 (opens new window)
  • 考勤小程序 (opens new window)
  • 时光恋人 (opens new window)
  • 在线简历生成 (opens new window)
留言板
Github (opens new window)
  • Css

    • 简介
    • 伪元素
    • 伪类
    • 选择器
    • 伪元素before与after
    • 实现表格斑马纹
    • 回流与重绘
    • 盒模型
    • 弹性布局
    • CSS层级关系
    • BFC
    • IFC

回流与重绘

vuePress-theme-reco 粥里有勺糖    2018 - 2023

回流与重绘

粥里有勺糖 2020-04-14 大前端CSS

# 回流与重绘

# 浏览器的渲染过程

  1. 解析HTML-->DOM树,解析CSS-->CSSOM树
  2. DOM树 + CSSOM树 --> Render Tree(渲染树)
  3. 回流(Layout):根据生成的渲染树,回流得到节点的几何信息(位置,尺寸)
  4. 重绘(Painting):根据渲染树与回流得到的节点几何信息,得到节点的绝对像素
  5. 将像素发送给GPU绘制,然后展示在页面上

# 生成渲染树过程

  1. 从DOM根节点开始遍历每个可见的节点
    • 不可见节点:
      • 不能渲染输出的节点:link,script,meta等等
      • 使用css隐藏的节点:display:none;
  2. 对于每个节点在CSSOM树中找到对应的规则并应用
  3. 根据每个可见节点与其对应的css样式,组合生产渲染树

# 回流

计算可见的Dom节点在设备视口的位置和尺寸,这个计算阶段就是回流

为了知道每个可见节点在视口的确切大小和位置,浏览器从渲染树的根节点进行遍历

# 重绘

经过生成的渲染树和回流阶段,得到了所有可见节点具体的几何信息与样式,然后将渲染树的每个节点转换成屏幕上的实际像素,这个阶段就叫重绘节点

# 回流与重绘何时发生?

# 回流

  • 页面第一次加载时
  • 浏览器窗口尺寸变化
  • 页面布局发生变化
    • 添加/删除可见元素
  • 节点几何信息发生变化
    • 元素的位置发生变化
    • 元素的尺寸(外/内边框,外边距,高/宽)
    • 内容发生变化
      • 文本
      • 图片(被另一尺寸图片替换)

# 重绘

  • 回流一定触发重绘
  • 可见节点样式发生改变

回流一定触发重绘,重绘不一定触发回流

# 如何减少回流与重绘

# 最小化重绘与重排

  1. 减少发生次数:合并多次修改
const e = document.querySelector('#test')
e.style.color = 'white'
e.style.fontSize = '18px'
1
2
3
  • cssText
    const e = document.querySelector('#test')
    e.style.cssText += 'color:white;font-size:18px;'
    
    1
    2
  • class
    const e = document.querySelector('#test')
    el.className +='active'
    
    1
    2

# 批量修改DOM

需要对dom进行一系列修改时候,减少回流重绘次数方案

  1. 使元素脱离文档流
  2. 进行修改
  3. 将元素放回源文档中

脱离文档流的方式

  • 隐藏元素
  • 使用DocumentFragment构建一个子树,然后拷贝会源文档(document.createDocumentFragment())
  • 拷贝元素到脱离文档流的节点中,修改节点后,在替换原来的节点
  • 绝对定位
  • 浮动
  • 固定定位

# 其它

  • 避免频繁使用 style,而是采用修改class的方式
  • resize、scroll 等时间进行防抖或者节流处理
  • 添加 will-change: tranform:让渲染引擎为其单独实现一个图层,当这些变换发生时,仅仅只是利用合成线程去处理这些变换,而不牵扯到主线程,大大提高渲染效率
  • 动画使用 transform 实现

参考

你真的了解回流和重绘吗? (opens new window)
掘金(三元大佬):浏览器灵魂之问,请问你能接得住几个? (opens new window)

Edit this page (opens new window)
Last Updated: 2022/5/15 12:46:34