首頁 web前端 css教學 頻繁的重繪和回流:為什麼應該盡量避免?

頻繁的重繪和回流:為什麼應該盡量避免?

Jan 26, 2024 am 08:50 AM

頻繁的重繪和回流:為什麼應該盡量避免?

重繪與回流:為什麼要避免頻繁發生?

在前端開發中,我們常聽到兩個概念:重繪和回流。它們是指瀏覽器對頁面進行渲染時的兩個關鍵過程。重繪是指當元素的外觀發生變化,需要更新顯示時進行的過程;回流是指當元素的幾何屬性發生變化,需要重新計算佈局並重新繪製的過程。

重繪和回流都是非常消耗效能的操作,頻繁發生會導致頁面的效能下降,甚至造成卡頓和頁面載入速度變慢。所以,我們在開發中要盡量避免頻繁發生重繪和回流。接下來,讓我們來看一些常見的導致重繪和回流的情況,並介紹如何避免它們。

  1. 避免頻繁修改 DOM 元素的樣式

當我們經常修改 DOM 元素的樣式時,瀏覽器會頻繁地觸發重繪和回流。因此,在修改 DOM 元素的樣式時,最好將修改操作合併為一起,透過修改元素的 class 名稱來實現樣式切換,這樣可以減少重繪和回流的次數。

// 不推荐写法
var element = document.getElementById('example');
element.style.width = '100px';
element.style.height = '100px';
element.style.backgroundColor = 'red';

// 推荐写法
var element = document.getElementById('example');
element.classList.add('active');
登入後複製
  1. 使用 transform 屬性來取代 top/left 屬性

當使用 top/left 屬性來改變元素的位置時,會觸發重繪和回流。而使用 transform 屬性(如 translateX/translateY)來改變元素的位置,則不會觸發回流,只會觸發重繪。因此,在需要改變元素位置時,最好使用 transform 屬性。

// 不推荐写法
var element = document.getElementById('example');
element.style.left = '100px';
element.style.top = '100px';

// 推荐写法
var element = document.getElementById('example');
element.style.transform = 'translate(100px, 100px)';
登入後複製
  1. 避免頻繁讀取元素的尺寸屬性

每次讀取元素的尺寸屬性(如offsetWidth、offsetHeight)都會觸發回流,並且讀取這些屬性的值是比較消耗性能的操作。因此,我們應該盡量避免頻繁讀取元素的尺寸屬性,可以將這些值快取起來,或在必要時一次性地取得它們。

// 不推荐写法
var element = document.getElementById('example');
var width = element.offsetWidth;
var height = element.offsetHeight;

// 推荐写法
var element = document.getElementById('example');
var rect = element.getBoundingClientRect();
var width = rect.width;
var height = rect.height;
登入後複製
  1. 使用documentFragment 來優化多次插入節點

插入節點是會觸發回流的操作,如果需要多次插入節點,最好使用documentFragment 來優化,將多個節點加入documentFragment 中,然後再一次地插入DOM 中。

// 不推荐写法
for (var i = 0; i < 10; i++) {
  var element = document.createElement('div');
  document.body.appendChild(element);
}

// 推荐写法
var fragment = document.createDocumentFragment();
for (var i = 0; i < 10; i++) {
  var element = document.createElement('div');
  fragment.appendChild(element);
}
document.body.appendChild(fragment);
登入後複製

透過以上幾個方面的最佳化,我們可以有效地減少重繪和回流的次數,提高頁面的效能和使用者體驗。在實際開發中,我們還可以使用一些工具和函式庫來幫助我們檢測和優化重繪和回流問題,如 Chrome DevTools 和效能分析工具等。

總結一下,重繪和回流是影響頁面效能的重要因素,在前端開發中要盡量避免頻繁發生。透過合併樣式修改、使用 transform 屬性、避免頻繁讀取尺寸屬性和使用 documentFragment 來優化多次插入節點等方法,我們可以有效優化頁面效能,提升使用者體驗。

以上是頻繁的重繪和回流:為什麼應該盡量避免?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱門文章

倉庫:如何復興隊友
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱門文章

倉庫:如何復興隊友
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱門文章標籤

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

將框陰影添加到WordPress塊和元素 將框陰影添加到WordPress塊和元素 Mar 09, 2025 pm 12:53 PM

將框陰影添加到WordPress塊和元素

使用智能表單框架創建JavaScript聯繫表格 使用智能表單框架創建JavaScript聯繫表格 Mar 07, 2025 am 11:33 AM

使用智能表單框架創建JavaScript聯繫表格

創建一個具有可滿足屬性的內聯文本編輯器 創建一個具有可滿足屬性的內聯文本編輯器 Mar 02, 2025 am 09:03 AM

創建一個具有可滿足屬性的內聯文本編輯器

使用GraphQL緩存 使用GraphQL緩存 Mar 19, 2025 am 09:36 AM

使用GraphQL緩存

使您的第一個自定義苗條過渡 使您的第一個自定義苗條過渡 Mar 15, 2025 am 11:08 AM

使您的第一個自定義苗條過渡

比較5個最佳的PHP形式構建器(和3個免費腳本) 比較5個最佳的PHP形式構建器(和3個免費腳本) Mar 04, 2025 am 10:22 AM

比較5個最佳的PHP形式構建器(和3個免費腳本)

在node.js中使用multer上傳並上傳express 在node.js中使用multer上傳並上傳express Mar 02, 2025 am 09:15 AM

在node.js中使用multer上傳並上傳express

展示,不要說 展示,不要說 Mar 16, 2025 am 11:49 AM

展示,不要說

See all articles