今天在做练习的时候,遇到了重绘与回流这个词,表示连个毛都没有听过。遂查之,首先将网上的(http://blog.sina.com.cn/s/blog_8dace7290102wezv.html)关于这两个词的领悟粘贴如下:

一.  浏览器渲染过程  

渲染:就是把浏览器把HTML代码以css定义的规则显示在浏览器窗口的过程

浏览器解析HTML的基本过程:
 
1  用户输入网址,浏览器向服务器发出请求,服务器返回html文件
 
2  浏览器载入html代码,发现标签内有一个标签引用外部css文件
 
3 浏览器又发出css文件的请求,服务器返回这个css文件
 
4 浏览器继续载入html中的部分的代码,并且css文件已经拿到手了,可以渲染页面
 
5 浏览器在代码中发现一个标签引用关了一张图片,向服务器发出请求。此时浏览器不会等到图片下载完,而是继续渲染后面的代码
 
6 服务器返回图片文件,由于图片占用了一定面积,影响了后面段落的排布,因此浏览器需要回过头来渲染这部分代码
 
7  浏览器发现了一个包含一行javascript代码的script标签,赶快运行它
 
8 javascript脚本执行了这条语句,命令浏览器隐藏代码中某个,杯具了,突然就少了一个元素,浏览器不得不重新渲染这部分代码

 
9  终于等到的到来,浏览器泪流满面 
 
10   等等,还没完,用户点了一个界面中的“换肤”按钮,javascript让浏览器换了一个标签中的css的路径
 
 
11 浏览器召集了在座的各位:"大伙需要收拾下行李,咱得重新来过",浏览器向服务器请求了新的css文件,重新渲染页面当页面的布局发生变化时,浏览器会回过头来重新渲染,这就是页面变慢的原因。
 
二.  渲染树(render tree)

1.浏览器把获取到的HTML代码解析成一棵DOM树,HTML中的每个标签(tag)都是DOM树中的一个节点,根节点就是我们常用的document对象。DOM树里包含了HTML所有标签,包括display:none隐藏,还有用JS动态添加的元素等;

2.浏览器把所有样式(用户定义的css和用户代理)解析成样式结构体,在解析过程中会去掉浏览器不能识别的样式,比如IE会去掉-moz开头的样式,而Firefox会去掉_开头的样式;

3.DOM树和样式结构体组合后构建render tree(渲染树),render tree类似于DOM树,但区别很大,render tree 能识别样式,render tree的每一个节点都有自己的样式,而且render tree中不包含隐藏的节点(比如display:none的节点,还有head节点),因为这些节点不会用于呈现,而且不会影响呈现。

注意:visibility:hidden隐藏的元素还是会包含到render tree中,因为visibility:hidden会影响布局(layout),会占有空间。根据css2的标准,render tree中的每个节点都称为Box(Box demensions),理解页面元素为一个具有填充,边距,边框和位置的盒子。

4.一旦render tree构建完成后,浏览器就可以根据render tree来绘制页面了。

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

三.  重绘与回流的定义

  重绘:当前元素的样式(背景颜色、字体颜色等)发生改变的时候,我们只需要把改变的元素重新的渲染一下即可,重绘对浏览器的性能影响较小,所以 一般不考虑。

  发生重绘的情形:改变容器的外观风格等,比如background:black等。改变外观,不改变布局,不影响其他的dom。

  回流:是指浏览器为了重新渲染部分或者全部的文档而重新计算文档中元素的位置和几何构造的过程。

  因为回流可能导致整个dom树的重新构造,所以是性能的一大杀手

  一个元素的回流导致了其所有子元素以及DOM中紧随其后的祖先元素的随后的回流.

四.  触发回流的操作

1.调整窗口大小(Resizing the window)

2.改变字体(Changing the font)

3.增加或者移除样式表(Adding or removing a stylesheet)

4.内容变化,比如用户在input框中输入文字(Content changes, such as a user typing text in an input box)

5.激活 CSS 伪类,比如 :hover (IE 中为兄弟结点伪类的激活)(Activation of CSS pseudo classes such as :hover (in IE the activation of the pseudo class of a sibling)

6.操作 class 属性(Manipulating the class attribute)

7.脚本操作 DOM(A script manipulating the DOM)

8.计算 offsetWidth 和 offsetHeight 属性(Calculating offsetWidth and offsetHeight)

9.设置 style 属性的值 (Setting a property of the style attribute)

10.fixed定位的元素,在拖动滚动条的时候会一直回流

五.  如何避免回流

  1.  一起变化

  如果要改变一个元素的样式,可以将所有样式集中在一个class上面一次变化,而不是变化几次,比如:

<style type="text/css">
.changeStyle { width: 100px; height: 100px; }
</style>
<script type="text/javascript">
$(document).ready(function () {
var el = $('id');
//1
el.css('width', '100px');
el.css('height', '100px');
//2
el.css({ 'width': '100px;', 'height': '100px;' });
//3
el.addClass('changeStyle');
});
</script>

  应该使用第三种,这样只重绘一次。

  2.  具有动画效果请使用absolute

  3.  避免使用表格布局

  4.  不要使用CSS表达式

  5.  在最末改变元素

  因为回流是自上而下的,所以下不及上,我们在最后面修改信息对全局影响越少。

  6.  动画移动时候,要控制

  比如我们拖动元素时候,我是在他x或者y坐标改变5px才操作,这样虽说降低了平滑度,但是对性能有提高

  7.  如果你想让复杂的表现发生改变,例如动画效果,那么请在这个流动线之外实现它。使用position-absolute或position-fixed来实现它。

  8.  既然计算offsetWidth也会引起回流,那么就拿一个变量保存它

  9.  当我们需要向文档中添加节点时,可以用文档碎片的方式去解决这个问题的,当我们需要给DOM中添加新的元素的时候,先将其放在一个容器中,然后统一添加,这样就只产生了一次回流。如下:

var frg = document.createDocumentFragment();//创建了一个文档碎片:相当于一个容器,把动态创建的li先放到容器中,最后一起添加到页面中(只引发一次回流)
for (var i = 0; i < ; i++) {
var oLi = document.createElement("li");
oLi.onmouseover = function () {
this.style.backgroundColor = "#22b909";
}
oLi.onmouseout = function () {
this.style.backgroundColor = "";
}
frg.appendChild(oLi);
}
oUl.appendChild(frg);

资料来源:

  http://aijuans.iteye.com/blog/1910614

  http://m.blog.csdn.net/article/details?id=50696328

  http://www.360doc.cn/article/10504424_435836011.html

  http://www.zhangxinxu.com/wordpress/2010/01/%E5%9B%9E%E6%B5%81%E4%B8%8E%E9%87%8D%E7%BB%98%EF%BC%9Acss%E6%80%A7%E8%83%BD%E8%AE%A9javascript%E5%8F%98%E6%85%A2%EF%BC%9F/

    

回流是指浏览器为了重新渲染部分或者全部的文档而重新计算文档中元素的位置和几何构造的过程

理解浏览器的重绘与回流(repaint&&reflow)的更多相关文章

  1. 重绘和回流(reflow和repaint)

    由于DOM操作会导致浏览器的回流,回流需要花费大量的时间进行样式计算和节点重绘与渲染,所以应当尽量减少回流次数. 以下是几种常见的减少重绘和回流的方法: 一.不要一项一项的更改页面的样式,尽量一口气写 ...

  2. 浏览器的重绘与回流(Reflow & Repaint)介绍

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

  3. DOM的重绘和回流及代码性能优化

    1.DOM的重绘和回流Repaint&Reflow 1.1重绘:元素样式的改变(但宽高.大小.位置等不变) 如outline.visibility.color.background-color ...

  4. 高性能WEB开发:深入理解页面呈现、重绘、回流

    在讨论页面重绘.回流之前.需要对页面的呈现流程有些了解,页面是怎么把html结合css等显示到浏览器上的,下面的流程图显示了浏览器对页面的呈现的处理流程.可能不同的浏览器略微会有些不同.但基本上都是类 ...

  5. 介绍下重绘和回流(Repaint & Reflow),以及如何进行优化

    1. 浏览器渲染机制 浏览器采用流式布局模型(Flow Based Layout) 浏览器会把HTML解析成DOM,把CSS解析成CSSOM,DOM和CSSOM合并就产生了渲染树(Render Tre ...

  6. 重绘和回流(Repaint & Reflow)总结,以及如何进行优化

    1. 浏览器渲染机制 浏览器采用流式布局模型(Flow Based Layout) 浏览器会把HTML解析成DOM,把CSS解析成CSSOM,DOM和CSSOM合并就产生了渲染树(Render Tre ...

  7. 浅谈JS重绘与回流

    在说浏览器渲染页面之前,我们需要先了解两个点,一个叫 浏览器解析 URL,另一个就是本章节将涉及的 重绘与回流: 重绘(repaint):当元素样式的改变不影响布局时,浏览器将使用重绘对元素进行更新, ...

  8. 【web性能】页面呈现、重绘、回流

    在讨论页面重绘.回流之前.需要对页面的呈现流程有些了解,页面是怎么把html结合css等显示到浏览器上的,下面的流程图显示了浏览器对页面的呈现的处理流程.可能不同的浏览器略微会有些不同.但基本上都是类 ...

  9. [转]深入理解Flash Player重绘

    这个是tencent flash team的一篇文章,但团队的博客已经关闭了,所以就在这里备份下吧~ 后来有人把这篇文章又发布到9ria上了,引发了一些讨论,其中有两位大神发言了,内容在原文下方. 9 ...

随机推荐

  1. Makefile 自动化变量

    Makefile中常用自动化变量解释如下: $@------规则的目标文件名 $<------规则的第一个依赖项文件名 $^------规则的所有依赖文件列表,以空格隔开. $?-------所 ...

  2. 手把手教你接口自动化测试 – SoapUI & Groovy

    手把手教你接口自动化测试 – SoapUI & Groovy http://www.cnblogs.com/wade-xu/p/4236295.html 关键词:SoapUI接口测试,接口自动 ...

  3. 使用asmcmdcp命令把datafile从文件系统移动(move)到asm磁盘组中 针对11gR2

    使用asmcmd cp命令 把datafile从文件系统移动(move)到asm磁盘组中--针对11gR2 参考原文:How to Move a Datafile from Filesystem to ...

  4. C++设计模式-Singleton

    Singleton单例模式 Singleton 是对全局变量的取代策略作用:保证一个类只能有一个实例,并提供一个全局唯一的访问点. 仅有一个实例:通过类的静态成员变量来体现.提供访问它的全局访问点:访 ...

  5. 在linux下获取帮助

    1.使用man手册页 man是一种显示Unix/Linux在线手册的命令.可以用来查看命令.函数或文件的帮助手册,另外它还可以显示一些gzip压缩格式的文件. 读者在遇到不懂的命令时,可以用man查看 ...

  6. 自动化脚本过程中出现This element neither has attached source nor attached Javadoc...的解决方法

    This element neither has attached source nor attached Javadoc and hence no Javadoc could be found Ec ...

  7. openldap加密传输 nslcd

    http://www.openldap.org/faq/data/cache/185.html https://www.ibm.com/developerworks/cn/linux/1312_zha ...

  8. Python之路【第十五篇】:Web框架

    Python之路[第十五篇]:Web框架   Web框架本质 众所周知,对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端. 1 2 3 4 5 6 ...

  9. Myeclipse以及Genymotion工具的使用以及java后台开发小结

    1. 服务端的Servlet程序修改并保存后,需要重启tomcat服务器才能使其修改有效.重新部署web项目是没有什么卵用的. 2. servers选项卡若是移走了看不到,在window-show v ...

  10. Reprot中的五个Trigger说明

    Report Trigger 1.1 Which report trigger to use As a general rule, any processing that will affect th ...