浏览器的渲染机制以及性能优化,重绘与回流(重排)

125 阅读3分钟

一、HTML怎么加载

1. 在页面加载时,浏览器把获取到的HTML代码解析成一颗DOM树,DOM树里包含了所有HTML

标签,包括display:none隐藏,还有用JS动态添加的元素等。

2. 浏览器把所有样式(用户定义的CSS和用户代理)解析成样式结构体

3. DOM Tree 和样式结构体组合后构建render tree, render tree类似于DOM tree,但区别很

大,因为render tree能识别样式,render tree中每个NODE都有自己的style,而且render tree不

包含隐藏的节点(比如display:none的节点,还有head节点),因为这些节点不会用于呈现,而且

不会影响呈现的,所以就不会包含到 render tree中。简单说就是DOM Tree和我们写的CSS结合

在一起之后,渲染出了render tree。

二、回流(重排)

回流(reflow):当render tree中的元素的宽高、布局、显示、隐藏或元素内部文字结结构 发生改变时,会影响自身及其父元素、甚至追溯到更多的祖先元素发生改变,则会导致元素内部、 周围甚至整个页面的重新渲染,页面发生重构,回流就产生了。

三、重绘

重绘(repaint):元素的结构(宽高、布局、显示隐藏、内部文字大小)未发生改变,只是 元素的外观样式发生改变,比如背景颜色、内部文字颜色、边框颜色等。此时会引起浏览器重绘, 显然重绘的速度快于回流。

四、区别

回流必将引起重绘,而重绘不一定会引起回流。例如:只有颜色改变的时候就只会发生重绘 而不会引起回流。

当页面布局和几何属性改变时就需要回流。例如:添加或者删除可见的DOM元素,元素位置 改变,元素尺寸改变——边距、填充、边框、宽度和高度,内容改变。 每个页面至少需要一次回流,就是在页面第一次加载的时候,这时就是回流,因为要构建 render tree。在回流的时候,浏览器会使渲染树中受到影响的部分失效,并重新构造这部分渲染 树,完成回流后,浏览器会重新绘制受影响的部分到屏幕中,这就是重绘。

五、游览器性能优化

  • 首先浏览器本身对UI渲染是优化,它会把要绘制的东西放在队列中异步渲染
  • 我们程序员也可以去优化
    • 可以在操作之后把这块东西隐藏,然后做好再显示(display)
    • 不要频繁行内样式(div.style.color ,div.style) 而是用className div.className = ''
    • 克隆元素可以复用之前的各种东西
    • 可以把要操作的东西脱离文档流(position:fixed)
    • 文档片段 (documentFragment) 先不要直接操作DOM树,先把所有操作在文档片段做好,再把文档片段加入到DOM树