回流(reflow)和重绘(repaint)

781 阅读1分钟

页面的显示过程:

 1.生成DOM树(DOM TREE)

 2.加载CSS 

 3.生成渲染树(RENDER TREE),渲染树是和样式相关的 

 4.浏览器基于GPU(显卡)开始按照RENDER TREE画页面 


 重绘(repaint):

当某一个DOM元素 样式更改 (位置没变只是样式更改,例如:颜色变为红色...)浏览器会重新渲染这个元素

例子:

box.style.color = 'red'
//...
box.style.fontsize = '16px'

上面操作触发了两次重绘,性能上有所消耗,为了优化性能,我们最好一次性把需要修改的样式搞定,例如:

.xxx{
    color:'red',
    font-size:'16px'
}
box.className = 'xxx'


回流(reflow)

1.页面首次渲染

2.当DOM元素的结构或者位置发生改变(删除、增加、改变位置、改变大小......)

3.获取某些属性也会引起回流

都会引发回流,所谓回流,就是浏览器抛弃原有计算的结构和样式,从新进行DOM TREE或者RENDER TREE,非常非常非常......消耗性能


解决方案

1.避免频繁操作样式:一次性把需要修改的样式搞定

2.避免频繁操作DOM:

基于文档碎片(虚拟内存中开辟的一个容器)可以解决这个问题:每当创建一个LI,我们首先把它存在文档碎片中(千万不要放在页面中,避免回流),当我们把需要的元素都创建完成,并且都添加到文档碎片中,在统一把文档碎片放到页面中(只会引发一次回流操作)

let frg = document.createDocumentFragment();// 创建文档碎片容器