继续上篇《浏览器地址栏里输入URL后的全过程》javascript
为何要了解浏览器的渲染原理?了解浏览器的渲染原理有什么好处?咱们作前端开发为何非要了解浏览器的原理?直接把网页作出来,什么需求,直接一把梭,撸完收工很差吗。css
可是常常会有人会问,什么是重排和重绘?html
重排也叫回流(Reflow
),重绘(Repaint
),会影响到浏览器的性能,给用户的感受就是网页访问慢,或者网页会卡顿,不流畅,从而使网页访问量降低。前端
因此,想要尽量的避免重排和重绘,就须要了解浏览器的渲染原理。java
上图咱们能够看出,浏览器会解析三个模块:web
HTML
,SVG
,XHTML
,解析生成DOM
树。CSS
解析生成CSS
规则树。JavaScript
用来操做DOM API
和CSSOM API
,生成DOM Tree
和CSSOM API
。解析完成后,浏览器会经过已经解析好的DOM Tree
和 CSS
规则树来构造 Rendering
Tree
。shell
Rendering Tree
渲染树并不等同于DOM
树,由于一些像Header
或display:none
的东西就不必放在渲染树中了。浏览器
CSS
的 Rule Tree
主要是为了完成匹配并把CSS Rule
附加上Rendering
。性能优化
Tree
上的每一个Element
。也就是DOM
结点,即Frame
。而后,计算每一个Frame
(也就是每一个Element
)的位置,这又叫layout
和reflow
过程。markdown
最后经过调用操做系统Native GUI
的API
绘制。
webkit
内核的渲染流程,和整体渲染流程差很少,要构建
HTML
的
DOM Tree
,和
CSS
规则树,而后合并生成
Render Tree
,最后渲染。
Mozilla
的
Gecko
渲染引擎。
Frame
树时,二者叫法不一致,
webkit
称之为
Layout
,
Gecko
叫作
Reflow
。
HTML
,若是遇到了外链的css
,会一下载css
,一边解析HTML
。css
下载完成后,会继续解析css
,生成css Rules tree
,不会影响到HTML
的解析。<script>
标签时,一旦发现有对javascript
的引用,就会当即下载脚本,同时阻断文档的解析,等脚本执行完成后,再开始文档的解析。DOM
树和CSS
规则树已经生成完毕后,构造 Rendering Tree
。重排意味着元件的几何尺寸变了,咱们须要从新验证并计算Render Tree
。是Render Tree
的一部分或所有发生了变化。这就是Reflow
,或是Layout
。
重排由于要从新计算Render Tree
,并且每个DOM Tree
都有一个reflow
方法,一旦某个节点发生重排,就有可能致使子元素和父元素甚至是同级其余元素的reflow
,浪费大量的时间从新验证Render Tree
。
所以,重排的成本要比重绘高不少。
如下操做会致使重排或重绘。
DOM
元素节点。DOM
的位置,开启动画的时候。CSS
样式,改变元素的大小,位置时,或者将使用display:none
时,会形成重排;修改CSS
颜色或者visibility:hidden
等等,会形成重绘。offsetWidth
和offsetHeight
。若是当前网页含有一些动画,或者固定不动元素的网页时,因为滚动也会发生重排,一旦发生滚动,当前浏览器所承受的压力很大,就会形成网页的卡顿,掉帧等状况。
var bstyle = document.body.style; // cache bstyle.padding = "20px"; // reflow, repaint bstyle.border = "10px solid red"; // 再一次的 reflow 和 repaint bstyle.color = "blue"; // repaint bstyle.backgroundColor = "#fad"; // repaint bstyle.fontSize = "2em"; // reflow, repaint // new DOM element - reflow, repaint document.body.appendChild(document.createTextNode('dude!')); 复制代码
以上逻辑,几乎每一步都会形成重排或重绘,若是浏览器像这样处理的话,可能现代的浏览器没有咱们使用的那么流畅了。
所以浏览器有一个机制,会把须要重排或重绘的先积累着,而后一次性进行重排和重绘。
固然,不是全部的状况浏览器都是这样处理的,好比resize
或者修改默认字体,对于这些操做,浏览器会立马进行重排。
因此咱们在监听resize
事件时,通常咱们都会作防抖和节流。
style
的使用,对于须要操做DOM
元素节点,从新命名className
,更改className
名称。clone
元素,能够先把元素经过documentFragment
放入内存中,等操做完毕后,再appendChild
到DOM
元素中。dispaly:none
,可使用visibility:hidden
代替,dispaly:none
会形成重排,visibility:hidden
会形成重绘。Table
布局,由于一个小小的操做,可能就会形成整个表格的重排或重绘。resize
事件时,作防抖和节流处理。absolute / fixed
属性。参考文章: