美文网首页
重绘 、回流

重绘 、回流

作者: LHH大翰仔仔 | 来源:发表于2019-01-17 09:41 被阅读38次

重绘 、回流

首先了解页面的呈现流程

  1. 浏览器把获取到的HTML代码解析成一个DOM树,HTML中的每个tag都是DOM树的1个节点,根节点就是document对象(html tag)。用firebug或者IE Develop Toolbar等工具可看到DOM树,包括display:none隐藏,还有js动态添加的元素;
  2. 浏览器把所有样式(主要包括css和浏览器的样式设置)解析成样式结构体。在解析过程中会去掉浏览器不能识别的样式,比如IE会去掉-moz开头的样式,Firefox会去掉_开头的样式;
  3. DOM tree和样式结构体结合后构建呈现树(render tree)。render tree中每个node都有自己的style,而render tree不包含隐藏的节点(比如display:none的节点,还有head节点),这些节点不会用于呈现,也不影响呈现,所以就不会包含在render tree中。(visibility:hidden隐藏的元素还会包含在render tree中,因为会影响布局(layout),会占有空间。根据CSS2的标准,render tree中的每个节点都称为boxBox dimensions),box的所有属性:width,height,margin,padding,left,top,border等;
  4. render tree构建完毕后,浏览器根据render tree来绘制页面。

重绘与回流的特征

  1. render tree中的一些元素的外观、风格等不会影响布局的属性改变,比如bachground-color,这就称为重绘。
  2. render tree中的一部分(或全部)因为元素的规模尺寸、布局、隐藏等改变而需要重新构建,这就称为回流。每个页面在第一次加载的时候就回流了一次。

注:重绘不一定会引起回流,回流一定引起重绘。任何对render tree中元素的操作都会引起回流或重绘。

如何减少回流、重绘

  1. 当元素的几个样式同时改变时定义一个新的className,不要一个一个改变元素的样式属性;
  2. 使用documentfragmentdiv等元素进行缓存操作;
  3. display:none隐藏元素,然后对元素进行所有操作,最后再显示该元素;
  4. 不要经常访问会引起浏览器flush队列的属性,如果想要访问先读取到变量中进行缓存;
    会引起浏览器flush队列的属性:

offsetTop, offsetLeft, offsetWidth, offsetHeight
scrollTop/Left/Width/Height
clientTop/Left/Width/Height
width,height
请求了getComputedStyle(), 或者 ie的 currentStyle

  1. 让元素脱离动画流,减少回流的render tree的规模;
  $("#block1").animate({left:50});  
  $("#block2").animate({marginLeft:50});  
  1. 尽可能在DOM树的最末端改变class(可限制回流的范围);
  2. 避免设置多层内联样式(将样式合并在一个外部类,仅产生一次回流);
  3. 动画效果应用到position属性为absoluteflex的元素上;
  4. 避免使用table数据;
  5. 避免使用CSSJavaScript表达式。
欢迎关注

相关文章

  • 22,重绘、回流

    1,浏览器渲染机制 2,重绘 3,回流 > 重绘。 4,浏览器优化 5,减少重绘和回流

  • 回流与重绘

    回流一定会触发重绘回流: DOM结构的增删改重绘: 颜色,背景, 字体等视觉上页面的改变 重绘不一定触发回流 如何...

  • 面经 之 Browser浏览器读后感

    浏览器,原文请移步Browser | InterviewMap 回流和重绘 回流和重绘 - 掘金 存储 cooki...

  • 前端总结(后续继续更新)

    1,reflow和repaint:回流和重绘。回流:renderTree 重建。重绘:外观样式风格进行更新。(co...

  • 前端一些细节

    1,reflow和repaint:回流和重绘。回流:renderTree 重建。重绘:外观样式风格进行更新。(co...

  • 浏览器渲染回流重绘与性能优化

    我们根据渲染的流程可知, 回流一定会触发重绘,而重绘不一定会回流。 渲染性能优化 回流和重绘的代价是比较昂贵的,渲...

  • DOM树 CSS树 render树 以及JS的加载

    回流和重绘回流一定会引起重绘而重绘可以单独触发 例如修改背景颜色 字体颜色等...引起回流的因素:1.DOM节点 ...

  • 浏览器的回流与重绘 (Reflow & Repaint)

    回流必将引起重绘,重绘不一定会引起回流 在讨论回流与重绘之前,我们要知道:浏览器使用流式布局模型 (Flow Ba...

  • 重绘和回流

    重绘: 只是样式的变化,不会引起DOM树变化,页面布局变化的行为叫重绘,且重绘不一定会伴随回流。 回流: 引起DO...

  • 怎样区分页面的回流和重绘

    一、什么是回流和重绘 引起DOM树结构变化,页面布局变化的行为叫回流,且回流一定伴随重绘。只是样式的变化,不会引起...

网友评论

      本文标题:重绘 、回流

      本文链接:https://www.haomeiwen.com/subject/srpbdqtx.html