【发布时间】:2018-07-31 09:20:58
【问题描述】:
下面有两段代码
片段#1
const doubleWidth = (element) => {
const width = element.offsetWidth;
element.style.width = `${width * 2}px`;
};
button.addEventListener('click', (event) => {
boxes.forEach(doubleWidth);
});
片段#2
button.addEventListener('click', (event) => {
var widths = boxes.map(item => item.offsetWidth);
boxes.forEach((element, index) => {
element.style.width = `${widths[index] * 2}px`;
});
});
Snippet #1 有很多 48 毫秒,而 sn-p #2 只有 18.4 毫秒。为什么会有这种行为?
毕竟,我还在做计算和设置(强制回流)两个操作。
这是完整的代码 - https://codepen.io/kushalmahajan/pen/mjXVqp?editors=0010
更新 - 所以,让我再解释一下
在片段 #1 中,我每次都会看到一个模式,例如计算、重置、计算、重置……等等
在片段 #2 中。事实并非如此。
请以渲染管道为基础回答
【问题讨论】:
-
有趣,看起来区别在于读写访问DOM元素(用chrome测试)
-
更改 CSS 属性后读取
offsetWidth将强制重排。所以阅读所有这些,然后设置它们,而不是交替进行。或者根本不从offsetWidth读取,而只是将存储在.style.width中的像素值加倍
标签: javascript performance performance-testing