页面的显示过程分为如下几个阶段:node
reflow:当render树的一部分或者所有由于大小边距等问题发生改变而须要重建的过程,叫作回流
repaint:当诸如颜色背景等不会引发页面布局变化,而只须要从新渲染的过程叫作重绘浏览器
经过上述定义,能够很明显看出,重绘的代价要比回流小。重绘只涉及样式的改变,不涉及到布局。重绘就好像给人染了一个头发,而回流至关于给人作了一次整形手术缓存
最复杂的一种:获取某些属性,引起回流 不少浏览器会对回流作优化,他会等到足够数量的变化发生,在作一次批处理回流。
可是除了render树的直接变化。
当获取一些属性时,浏览器为了得到正确的值也会触发回流。这样就使得浏览器的优化失效了 这些属性包括app
offsetTop, offsetLeft, offsetWidth, offsetHeight scrollTop/Left/Width/Height, clientTop/Left/Width/Height, width,height 调用了getComputedStyle(), 或者 IE的 currentStyle
这段儿代码是抄的,哈哈,大概解释一下样式改变引发的重绘和回流布局
var s = document.body.style; s.padding = "2px"; // 回流+重绘 s.border = "1px solid red"; // 再一次 回流+重绘 s.color = "blue"; // 再一次重绘 s.backgroundColor = "#ccc"; // 再一次 重绘 s.fontSize = "14px"; // 再一次 回流+重绘, 没想到吧,改变字体大小也会回流 document.body.appendChild(document.createTextNode('abc!')); // 添加node,再一次 回流+重绘
能够看出,回流必定伴随着重绘,而重绘却能够单独出现性能
回流对性能产生了必定的影响,尽管浏览器机智地帮咱们进行了批处理,可是仍然存在着上述诸多阔怕的属性,一获取就回流。怎么解决?字体
display:none和visibility:hidden会产生回流与重绘优化
display:none指的是元素彻底不陈列出来,不占据空间,涉及到了DOM结构,故产生reflow与repaint visibility:hidden指的是元素不可见但存在,保留空间,不影响结构,故只产生repaint