一、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:北京哪家治白癜风的医院好苯酚毒性