Web前端性能优化算是面试中很经典的问题了。Web前端性能优化是一个复杂的过程,涉及到的知识点非常多,包括网页,服务器,CSS,Javascript,图片等方面。
注意:在构建CSSOM树时,会阻塞渲染,直至CSSOM树构建完成。并且构建CSSOM树时一个十分消耗性能的过程,所有应该尽量保证层级扁平,减少过度层叠,越是具体的CSS选择器,执行速度越慢。
注意:1. 重排一定重绘,重绘不一定重排。举一个例子:比如只对DOM元素操作其背景色,那么就只会发生重绘,不涉及几何元素会不会发生重排。2. 回流所需的成本比重绘高的多,改变深层次的节点很可能导致父节点的一系列回流。
d. 下列情况会发生重排:
1)首先是无法避免的,浏览器页面初始化渲染;
2)添加、删除可见DOM元素;
3)改变元素位置position;
4)改变元素尺寸(宽、高、内外边距、边框等);
5)改变元素内容(文本或图片等);
6)改变浏览器窗口尺寸。
注意:不同的条件下发生重排的范围及程度会不同,某些情况甚至会重排整个页面,比如:resize(window.resize事件会在窗口尺寸改变时触发,哪怕只是改变了1像素。)或者scroll。
e. 减少重排和重绘:
1)使用translate来替代top;
2)使用visibility来替换display:none,因为前者只会引起重绘,而后者会引发回流,因为改变了布局;
3)把DOM离线后修改,比如:先把DOM给display:none(此时有一次reflow回流),然后你修改100次,然后再把它显示出来;
4)不要把DOM节点的属性放在一个循环中,然后当成循环中的变量;
5)不要使用table布局,可能很小的一个小改动会造成整个table的重新布局;
6)动画实现速度的选择,动画速度越快,回流次数越多,我们也可以使用requestAnimationFrame;
7)CSS选择符从右往左匹配查找,避免DOM深度过深;
8)不在布局信息改变时做DOM查询,否则会导致渲染队列强制刷新;
9)使用cssText(本质就是设置HTML元素的style属性值)或者className一次性改变属性;
10)使用文档碎片fragment,如果要批量添加DOM,可以先让元素脱离文档流,操作完后再带入文档流,这样只会触发一次重排;
11)对于多次重排的元素,如动画,使用绝对定位(position:absolute|fixed)脱离文档流,让他的改变不影响到其他元素。
注意:将频繁运动的动画变为图层,图层能够阻止该节点回流影响别的元素。比如对于video标签,浏览器会自动将该节点变为图层。
通过以下几个常用属性可以生成新图层:
1)3D变换:translate3d、translateZ;
2)will-change通过告知浏览器该元素会有哪些变化,使浏览器提前做好优化准备,增强页面渲染性能;
3)video、iframe标签;
4)通过动画实现的opacity动画转换;
5)position:fixed。