渲染进程各处理过程的优化点
阅读总结,尽量简短,没事看一眼。
渲染过程
- JS 处理
- JS 对 DOM CSSOM 的处理
- 样式计算
- 解析 CSS 计算每一个元素的最终样式
- 页面布局
- 样式计算结束后,开始计算每个元素的宽高、坐标
- 绘制
- 布局计算结束后,就可以开始绘制元素了,包括文本、颜色、边框、阴影、图像等
- 【渲染进程各处理过程的优化点】合成
- 根据元素的顺序进行图层合成
下面是一个 CSS 属性与布局、绘制、合成的触发关系
属性 | Blink | Gecko | Webkit |
---|---|---|---|
z-index | 绘制/合成 | 绘制/合成 | 布局/绘制/合成 |
transform | 合成 | 合成 | 布局/绘制/合成 |
opacity | 绘制/合成 | 合成 | 布局/绘制/合成 |
min-width | 布局/绘制/合成 | 布局/合成 | 布局/绘制/合成 |
color | 布局/绘制 | 布局/绘制 | 布局/绘制/合成 |
background | 布局/绘制 | 布局/绘制 | 布局/绘制/合成 |
border-radius | 布局/绘制 | 布局/绘制 | 布局/绘制/合成 |
border-style | 布局/绘制/合成 | 布局/绘制/合成 | 布局/绘制/合成 |
border-width | 布局/绘制/合成 | 布局/绘制/合成 | 布局/绘制/合成 |
样式计算优化
- 减少匹配的元素数量,尽量不要使用 * {}
- 降低选择器复杂度,尽可能的使用单一精准的类选择器
- 使用 BEM 规范(BLock、Element、Modifier),例如:.banner\_\_header_size-3 {}
触发重排的操作:
- 修改 DOM 元素的几何属性
- width、height
- padding、margin
- left、top
- 修改 DOM 树的结构
- 增加 DOM 元素
- 移动 DOM 元素
- 删除 DOM 元素
- 获取 DOM 元素的即使布局属性
- offsetWidth、offsetHeight、offsetTop、offsetLeft
- clientWidth、offsetHeight、offsetTop、offsetLeft
- scrollWidth、scrollHeight、scrollTop、scrollLeft
- window.getComputedStyle()
是针对样式而言,那么既然知道了此类操作会导致页面的回流,就应该更加谨慎的对他们进
行操作。
一个不错的方案是对 DOM 元素的几何属性的修改应该打包操作,不推荐逐条修改
el.style.top = '...' 之类的操作,应该考虑使用添加类来进行打包操作。
绘制性能评估 可以使用 chrome 的 More tools -> Rendering 来进行绘制性能的评估。
合成 影响合成性能的因素会有两个:
- 所需合成的图层数量
- 实现动画的相关属性
will-change
可以通过创建新的图层起到绘制区域最小化的优化,chrome、firefox、opera 可以通过设置
.layer {
will-change: transform;
}
来达到新增一个图层的目的;然而 safari 不支持
will-change
,所以需要使用变通的办法来创建一个图层
.layer {
transform: translate(0);
}
但别忘啦!图层数量过多也是导致合成性能低下的原因之一,所以请不要滥用
will-change
。那么对于
will-change
而言,哪些 css 属性可以受益呢?上面也提到了
will-change
是针对合成阶段的优化处理,那么非合成阶段的 css 动画属性对
will-change
而言并不会带来性能上的提升。适用于
will-change
(合成阶段)的动画包括如下:动画效果 | will-change 值 |
---|---|
变换 | transform |
透明 | opacity |
will-change
这俩会有性能上的收益。可以使用 chrome 的 More tools -> Layers 来查看站点的图层信息。
推荐阅读
- 为什么你的路演总会超时()
- JS中的各种宽高度定义及其应用
- 2020-10-18|2020-10-18 致各位慢友
- 中国MES系统软件随工业化成长
- 多线程NSOperation
- 同学聚会少了友情多了比拼,拼孩子、拼工作、比职位引发各种落差|同学聚会少了友情多了比拼,拼孩子、拼工作、比职位引发各种落差 变味的同学聚会
- 燎疳节漫想
- 每日PDCA
- 未来可期,直面疫情下的各种困境
- 「漫威之父」斯坦·李去世,回味老爷子在漫威中客串的各种角色