关于layout

来源:3-2 回流与重绘, 如何避免布局抖动

foxi_90houdashu

2021-02-09

window.onload = function () {
        var spans = document.getElementsByTagName("span");

        // 第一种代码
        // for (let i = 0; i < spans.length; i++) {
        //   const ele = spans[i];
        //   ele.style.width = ele.offsetWidth + "px";
        // }

        // 第二种代码
        var arr = [];
        for (let i = 0; i < spans.length; i++) {
          const ele = spans[i];
          arr.push(ele.offsetWidth + "px");
        }

        for (let i = 0; i < arr.length; i++) {
          spans[i].style.width = arr[i];
        }
};

老师,我在一个页面上写了将近100个span
用第一种代码,performance显示每个Recalcute style 大约0.1ms,每个layout大约0.2ms,共花了38ms左右。
然后我又用第二种代码,Recalcute style共0.53ms, layout共1.5ms,共花了2ms左右,明显比第一种代码性能好。
问:我以为多个Recalcute style或layout 和 单个是累加关系,但结果显示明显多个一起Recalcute style或layout比多次单个的要好,这部分是由于浏览器做了优化吗,能大概说下是咋优化的吗?

写回答

1回答

Mr_Max

2021-02-09

同学你好!

第一种每次要先读取offsetWidth,layout engine不能确定上一个元素的修改会不会影响下一个元素的offsetWidth,所以每个元素的recalculate style/layout是依次进行的。

第二种width赋值是从数组直接取值,layout engine只需要一次样式计算,可涉及所有受影响元素。这里是它本身的优化。

样式重计算越少越好,每次样式重计算影响的元素和样式的复杂度越小越好。

2
1
foxi_90houdashu
3Q!
2021-02-11
共1条回复

前端性能优化企业级解决方案 6大角度+大厂视野

只要项目还在线,性能优化永远是时刻要关注的问题

1109 学习 · 226 问题

查看课程