重绘(repaints) 重排(reflows)
2015-08-13 19:42
351 查看
两个名词的非官方正式解释:
重绘是一个元素外观的改变所触发的浏览器行为,例如改变vidibility、outline、背景色等属性。浏览器会根据元素的新属性重新绘制,使元素呈现新的外观。重绘不会带来重新布局,并不一定伴随重排。
重排是更明显的一种改变,可以理解为渲染树需要重新计。
重排发生条件:
添加或删除可见的DOM元素
元素位置的改变
元素尺寸改变
内容改变
页面渲染器初始化
浏览器窗口尺寸的改变
理解了定义这些都很好理解,而且引发重拍的条件不止这些。
重排想好这大量的资源,所以我们在前端开发过程中要尽量避免。下面我们来看看如何针对重排进行优化:
将多次改变样式属性的操作合并成一次操作
将需要多次重排的元素,position属性设为absolute或fixed,这样此元素就脱离了文档流,它的变化不会影响到其他元素。例如有动画效果的元素就最好设置为绝对定位。
在内存中多次操作节点,完成后再添加到文档中去。例如要异步获取表格数据,渲染到页面。可以先取得数据后在内存中构建整个表格的html段,再一次性添加到文档中去,而不是循环添加每一行。
由于display属性为none的元素不在渲染树中,对隐藏的元素操作不会引发其他元素的重排。如果要对一个元素进行复杂的操作时,可以先隐藏它,操作完成后再显示。这样只在隐藏和显示时触发2次重排。
在需要经常获取那些引起浏览器重排的属性值时,要缓存到变量。
详解:
1. DOM元素的几何属性变化
当DOM元素的几何属性变化时,渲染树中的相关节点就会失效,浏览器会根据DOM元素的变化重建构建渲染树中失效的节点。之后,会根据新的渲染树重新绘制这部分页面。而且,当前元素的重排也许会带来相关元素的重排。例如,容器节点的渲染树改变时,会触发子节点的重新计算,也会触发其后续兄弟节点的重排,祖先节点需要重新计算子节点的尺寸也会产生重排。最后,每个元素都将发生重绘。可见,重排一定会引起浏览器的重绘,一个元素的重排通常会带来一系列的反应,甚至触发整个文档的重排和重绘,性能代价是高昂的。
2.DOM树的结构变化
当DOM树的结构变化时,例如节点的增减、移动等,也会触发重排。浏览器引擎布局的过程,类似于树的前序遍历,是一个从上到下从左到右的过程。通常在这个过程中,当前元素不会再影响其前面已经遍历过的元素。所以,如果在body最前面插入一个元素,会导致整个文档的重新渲染,而在其后插入一个元素,则不会影响到前面的元素。
3.获取某些属性
浏览器引擎可能会针对重排做了优化。比如Opera,它会等到有足够数量的变化发生,或者等到一定的时间,或者等一个线程结束,再一起处理,这样就只发生一次重排。但除了渲染树的直接变化,当获取一些属性时,浏览器为取得正确的值也会触发重排。这样就使得浏览器的优化失效了。这些属性包括:offsetTop、offsetLeft、 offsetWidth、offsetHeight、scrollTop、scrollLeft、scrollWidth、scrollHeight、clientTop、clientLeft、clientWidth、clientHeight、getComputedStyle() (currentStyle in IE)。所以,在多次使用这些值时应进行缓存。
重绘是一个元素外观的改变所触发的浏览器行为,例如改变vidibility、outline、背景色等属性。浏览器会根据元素的新属性重新绘制,使元素呈现新的外观。重绘不会带来重新布局,并不一定伴随重排。
重排是更明显的一种改变,可以理解为渲染树需要重新计。
重排发生条件:
添加或删除可见的DOM元素
元素位置的改变
元素尺寸改变
内容改变
页面渲染器初始化
浏览器窗口尺寸的改变
理解了定义这些都很好理解,而且引发重拍的条件不止这些。
重排想好这大量的资源,所以我们在前端开发过程中要尽量避免。下面我们来看看如何针对重排进行优化:
将多次改变样式属性的操作合并成一次操作
将需要多次重排的元素,position属性设为absolute或fixed,这样此元素就脱离了文档流,它的变化不会影响到其他元素。例如有动画效果的元素就最好设置为绝对定位。
在内存中多次操作节点,完成后再添加到文档中去。例如要异步获取表格数据,渲染到页面。可以先取得数据后在内存中构建整个表格的html段,再一次性添加到文档中去,而不是循环添加每一行。
由于display属性为none的元素不在渲染树中,对隐藏的元素操作不会引发其他元素的重排。如果要对一个元素进行复杂的操作时,可以先隐藏它,操作完成后再显示。这样只在隐藏和显示时触发2次重排。
在需要经常获取那些引起浏览器重排的属性值时,要缓存到变量。
详解:
1. DOM元素的几何属性变化
当DOM元素的几何属性变化时,渲染树中的相关节点就会失效,浏览器会根据DOM元素的变化重建构建渲染树中失效的节点。之后,会根据新的渲染树重新绘制这部分页面。而且,当前元素的重排也许会带来相关元素的重排。例如,容器节点的渲染树改变时,会触发子节点的重新计算,也会触发其后续兄弟节点的重排,祖先节点需要重新计算子节点的尺寸也会产生重排。最后,每个元素都将发生重绘。可见,重排一定会引起浏览器的重绘,一个元素的重排通常会带来一系列的反应,甚至触发整个文档的重排和重绘,性能代价是高昂的。
2.DOM树的结构变化
当DOM树的结构变化时,例如节点的增减、移动等,也会触发重排。浏览器引擎布局的过程,类似于树的前序遍历,是一个从上到下从左到右的过程。通常在这个过程中,当前元素不会再影响其前面已经遍历过的元素。所以,如果在body最前面插入一个元素,会导致整个文档的重新渲染,而在其后插入一个元素,则不会影响到前面的元素。
3.获取某些属性
浏览器引擎可能会针对重排做了优化。比如Opera,它会等到有足够数量的变化发生,或者等到一定的时间,或者等一个线程结束,再一起处理,这样就只发生一次重排。但除了渲染树的直接变化,当获取一些属性时,浏览器为取得正确的值也会触发重排。这样就使得浏览器的优化失效了。这些属性包括:offsetTop、offsetLeft、 offsetWidth、offsetHeight、scrollTop、scrollLeft、scrollWidth、scrollHeight、clientTop、clientLeft、clientWidth、clientHeight、getComputedStyle() (currentStyle in IE)。所以,在多次使用这些值时应进行缓存。
相关文章推荐
- 2015 HUAS Summer Trainning #5~N
- hdu 2523SORT AGAIN
- Elasticsearch 报错:failed to create a selector
- hadoop about "Container does not exist."
- hadoop about "Container does not exist."
- hdu 1022(列车进栈出栈) Train Problem I
- Roundcube Webmail 安装配置图文详情
- LeetCode解题报告--Container With Most Water
- MFC中View类获取CMainFrame的方法
- hdu1021 Fibonacci Again
- kamailio4.2.6 安装和配置教程
- Kamailio负载均衡解决方法汇总
- hdu 4630 No Pain No Game【线段树 离线操作】
- 第十六章、Raid及mdadm命令
- Juniper Contrail SDN Joins Mirantis OpenStack Party
- Neutron OVS Bridge 连接方式 (veth pair / ovs peer) 的选型和性能测试
- AIX下查看CPU、内存信息-prtconf
- hdu 1021 Fibonacci Again(矩阵连乘 || 循环节)
- Netmask, 子网与 CIDR (Classless Interdomain Routing)
- Netmask, 子网与 CIDR (Classless Interdomain Routing)