You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
DOM Tree 与 Render Tree 区别在于:
DOM 树中的各节点对应 HTML 代码中的每个 tag 标签,其根节点是 document 对象。DOM 树里包含了所有 HTML 标签,包括display:none ,还有用JS动态添加的元素等。
Render Tree 能识别样式,Render Tree 中每个 NODE 都有自己的 style,而且 Render Tree 不包含隐藏节点和其他不进行渲染的节点 (比如 display:none的节点,还有 head 节点),因为这些节点不会用于呈现,而且不会影响呈现的,所以就不会包含到 Render Tree 中。
JS深入浅出 - 浏览器的重绘(Repaint)与回流(Reflow)
参考文章:
介绍下重绘和回流(Repaint & Reflow),以及如何进行优化
前端基本功(四):性能优化之你真的懂回流、重绘与合成层吗?
你真的了解回流和重绘吗
浏览器的回流与重绘 (Reflow & Repaint)
1. 浏览器的渲染机制
渲染过程
1.1 浏览器将 HTML 解析成 DOM,把 CSS 解析成 CSSOM
1.2 将 DOM 和 CSSOM 合并,生成渲染树(Render Tree)
2.1 Layout(布局):根据渲染树,计算所有节点在页面上的大小和位置
2.2 Painting(绘制):根据渲染树以及回流得到的节点几何信息,结合节点样式,得到节点的绝对像素
生成渲染树
回流
概念
Render Tree 中部分或全部节点的几何属性发生变化(尺寸、布局、位置、隐藏等),影响到页面排版布局时,触发浏览器重新计算所有受影响节点几何信息并重新排版页面布局的过程。(对应渲染过程流程图的 Layout)
触发回流的操作(可大致分为两类)
布局变化触发的回流操作
"查询 / 调用节点几何属性"所触发的回流操作
重绘
当页面可见节点样式(此处样式不包括几何属性)发生变化且不影响页面排版布局时,触发浏览器对改变节点重新绘制的过程。(对应渲染过程流程图的 Painting + Display)
回流与重绘的关系
回流一定触发重绘,而重绘触发时不一定触发回流。
个人理解:
回流本质上是对受影响的(局部/全局)页面布局内所有节点重新计算几何信息的过程,而重绘本质上是浏览器对渲染树重新绘制的过程。
由于回流后必须将重新排版的页面布局展示到浏览器上,因此必然会经过重绘操作,而重绘操作则不会经过回流操作,从渲染过程流程图中我们也可以发现回流和重绘的触发顺序。
回流/重绘代价
浏览器进行“回流/重绘”是有代价的,但是我们又无法避免浏览器的回流和重绘(毕竟人机交互是必需的)。因此我们需要尽量指定合理的方案去触发回流和重绘。
回流/重绘优化
浏览器的优化机制
由于每次回流/重绘都会造成额外的计算消耗,因此大多数浏览器都会通过队列化修改并批量执行来优化重排过程。
但是,某些操作会强制浏览器立即清空回调队列中的回流/重绘操作:
减少回流和重绘
CSS
JavaScript
elem.style.cssText
属性),或者将样式列表定义为 class 并一次性更改class属性。总结:减少对 render tree 的操作(合并多次多DOM和样式的修改),并减少对一些 style 信息的请求,尽量利用好浏览器的优化策略。
合成层 Composite 性能优化
正常情况下浏览器渲染流程需要经过回流和重绘(对应 Layout 和 Paint),
将节点提升至合成层,有以下几个优点:
提升合成层的方式
使用 CSS 的 will-change 属性:will-change 设置为 opacity、transform、top、left、bottom、right 可以将元素提升为合成层。
CSS3 硬件加速:利用 transform 和 opacity 实现动画效果
从性能方面考虑,最理想的渲染流水线是没有布局和绘制环节的,只需要做合成层的合并即可:
%E4%B8%8E%E5%9B%9E%E6%B5%81(Reflow)/%E5%90%88%E6%88%90%E5%B1%82.png?raw=true)
%E4%B8%8E%E5%9B%9E%E6%B5%81(Reflow)/%E7%90%86%E6%83%B3%E6%B8%B2%E6%9F%93%E6%B5%81%E7%A8%8B.png?raw=true)
浏览器一般的渲染流程(简化版):
理想渲染流程:
为了实现上述效果,就需要只使用那些仅触发 Composite 的属性。目前,只有两个属性是满足这个条件的:transforms 和 opacity。
!不要盲目提升合成层
每创建一个新的渲染层,就意味着新的内存分配和更复杂的层的管理,我们通常将包含动画效果的元素(或会频繁触发回流的元素)单独提升为合成层,这样就可以减少对其它元素的影响。
The text was updated successfully, but these errors were encountered: