我有点不清楚回流和重绘之间的区别(如果有的话)
似乎回流可能会改变各种DOM元素的位置,而重绘只是渲染新对象。例如,删除元素时会发生回流,而更改其颜色时会发生重绘。
这是真的吗?
我有点不清楚回流和重绘之间的区别(如果有的话)
似乎回流可能会改变各种DOM元素的位置,而重绘只是渲染新对象。例如,删除元素时会发生回流,而更改其颜色时会发生重绘。
这是真的吗?
这篇文章似乎涉及到回流和重绘的性能问题。
关于定义,来自该文章:
重绘(repaint)是指对一个元素的样式进行更改,但不影响其布局的可见更改。
例如:
outline
,visibility
,background
, 或color
等。根据Opera浏览器的说法,重绘非常昂贵,因为浏览器必须验证DOM树中所有其他节点的可见性。回流(reflow)对性能影响更大,因为它涉及到影响页面某部分(或整个页面)的布局更改。
导致回流的示例包括:添加或删除内容、显式或隐式更改
width
、height
、font-family
、font-size
等。
了解哪些CSS属性会影响重绘并查看http://csstriggers.com
重新排版会在DOM布局发生变化时发生。重新排版的计算成本很高,因为页面元素的尺寸和位置必须重新计算,然后屏幕将被重绘。
导致重新排版的示例:
for (let i = 1; i <= 100; i++ {
const newEle = document.createElement('p');
newEle.textContent = 'newly created paragraph element';
document.body.appendChild(newEle);
}
以上代码非常低效,每次添加新的段落元素都会导致100次回流进程。
您可以通过使用.createDocumentFragment()
来减轻这个计算上紧张的过程。
const docFrag = document.createDocumentFragment();
for (let i = 1; i <= 100; i++ {
const newEle = document.createElement('p');
newEle.textContent = 'newly created paragraph element';
docFrag.appendChild(newEle);
}
document.body.appendChild(docFrag);
以上代码现在将仅使用回流过程1次来创建100个新段落元素。
Repaint仅仅是改变显示器上的像素,虽然仍会对其造成一定的负担,但相比之下,它是两种方法中较小的邪恶,因为回流过程包含了重绘。
我认为,repaint 只影响 DOM 本身,而 reflow 影响整个页面。
Repaint 发生在某些只涉及其样式的变化时,比如颜色和可见性。
Reflow 发生在页面的 DOM 更改其布局时。
最近我发现了一个可以搜索触发 repaint 或 reflow 的属性的网站。 http://csstriggers.com/
重排是浏览器布局页面的过程。在DOM(通常在DOM和CSS加载后)首次显示时发生,并且每当有任何可能更改布局的情况发生时都会再次发生。这是一个相对昂贵(慢)的过程。
重绘发生在重排之后,浏览器将新的布局绘制到屏幕上。这相当快速,但您仍然希望限制它发生的频率。
例如,如果您向元素添加CSS类,则浏览器通常重新计算整个页面的布局--这是一次重排和一次重绘!