页面渲染性能控制-重绘与回流

浏览器解析代码过程

页面的显示过程分为如下几个阶段:node

  1. 生成DOM树(包括display:none的节点)
  2. 在DOM树的基础上根据节点的集合属性(margin,padding,width,height等)生成render树(不包括display:none,head节点,可是包括visibility:hidden的节点)
  3. 在render树的基础上继续渲染颜色背景色等样式

reflow:当render树的一部分或者所有由于大小边距等问题发生改变而须要重建的过程,叫作回流
repaint:当诸如颜色背景等不会引发页面布局变化,而只须要从新渲染的过程叫作重绘浏览器

经过上述定义,能够很明显看出,重绘的代价要比回流小。重绘只涉及样式的改变,不涉及到布局。重绘就好像给人染了一个头发,而回流至关于给人作了一次整形手术缓存

什么会引发回流

  1. 页面渲染初始化
  2. DOM结构变化,脸上整得亲妈都认不出来了,因此会引起回流
  3. render树变化,好比减小了padding,增长border等等,改变页面布局了
  4. 窗口resize事件触发
  5. 最复杂的一种:获取某些属性,引起回流 不少浏览器会对回流作优化,他会等到足够数量的变化发生,在作一次批处理回流。
    可是除了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,再一次 回流+重绘

能够看出,回流必定伴随着重绘,而重绘却能够单独出现性能

回流对性能产生了必定的影响,尽管浏览器机智地帮咱们进行了批处理,可是仍然存在着上述诸多阔怕的属性,一获取就回流。怎么解决?字体

减小回流

  1. 避免逐项更改样式。最好一次性更改style属性,或者将样式列表定义为class并一次性更改class属性。
  2. 避免循环操做DOM。建立一个documentFragment或div,在它上面应用全部DOM操做,最后再把它添加到window.document。
  3. 避免屡次读取offsetLeft等属性。没法避免则将它们缓存到变量。
  4. 将复杂的元素绝对定位或固定定位,使它脱离文档流。不然回流代价十分高

display:none和visibility:hidden会产生回流与重绘优化

display:none指的是元素彻底不陈列出来,不占据空间,涉及到了DOM结构,故产生reflow与repaint
visibility:hidden指的是元素不可见但存在,保留空间,不影响结构,故只产生repaint
相关文章
相关标签/搜索