页面重绘(repaint)和回流(reflow)

简介:

前言

页面显示到浏览器上的过程:

1.1、生成一个DOM树。

浏览器将获取到的HTML代码解析成1个DOM树,包含了所有标签,包括display:none和动态添加的节点。

1.2、生成样式结构体。

浏览器将所有样式解析成样式结构体,解析过程中会去掉浏览器不能识别的。

2、DOM树和样式结构体结合生成render树。

render树类似于DOM树,render树每个节点有自己样式(盒子模型,margin、border、padding、content),但不包含display:none和head节点,却包含visibility:hidden节点。

3、浏览器根据render树渲染页面。

重绘(repaint)和回流(reflow)

回流:当render tree中的一部分(或全部)因为元素的尺寸,布局,隐藏等改变而需要重新构建,就是回流。回流后会进行重绘。

重绘:当只是元素的外观,风格变化,不影响布局的,重新渲染的过程就叫重绘。

PS:这样重绘的代价会比回流小。

什么时候出现回流?

1、页面渲染初始化

2、添加、删除可见的DOM元素

3、元素尺寸、位置变化

4、窗口resize

浏览器对回流、重绘优化

浏览器都会优化重绘和回流的操作。浏览器会把所有会引起回流、重绘的操作放入1个队列中,等队列中的操作到了一定的数量或者到了一定的时间间隔,浏览器就会flush队列,进行一个批处理。这样就会让多次的回流、重绘变成一次回流重绘。

另外,当我们取一些属性值时,类似offsetWidth、clientWidth、width等,会导致浏览器提前flush队列,只为了取到正确的值,即便是队列里的操作不影响所取的值。

减少回流、重绘

1、修改样式和添加DOM元素时,批量处理。

2、取offsetWidth等属性值,缓存到变量,少去取值。

3、将元素脱离文档流。

PS:第3点我并未查找到相关证据,持保留态度。

总结

现在写前端代码的,大多很随心所欲,还一般都不出问题,因为一旦糟糕到程序异常,通常也就醒悟了。 



本文转自 海角在眼前 博客园博客,原文链接:  http://www.cnblogs.com/lovesong/p/8046730.html ,如需转载请自行联系原作者

相关文章
|
8月前
|
前端开发
重绘 ( Repaint) 和回流 ( Reflow)
首先了解 重绘 ( Repaint) 和回流 ( Reflow)其实是关乎到浏览器性能的问题 重绘和回流是渲染步骤中的⼀⼩节,但是这两个步骤对于性能影响很大 重绘和回流的过程都需要浏览器耗费大量的计算资源,过多的使用会导致网页性能下降
41 1
|
4月前
|
缓存 JavaScript 前端开发
客户端渲染页面、DOM重绘和回流、避免DOM的回流
客户端渲染页面、DOM重绘和回流、避免DOM的回流
17 0
|
10月前
|
缓存 JavaScript 前端开发
浏览器:重绘(repaint)与回流/重排(reflow)
浏览器:重绘(repaint)与回流/重排(reflow)
58 0
|
6月前
|
缓存 前端开发 JavaScript
重绘与重排(回流)
重绘与重排(回流)
38 0
|
9月前
|
缓存 JavaScript 前端开发
【怎么理解回流与重绘?以及触发场景】
【怎么理解回流与重绘?以及触发场景】
107 0
|
前端开发
|
前端开发 JavaScript
解决<canvas />在页面重绘的问题
解决canvas标签在页面重绘的问题
解决<canvas />在页面重绘的问题
|
JavaScript 前端开发
【前端工程师手册】学习回流和重绘(reflow和repaint)
【前端工程师手册】学习回流和重绘(reflow和repaint)
|
Web App开发 缓存 JavaScript