優化 CSS 以減少不必要的回流和重繪的最佳實踐是什麼,特別是在大型應用程式中?
1. Reflow(版面重新計算):
當瀏覽器重新計算頁面上元素的位置、大小和佈局時,會發生重排(也稱為佈局或重新佈局) 。每當頁面佈局發生變化時,例如新增、刪除、調整大小或其可見性發生變化時,都會發生此過程。這是一個比較複雜又耗時的操作
例 :
<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>
什麼時候發生回流?
- 新增、移除或修改 DOM 元素(例如,appendChild、removeChild)。
- 透過調整寬度、高度、邊距、填滿等 CSS 樣式來變更版面配置
- 調整視窗大小或更改元素大小。
- 更改字體大小或字體屬性。
- 使用 offsetWidth、offsetHeight、scrollTop、getBoundingClientRect() 等方法,因為它們會強制瀏覽器重新計算佈局。
回流焊的工作原理:
當您變更影響頁面佈局的內容時,瀏覽器必須:
- 重新計算受更改影響的所有元素的位置和尺寸。
- 重建佈局樹,它是元素如何佈局的內部表示。
如果許多元素受到一次變更的影響,則回流的成本可能會很高,並且會降低網站的效能。
2.重新繪製(視覺更新)
當元素的視覺屬性改變但版面不變時,會發生 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>
什麼時候進行重繪?
- 變更背景顏色、邊框顏色或可見性屬性。
- 更改元素的框陰影、輪廓或顏色。
- 更新不透明度(opacity)、變換(transform)或 z-index。
重繪不涉及重新計算佈局,因此比回流更快,但仍需要重繪頁面的部分內容,這需要一些時間。
渲染管線
- DOM 建構:瀏覽器解析 HTML 來建構 DOM(文件物件模型)樹。
- CSSOM 建構:解析 CSS 以建立 CSSOM(CSS 物件模型)樹。
- 渲染樹建構:將 DOM 和 CSSOM 組合起來建立渲染樹,其中包含每個可見元素的視覺資訊。
- 佈局(回流):瀏覽器計算渲染樹中每個可見元素的位置和大小。
- 繪製:瀏覽器根據顏色、邊框、陰影等視覺屬性填入像素
- 複合:瀏覽器組合不同的繪製層(對於動畫、3D 變換等複雜元素)並將其顯示在螢幕上。
性能影響
- 回流:在效能方面代價高昂,特別是當它影響頁面的大部分或重複觸發時(例如,在循環中或調整大小時)。它會影響頁面的佈局,需要重新計算元素的位置和大小。
- 重新繪製:比回流便宜,但仍會影響效能,特別是在許多元素需要頻繁重新繪製的情況下。
如何優化回流和重繪
最小化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中文網其他相關文章!

理解JavaScript引擎內部工作原理對開發者重要,因為它能幫助編寫更高效的代碼並理解性能瓶頸和優化策略。 1)引擎的工作流程包括解析、編譯和執行三個階段;2)執行過程中,引擎會進行動態優化,如內聯緩存和隱藏類;3)最佳實踐包括避免全局變量、優化循環、使用const和let,以及避免過度使用閉包。

Python更適合初學者,學習曲線平緩,語法簡潔;JavaScript適合前端開發,學習曲線較陡,語法靈活。 1.Python語法直觀,適用於數據科學和後端開發。 2.JavaScript靈活,廣泛用於前端和服務器端編程。

Python和JavaScript在社區、庫和資源方面的對比各有優劣。 1)Python社區友好,適合初學者,但前端開發資源不如JavaScript豐富。 2)Python在數據科學和機器學習庫方面強大,JavaScript則在前端開發庫和框架上更勝一籌。 3)兩者的學習資源都豐富,但Python適合從官方文檔開始,JavaScript則以MDNWebDocs為佳。選擇應基於項目需求和個人興趣。

從C/C 轉向JavaScript需要適應動態類型、垃圾回收和異步編程等特點。 1)C/C 是靜態類型語言,需手動管理內存,而JavaScript是動態類型,垃圾回收自動處理。 2)C/C 需編譯成機器碼,JavaScript則為解釋型語言。 3)JavaScript引入閉包、原型鍊和Promise等概念,增強了靈活性和異步編程能力。

不同JavaScript引擎在解析和執行JavaScript代碼時,效果會有所不同,因為每個引擎的實現原理和優化策略各有差異。 1.詞法分析:將源碼轉換為詞法單元。 2.語法分析:生成抽象語法樹。 3.優化和編譯:通過JIT編譯器生成機器碼。 4.執行:運行機器碼。 V8引擎通過即時編譯和隱藏類優化,SpiderMonkey使用類型推斷系統,導致在相同代碼上的性能表現不同。

JavaScript在現實世界中的應用包括服務器端編程、移動應用開發和物聯網控制:1.通過Node.js實現服務器端編程,適用於高並發請求處理。 2.通過ReactNative進行移動應用開發,支持跨平台部署。 3.通過Johnny-Five庫用於物聯網設備控制,適用於硬件交互。

我使用您的日常技術工具構建了功能性的多租戶SaaS應用程序(一個Edtech應用程序),您可以做同樣的事情。 首先,什麼是多租戶SaaS應用程序? 多租戶SaaS應用程序可讓您從唱歌中為多個客戶提供服務

本文展示了與許可證確保的後端的前端集成,並使用Next.js構建功能性Edtech SaaS應用程序。 前端獲取用戶權限以控制UI的可見性並確保API要求遵守角色庫


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

Atom編輯器mac版下載
最受歡迎的的開源編輯器

SAP NetWeaver Server Adapter for Eclipse
將Eclipse與SAP NetWeaver應用伺服器整合。

SecLists
SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

VSCode Windows 64位元 下載
微軟推出的免費、功能強大的一款IDE編輯器