前端基礎入門三大核心之HTML篇:深入理解重繪與重排 —— 概念、區別與實戰演練

前端基礎入門三大核心之HTML篇:深入理解重繪與重排 —— 概念、區別與實戰演練

    • HTML渲染基礎回顧
    • 重繪與重排的概念
      • 重繪(Repaint)
      • 重排(Reflow)
    • 區別與影響
    • 實戰示例:優化策略與代碼演示
      • 示例1:避免連續修改樣式屬性
      • 示例2:使用`requestAnimationFrame`控制動畫重繪
      • 示例3:離線DOM操作與批量修改
    • 安全性與性能優化小貼士
    • 結語與討論

在前端開發的征途中,性能優化始終是開發者繞不開的話題。而深入理解瀏覽器的渲染機制,特別是“重繪”(Repaint)與“重排”(Reflow)這兩個核心概念,對于提升頁面加載速度及用戶體驗至關重要。本文將從基本概念出發,逐步深入探討它們的區別、應用場景以及如何通過實戰示例來優化這些過程,確保你的前端項目既高效又健壯。

HTML渲染基礎回顧

在正式展開之前,讓我們快速回顧一下瀏覽器如何渲染HTML文檔。瀏覽器接收到HTML、CSS及JavaScript后,會經歷以下幾個關鍵步驟:

  1. 解析:將HTML轉換為DOM樹。
  2. 樣式計算:結合CSS生成CSSOM(CSS Object Model)。
  3. 布局:將DOM與CSSOM合并,計算出每個節點的幾何位置,形成布局樹(Layout Tree)。
  4. 繪制:根據布局樹,將元素繪制到屏幕上。

重繪與重排的概念

重繪(Repaint)

當元素的外觀發生變化,但不涉及布局時(如顏色改變),瀏覽器僅需重新繪制該元素。這一過程相對輕量級,因為它不涉及布局計算。

重排(Reflow)

當頁面的布局結構發生變化,導致瀏覽器需要重新計算元素的位置和尺寸時,就會觸發重排。重排是一個成本高昂的過程,因為它會從DOM樹開始,重新執行樣式計算、布局和繪制等一系列步驟。

區別與影響

  • 區別:重繪僅更新元素的視覺外觀,不改變布局;而重排則涉及到布局的重新計算,影響更為廣泛。
  • 性能影響:頻繁的重排會導致頁面響應緩慢,用戶體驗下降。因此,減少不必要的重排是性能優化的關鍵。

實戰示例:優化策略與代碼演示

示例1:避免連續修改樣式屬性

問題場景:連續修改多個會影響布局的樣式屬性,如寬度和高度。

優化前代碼:

let element = document.getElementById('myElement');
element.style.width = '200px';
element.style.height = '100px';

優化后代碼:

let element = document.getElementById('myElement');
// 使用CSS class或一次性設置style,減少重排次數
element.classList.add('newSize'); // 在CSS中定義.newSize { width: 200px; height: 100px; }
// 或者
element.style.cssText = 'width: 200px; height: 100px;';

示例2:使用requestAnimationFrame控制動畫重繪

問題場景:直接使用setTimeoutsetInterval進行動畫可能會導致不必要的重繪。

優化代碼:

