浏览器重排和重绘

一个页面由两部分组成:
DOM:描述该页面的结构
render Tree(渲染树):描述 DOM 节点 (nodes) 在页面上如何呈现。(解析完DOM+css之后会生成一个渲染树 Render Tree,就是 dom 和 css 的一一对应关系。DOM+css= Render Tree )

如何理解重排和重绘?

重绘:当 DOM 元素的属性发生变化 (如 color) 时, 浏览器会通知 render Tree重新描绘相应的元素, 此过程称为重绘。(重绘属性都不会修改节点的大小和位置)

重排:如果该次变化涉及元素布局 (如 width), 浏览器则抛弃原有属性, 重新计算并把结果传递给 render Tree以重新描绘页面元素, 此过程称为重排。

这两个过程是很耗费浏览器性能的。

那么如何减少呢?

(1)分离读写操作;         

var curLeft=div.offsetLeft;
var curTop=div.offsetTop;
div.style.left=curLeft+1+'px';
div.style.top=curTop+1+'px';

(2)样式集中改变;

(3)使用absolute脱离文档流;

将需要多次重排的元素,position属性设为absolute或fixed,这样此元素就脱离了文档流,它的变化不会影响到其他元素。例如有动画效果的元素就最好设置为绝对定位。

(4)使用 display:none;

由于display属性为none的元素不在渲染树中,对隐藏的元素操作不会引发其他元素的重排。如果要对一个元素进行复杂的操作时,可以先隐藏它,操作完成后再显示。这样只在隐藏和显示时触发2次重排。

(5)在内存中多次操作节点,完成后再添加到文档中去。例如要异步获取表格数据,渲染到页面。可以先取得数据后在内存中构建整个表格的html片段,再一次性添加到文档中去,而不是循环添加每一行。

(6) 在需要经常取那些引起浏览器重排的属性值时,要缓存到变量,如窗口的offsetTop、offsetLeft事先缓存

 

导致重绘的属性:

* color 
* border-style 
* border-radius 
* visibility 
* text-decoration 
* background 
* background-image 
* background-position 
* background-repeat 
* background-size 
* outline-color 
* outline 
* outline-style 
* outline-width 
* box-shadow

导致重排的属性:

* width 
* height 
* padding 
* margin 
* display 
* border-width 
* border 
* min-height
* top 
* bottom 
* left 
* right 
* position 
* float 
* clear 
* text-align 
* overflow-y 
* font-weight 
* overflow 
* font-family 
* line-height 
* vertival-align 
* white-space 
* font-size

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值