高频dom操作和页面性能优化探索

一、DOM操作影响页面性能的核心问题

通过js操作DOM的代价很高,影响页面性能的主要问题有如下几点:

访问和修改DOM元素

修改DOM元素的样式,导致重绘或重排

通过对DOM元素的事件处理,完成与用户的交互功能

DOM的修改会导致重绘和重排。

重绘是指一些样式的修改,元素的位置和大小都没有改变;

重排是指元素的位置或尺寸发生了变化,浏览器需要重新计算渲染树,而新的渲染树建立后,浏览器会重新绘制受影响的元素。

页面重绘的速度要比页面重排的速度快,在页面交互中要尽量避免页面的重排操作。浏览器不会在js执行的时候更新DOM,而是会把这些DOM操作存放在一个队列中,在js执行完之后按顺序一次性执行完毕,因此在js执行过程中用户一直在被阻塞。

1.页面渲染过程

一个页面更新时,渲染过程大致如下:

JavaScript:通过js来制作动画效果或操作DOM实现交互效果

Style:计算样式,如果元素的样式有改变,在这一步重新计算样式,并匹配到对应的DOM上

Layout:根据上一步的DOM样式规则,重新进行布局(重排)

Paint:在多个渲染层上,对新的布局重新绘制(重绘)

Composite:将绘制好的多个渲染层合并,显示到屏幕上

在网页生成的时候,至少会进行一次布局和渲染,在后面用户的操作时,不断的进行重绘或重排,因此如果在js中存在很多DOM操作,就会不断地出发重绘或重排,影响页面性能。

2.DOM操作对页面性能的影响

如前面所说,DOM操作影响页面性能的核心问题主要在于DOM操作导致了页面的重绘或重排,为了减少由于重绘和重排对网页性能的影响,我们要知道都有哪些操作会导致页面的重绘或者重排。

2.1导致页面重排的一些操作:

内容改变

文本改变或图片尺寸改变

DOM元素的几何属性的变化

例如改变DOM元素的宽高值时,原渲染树中的相关节点会失效,浏览器会根据变化后的DOM重新排建渲染树中的相关节点。如果父节点的几何属性变化时,还会使其子节点及后续兄弟节点重新计算位置等,造成一系列的重排。

DOM树的结构变化

添加DOM节点、修改DOM节点位置及删除某个节点都是对DOM树的更改,会造成页面的重排。浏览器布局是从上到下的过程,修改当前元素不会对其前边已经遍历过的元素造成影响,但是如果在所有的节点前添加一个新的元素,则后续的所有元素都要进行重排。

获取某些属性

除了渲染树的直接变化,当获取一些属性值时,浏览器为取得正确的值也会发生重排,这些属性包括:offsetTop、offsetLeft、offsetWidth、offsetHeight、scrollTop、scrollLeft、scrollWidth、scrollHeight、clientTop、clientLeft、clientWidth、clientHeight、getComputedStyle()。

浏览器窗口尺寸改变

窗口尺寸的改变会影响整个网页内元素的尺寸的改变,即DOM元素的集合属性变化,因此会造成重排。

2.2导致页面重绘的操作

应用新的样式或者修改任何影响元素外观的属性

只改变了元素的样式,并未改变元素大小、位置,此时只涉及到重绘操作。

重排一定会导致重绘

一个元素的重排一定会影响到渲染树的变化,因此也一定会涉及到页面的重绘。

二、高频操作DOM会导致的问题

接下来会分享一下在平时项目中由于高频操作DOM影响网页性能的问题。

1.抽奖项目的高频操作DOM问题1.1存在的问题

在最近做的抽奖项目中,就遇到了这样的由于高频操作DOM,导致页面性能变差的问题。在经历几轮抽奖后,文字滚动速度越来越慢,肉眼能感受到与第一次抽奖时文字滚动速度的明显差别,如持续时间过长或轮次过多,还会造成浏览器假死现象。

实现demo:







































北京哪家治白癜风的医院好
苯酚毒性



转载请注明:http://www.guyang114.com/ssyqyh/yxch/6708.html

  • 上一篇文章:
  •   
  • 下一篇文章: 没有了