當瀏覽器重新計算頁面上元素的位置、大小和佈局時,會發生重排(也稱為佈局或重新佈局) 。每當頁面佈局發生變化時,例如新增、刪除、調整大小或其可見性發生變化時,都會發生此過程。這是一個比較複雜又耗時的操作
<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中文網其他相關文章!