当浏览器重新计算页面上元素的位置、大小和布局时,会发生重排(也称为布局或重新布局)。每当页面布局发生变化时,例如添加、删除、调整大小或其可见性发生变化时,都会发生此过程。这是一个比较复杂和耗时的操作
<div id="box" style="width: 100px; height: 100px; background-color: blue;"></div> <script> const box = document.getElementById('box'); // Triggering a reflow by changing width and height box.style.width = '200px'; box.style.height = '200px'; // Triggering a repaint by changing the background color box.style.backgroundColor = 'red'; </script>
当您更改影响页面布局的内容时,浏览器必须:
如果许多元素受到一次更改的影响,则回流的成本可能会很高,并且会降低网站的性能。
当元素的视觉属性发生变化但布局不变时,会发生 repaint (或 redraw)。它比回流更便宜,因为它只需要更新元素的外观,而无需重新计算其位置或布局。重新绘制布局后(在需要两者的情况下)或更改不影响布局的属性(例如颜色或可见性)时发生。
<div id="box" style="width: 100px; height: 100px; background-color: blue;"></div> <script> // Triggering a repaint by changing the background color box.style.backgroundColor = 'red'; </script>
重绘不涉及重新计算布局,因此比回流更快,但仍然需要重绘页面的部分内容,这需要一些时间。
最小化 DOM 操作 :使用 批量 DOM 更新(如前所述)或 DocumentFragment 等技术一次性进行多项更改,而不是一一。
避免布局抖动:如果您读取布局属性(例如,offsetHeight)并立即在同一周期内写入(更改布局),则会强制回流,称为布局抖动。为了避免这种情况,请在不同的步骤中分开读取和写入 DOM 属性。
<div id="box" style="width: 100px; height: 100px; background-color: blue;"></div> <script> const box = document.getElementById('box'); // Triggering a reflow by changing width and height box.style.width = '200px'; box.style.height = '200px'; // Triggering a repaint by changing the background color box.style.backgroundColor = 'red'; </script>
使用 CSS 类 :不要修改单个样式,而是使用 CSS 类进行更改。浏览器更有效地处理类切换。
<div id="box" style="width: 100px; height: 100px; background-color: blue;"></div> <script> // Triggering a repaint by changing the background color box.style.backgroundColor = 'red'; </script>
降低 CSS 的复杂性:避免深层嵌套的元素和过于复杂的 CSS 规则,从而触发回流。
当您只想隐藏元素而不影响布局时,请使用visibility:hidden而不是display:none。 display: none 会触发重排,而visibility: hide 只会触发重绘。
以上是Javascript 中的回流和重绘的详细内容。更多信息请关注PHP中文网其他相关文章!