资讯专栏INFORMATION COLUMN

JavaScript:回流(重排)与重绘

Jioby / 3209人阅读

摘要:回流也被称为重排,其实从字面上来看,重排更容易让人形象易懂即重新排版整个页面。重绘当页面元素样式改变不影响元素在文档流中的位置时如,,,浏览器只会将新样式赋予元素并进行重新绘制操作。你真的了解回流和重绘吗

简单先了解一下浏览器的渲染过程(图片来自于网络)

浏览器生成渲染树的过程(图片来自于网络)

回流

回流当render tree中的一部分或全部因为元素的规模尺寸、布局、隐藏等改变时,浏览器重新渲染部分DOM或全部DOM的过程。回流也被称为重排,其实从字面上来看,重排更容易让人形象易懂(即重新排版整个页面)。

重绘

当页面元素样式改变不影响元素在文档流中的位置时(如background-color,border-color,visibility),浏览器只会将新样式赋予元素并进行重新绘制操作。

什么时候会触发回流或重绘?

有大量的用户行为以及潜在的DHTML改变会触发回流。例如,改变浏览器窗口的大小,使用一些JavaScript方法,包括计算样式,对DOM进行元素的添加或删除,或是改变元素的class等。

添加或者删除可见的DOM元素;
元素位置改变;
元素尺寸改变——边距、填充、边框、宽度和高度;
内容变化,比如用户在input框中输入文字,文本或者图片大小改变而引起的计算值宽度和高度改变;
页面渲染初始化;
浏览器窗口尺寸改变,resize事件发生时;
计算offsetWidth和offsetHeight属性;
设置style属性的值;
   

回流必将引起重绘,而重绘不一定会引起回流。

如何减少回流、重绘? 一、 CSS中避免回流、重绘

1.尽可能在DOM树的最末端改变class
2.避免设置多层内联样式
3.动画效果应用到position属性为absolute或fixed的元素上
4.避免使用table布局
5.使用css3硬件加速,可以让transform、opacity、filters等动画效果不会引起回流重绘

二、 JS操作避免回流、重绘

1.避免使用JS一个样式修改完接着改下一个样式,最好一次性更改CSS样式,或者将样式列表定义为class的名称
2.避免频繁操作DOM,使用文档片段创建一个子树,然后再拷贝到文档中
3.先隐藏元素,进行修改后再显示该元素,因为display:none上的DOM操作不会引发回流和重绘
4.避免循环读取offsetLeft等属性,在循环之前把它们存起来
5.对于复杂动画效果,使用绝对定位让其脱离文档流,否则会引起父元素及后续元素大量的回流

总结:

回流在浏览器中属于一种用户主导的操作,所以知道如何去改进回流时间以及知道各种文档属性(DOM节点深度,css的渲染效率,各种各样的样式改变)对回流时间的影响对于前端开发来讲是很有帮助的。有时即便是回流一个单一的元素,也可能要求它的父元素以及任何跟随它的元素也产生回流。例如需要改变某个元素的背景,这就不涉及该元素的属性,所以只发生重绘。

写这篇文章,也看了很多相关的blog和文章,这篇文章写得不是很具体只是大概的内容。想深入了解的话可以看下面这篇文章,既有例子又有深度。
你真的了解回流和重绘吗

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/109078.html

相关文章

  • 【前端工程师手册】学习回流重绘(reflow和repaint)

    摘要:重绘元素做了一些不影响排版的改变,比如背景色下划线等等,只需要重新绘制的过程,叫做重绘。显然回流带来的代价大于重绘,因为重绘仅仅是重新画一遍元素而已,但是重绘是重新计算重新画。不然这会导致大量地读写这个结点的属性。 浏览器的大概工作流程 以普通的HTML页面为例: 解析HTML文档,生成dom树 解析css产生css规则树 解析JavaScript,通过DOM-API来操作dom树和...

    liuyix 评论0 收藏0
  • 【前端工程师手册】学习回流重绘(reflow和repaint)

    摘要:重绘元素做了一些不影响排版的改变,比如背景色下划线等等,只需要重新绘制的过程,叫做重绘。显然回流带来的代价大于重绘,因为重绘仅仅是重新画一遍元素而已,但是重绘是重新计算重新画。不然这会导致大量地读写这个结点的属性。 浏览器的大概工作流程 以普通的HTML页面为例: 解析HTML文档,生成dom树 解析css产生css规则树 解析JavaScript,通过DOM-API来操作dom树和...

    fish 评论0 收藏0
  • 浏览器的回流重绘及其优化方式

    摘要:何时发生有大量的用户行为以及潜在的改变会触发回流。这样就会让多次的回流重绘变成一次回流重绘。因为上的操作不会引发回流和重绘。参考文章回流与重绘性能让变慢参考文章浏览器的重绘与重排 推荐了解的知识:基本的HTML,基本的JavaScript,以及一些css工作原理方面的知识 浏览器的渲染原理 css的加载和解析不会阻塞html文档的解析 css的解析会阻塞js的执行,必须等到CSSOM...

    hearaway 评论0 收藏0
  • 一次性弄懂回流重绘

    摘要:所以由此来看重绘不一定导致回流,回流一定会导致重绘前面我们说回流和重绘是会对进行修改,会消耗性能,所以我们要尽可能减少回流和重绘的次数。浏览器自己也清楚,如果每次操作都即时地反馈一次回流或重绘,那么性能上来说是扛不住的。 回流(Reflow)重绘(Repaint) 什么时候会触发回流或重绘呢? 当我们对dom 进行修改当时候会引发它外观(样式)上的改变时,就会触发回流或重绘。这个过程本...

    JerryWangSAP 评论0 收藏0
  • 前端性能优化——回流重绘

    摘要:前言最近在研究,接着就研究回顾起回流与重绘了。回流与重绘,好像大家都很熟悉的样子,但是要具体来说说,又说不出什么来。注意回流必将引起重绘,而重绘不一定会引起回流。 前言 最近在研究virtual dom,接着就研究回顾起回流(reflow)与重绘(repaint)了。 回流与重绘,好像大家都很熟悉的样子,但是要具体来说说,又说不出什么来。下面我是我稍做的整理: 浏览器渲染流程 在理解这...

    endiat 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<