function animate() {let element = document.getElementById('animatedElement');let position = 0;function step() {// 使用requestAnimationFrame進行動畫,瀏覽器會自動優化重繪時機requestAnimationFrame(() => {position += 5;element.style.left = position + 'px';if (position < 900) {step();}});}step();
}
animate();

示例3:離線DOM操作與批量修改

問題場景:直接在DOM上頻繁添加或刪除元素。

優化代碼:

let fragment = document.createDocumentFragment();
for(let i = 0; i < 1000; i++) {let item = document.createElement('div');item.textContent = 'Item ' + i;fragment.appendChild(item);
}document.getElementById('container').appendChild(fragment); // 一次性添加到DOM

安全性與性能優化小貼士

  • 避免在布局臨界區(Layout Thrashing):減少在JavaScript中讀取布局屬性(如offsetWidth)的次數,因為每次讀取都可能觸發重排。
  • 使用will-change屬性:謹慎使用,僅對確實需要優化動畫性能的元素預聲明可能的變化,以允許瀏覽器提前優化。
  • 考慮CSS動畫和過渡:相較于JavaScript動畫,CSS動畫通常由瀏覽器更高效地處理,減少重排和重繪的需求。

結語與討論

深入理解并有效管理重繪與重排,是前端性能優化的重要一環。通過上述實例,我們不僅學習了如何識別和避免性能瓶頸,還掌握了實用的優化策略。但前端領域的探索永無止境,歡迎大家分享更多實戰經驗和見解,共同推進前端技術的發展,讓我們的網頁更加流暢和高效。是否還有其他特定場景下的重排/重繪問題困擾著你?留言區期待你的提問與討論!


歡迎來到我的博客,很高興能夠在這里和您見面!希望您在這里可以感受到一份輕松愉快的氛圍,不僅可以獲得有趣的內容和知識,也可以暢所欲言、分享您的想法和見解。


推薦:DTcode7的博客首頁。
一個做過前端開發的產品經理,經歷過睿智產品的折磨導致脫發之后,勵志要翻身農奴把歌唱,一邊打入敵人內部一邊持續提升自己,為我們廣大開發同胞謀福祉,堅決抵制睿智產品折磨我們碼農兄弟!


【專欄導航】

  • 《微信小程序相關博客》:結合微信官方原生框架、uniapp等小程序框架,記錄請求、封裝、tabbar、UI組件的學習記錄和使用技巧等
  • 《Vue實戰相關博客》:詳細總結了常用UI庫elementUI的使用技巧以及Vue的學習之旅。
  • 《HTML網站開發相關博客》:以實戰為線素,逐步深入HTML開發各個環節,掌握web前端常用性能體驗優化思路,打造完整前端工作流,提升工程化編碼能力和思維能力。
  • 《前端基礎入門三大核心之html相關博客》:前端基礎入門三大核心之html板塊的內容,入坑前端或者輔助學習的必看知識。
  • 《前端基礎入門三大核心之JS相關博客》:前端JS是JavaScript語言在網頁開發中的應用,負責實現交互效果和動態內容。它與HTML和CSS并稱前端三劍客,共同構建用戶界面。通過操作DOM元素、響應事件、發起網絡請求等,JS使頁面能夠響應用戶行為,實現數據動態展示和頁面流暢跳轉,是現代Web開發的核心。
  • 《前端基礎入門三大核心之CSS相關博客》:介紹前端開發中遇到的CSS疑問和各種奇妙的CSS語法,同時收集精美的CSS效果代碼,用來豐富你的web網頁。
  • 《canvas繪圖相關博客》:Canvas是HTML5中用于繪制圖形的元素,通過JavaScript及其提供的繪圖API,開發者可以在網頁上繪制出各種復雜的圖形、動畫和圖像效果。Canvas提供了高度的靈活性和控制力,使得前端繪圖技術更加豐富和多樣化。
  • 《算法系列相關博客》:算法與數據結構學習總結,通過JS來編寫處理復雜有趣的算法問題,提升你的技術思維。
  • 《python相關博客》:Python,簡潔易學的編程語言,強大到足以應對各種應用場景,是編程新手的理想選擇,也是專業人士的得力工具。
  • 《sql數據庫相關博客》:SQL數據庫:高效管理數據的利器,學會SQL,輕松駕馭結構化數據,解鎖數據分析與挖掘的無限可能。
  • 《IT信息技術相關博客》:作為信息化人員所需要掌握的底層技術,涉及軟件開發、網絡建設、系統維護等領域的知識。
  • 《信息化技能面試寶典相關博客》:涉及信息化相關工作基礎知識和面試技巧,提升自我能力與面試通過率,擴展知識面。
  • 《前端開發習慣與小技巧相關博客》:羅列常用的開發工具使用技巧,如 Vscode快捷鍵操作、Git、CMD、游覽器控制臺等
  • 《AIGC相關博客》:AIGC、AI生產力工具的介紹,例如stable diffusion這種的AI繪畫工具安裝、使用、技巧等總結
  • 《photoshop相關博客》:基礎的PS學習記錄,含括PPI與DPI、物理像素dp、邏輯像素dip、矢量圖和位圖以及幀動畫等的學習總結
  • 《日常開發&辦公&生產【實用工具】分享相關博客》:分享介紹各種開發中、工作中、個人生產以及學習上的工具,豐富閱歷,給大家提供處理事情的更多角度,學習了解更多的便利工具,如Fiddler抓包、辦公快捷鍵、虛擬機VMware等工具。

吾輩才疏學淺,摹寫之作,恐有瑕疵。望諸君海涵賜教。望輕噴,嚶嚶嚶
非常期待和您一起在這個小小的網絡世界里共同探索、學習和成長。愿斯文對汝有所裨益,縱其簡陋未及淵博,亦足以略盡綿薄之力。倘若尚存闕漏,敬請不吝斧正,俾便精進!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/15115.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/15115.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/15115.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Dilworth 定理

這是一個關于偏序集的定理&#xff0c;事實上它也可以擴展到圖論&#xff0c;dp等中&#xff0c;是一個很有意思的東西 偏序集 偏序集是由集合 S S S以及其上的一個偏序關系 R R R定義的&#xff0c;記為 ( S , R ) (S,R) (S,R) 偏序關系&#xff1a; 對于一個二元關系 R ?…

用 vue3 + phaser 實現經典小游戲:飛機大戰

本文字數&#xff1a;7539字 預計閱讀時間&#xff1a;30分鐘 01 前言 說起小游戲&#xff0c;最經典的莫過于飛機大戰了&#xff0c;相信很多同學都玩過。今天我們也來試試開發個有趣的小游戲吧&#xff01;我們將從零開始&#xff0c;看看怎樣一步步實現一個H5版的飛機大戰&a…

C# 串口通訊之艱難排錯之路 —— system.ObjectDisposedException已關閉 Safe handle

今天寫了一個串口通訊掃碼槍驅動&#xff0c;程序運行后&#xff0c;不出意外的全線崩潰&#xff0c;開始了漫長的排查之旅&#xff0c;具體情況報錯如下&#xff1a; 解決未處理 System.ObjectDisposedException Message已關閉 Safe handle Sourcemscorlib ObjectName"&…

【pyspark速成專家】4_Spark之RDD編程2

目錄 四&#xff0c;常用PairRDD的轉換操作 五&#xff0c;緩存操作 四&#xff0c;常用PairRDD的轉換操作 PairRDD指的是數據為長度為2的tuple類似(k,v)結構的數據類型的RDD,其每個數據的第一個元素被當做key&#xff0c;第二個元素被當做value. reduceByKey #reduceByKey…

層次式架構設計理論與實踐

層次式體系結構概述 軟件體系結構為軟件系統提供了結構、行為和屬性的高級抽象&#xff0c;由構成系統的元素描述這些元素的相互作用、指導元素集成的模式以及這些模式的約束組成。 層次式體系結構的每一層最多只影響兩層&#xff0c;同時只要給相鄰層提供相同的接口&#xff…

禁用win10自動更新

services.msc——Windows Update——常規——啟動類型——禁用 services.msc——Windows Update——恢復——三個無操作&#xff0c;9999天。 gpedit.msc——計算機配置——管理模板——Windows組件——Windows更新——配置自動更新——已啟用——2-通知下載和自動更新 Windows…

如何參與github開源項目并提交PR

&#x1f47d;System.out.println(“&#x1f44b;&#x1f3fc;嗨&#xff0c;大家好&#xff0c;我是代碼不會敲的小符&#xff0c;目前工作于上海某電商服務公司…”); &#x1f4da;System.out.println(“&#x1f388;如果文章中有錯誤的地方&#xff0c;懇請大家指正&…

高速公路定向廣播(聲光一體) HT-600D

1、產品概述&#xff1a; HT-600D聲光一體平面波IP定向廣播是北京恒星科通創新性研發產品&#xff0c;采用公司自主研發的平面波傳聲技術&#xff0c;該產品具有高聲壓、強指向性、高清晰度等特點&#xff0c;采用定向聲傳聲技術將聲音聚集到正前方定向傳輸,周邊聲壓級明顯降低…

BTC系列-系統學習銘文(二)-序數理論

Ordinals的BIP: https://github.com/ordinals/ord/blob/master/bip.mediawiki 序數理論概述 序數是一種比特幣的編號方案&#xff0c;允許跟蹤和轉移單個聰。這些數字被稱作序號。比特幣是按照它們被挖掘的順序編號的&#xff0c;并從交易輸入轉移到交易輸出&#xff08;遵循先…

面試題:對已經關閉的channel進行讀寫

在Go語言中對已經關閉的channel進行讀寫&#xff0c;結果會有所不同。 讀操作 我們可以安全地從一個已經關閉的channel中進行讀取數據。如果channel中還有未讀取的數據&#xff0c;讀操作將成功并返回數據以及一個用于表示數據是否有效的標記(如果channel已經關閉并且該數據有…

YOLOV10實時端到端目標檢測

代碼地址&#xff1a;GitHub - THU-MIG/yolov10: YOLOv10: Real-Time End-to-End Object Detection 論文地址&#xff1a;https://arxiv.org/pdf/2405.14458 本文介紹了YOLO系列目標檢測器在實時和高效方面的優勢&#xff0c;但是仍然存在一些缺陷&#xff0c;包括依賴非極大值…

[240525] VMware Pro 個人可免費使用 | 人機交互角度 解釋 AI 同事出錯雖多但深得青睞之奧義

目錄 VMware Workstation Pro 個人可免費使用人機交互研究 ChatGPT 52%回答失實&#xff0c;78%邏輯不一致然卻備受青睞之奧義 VMware Workstation Pro 個人可免費使用 VMware 宣布 Fusion Pro&#xff08;Mac&#xff09;和 Workstation Pro&#xff08;Windows 和 Linux&…

純度高的安卓和混血安卓

安卓陣營純安卓和改裝安卓&#xff0c;純安卓好用&#xff0c;權限控制力度做到很小&#xff0c;每相權限都交用戶控制&#xff0c;權限控制層面可以精確到文件夾和文件&#xff0c;剪切板讀和寫&#xff0c;而且有精確權限追蹤功能&#xff0c;國產高度定制安卓系統只有粗糙訪…

React useState修改對象

在 React 中&#xff0c;useState 是一個 Hook&#xff0c;它可以讓函數組件擁有狀態。當想要改變一個對象類型的狀態時&#xff0c;我們需要使用展開運算符&#xff08;...&#xff09;或者 Object.assign 來確保狀態是正確地更新。 以下是一個使用 useState 來更新對象的例子…

webstorm新建vue項目相關問題

前言 這個迭代后端需求偏少&#xff0c;前端code的鍵盤都起火星子了。來了4個外包支持&#xff0c;1個后端3個前端&#xff0c;還是不夠用啊。剛好趁這個機會稍微學習下vue&#xff0c;其實之前環境也配置過了&#xff0c;所以這里就不分享環境配置了&#xff0c;主要分享下新建…

基于單片機電梯控制系統設計與實現

摘 要: 介紹了電梯控制系統架構 &#xff0c; 指出了該系統的硬件設計和控制系統的軟件設計以及系統調試 &#xff0c; 使系統可根據按鍵 要求完成載客任務&#xff0c;為電梯控制系統的優化提供了參考 。 關鍵詞 : 電梯控制 ; 單片機 ; 系統設計 0 引言 在高層建筑中發揮…

Java開發大廠面試第22講:Redis 是如何保證系統高可用的?它的實現方式有哪些?

高可用是通過設計&#xff0c;減少系統不能提供服務的時間&#xff0c;是分布式系統的基礎也是保障系統可靠性的重要手段。而 Redis 作為一款普及率最高的內存型中間件&#xff0c;它的高可用技術也非常的成熟。 我們今天分享的面試題是&#xff0c;Redis 是如何保證系統高可用…

GPT-4o之多模態

前言 想必&#xff0c;很多小伙伴都知道GPT-4o已經發布了&#xff0c;一手基于多模態的問答顯示&#xff0c;看起來挺厲害的&#xff08;也就是看起來&#xff0c; &#xff09;。然后&#xff0c;我就順手看了看什么是多模態。 簡介 多模態&#xff08;Multimodal&#xff…

什么是組態?什么是工業控制中的組態軟件?

隨著工業4.0和智能制造的發展&#xff0c;工控軟件的應用越來越廣泛&#xff0c;它們在提高生產效率、降低能耗和減少人力成本等方面發揮著越來越重要的作用。 什么是工控軟件&#xff1f; 工控軟件是指用于工業控制系統的軟件&#xff0c;主要應用于各種生產過程控制、自動化…

標準庫算法

歡迎訪問我的博客首頁。 標準庫算法 1. 查找對象的算法2. 其它只讀算法3. 二分搜索算法4. 寫容器元素的算法5. 劃分與排序算法6. 通用重排操作7. 排列算法8. 有序序 列的 集合算法9. 最 小值和 最大值10. 數值算法11. 參考 Pred 表示返回值為布爾類型的可調用對象。 1. 查找對…