一些你可能不知道的前端小優化- ??(?????)

前言

以前寫css和html和一些原生DOM操作,感覺寫完就完事了。從來沒有考慮過一些性能優化的問題,剛好最近學完了瀏覽器的事件循環和瀏覽器的工作流程。今天大家分享一些我剛學習到的前端小優化。

瀏覽器的工作流程

瀏覽器的渲染過程大致分為以下幾個階段:

  1. HTML解析:將HTML文檔解析成DOM樹。
  2. CSS解析:將CSS規則解析成CSSOM樹。
  3. 合成渲染樹:DOM樹與CSSOM樹結合,生成渲染樹
  4. 布局計算:根據渲染樹計算每個節點的幾何位置和尺寸,形成布局樹。
  5. 繪制階段:將布局樹轉換為實際像素,繪制到屏幕上。

這一系列步驟高效協作,最終將靜態的HTML和CSS代碼轉化為用戶可見的動態頁面。
這意味著css的復雜度是會影響到渲染樹的生成進而影響瀏覽器的渲染速度。因此在css中我們需要簡化選擇器,避免使用過于復雜的選擇器。

1- 避免使用 *(通配符) 選擇器

有沒有人開始學前端都和我一樣都喜歡這樣進行樣式初始化的

*{margin:0px;padding:0px;
}

上面的代碼雖然能實現所有標簽的樣式初始化,但是通配符選擇器匹配頁面上的每一個元素。在大型或結構復雜的網頁中,這可能意味著成百上千甚至上萬個元素。瀏覽器的CSS引擎在處理這樣的選擇器時,需要遍歷整個DOM樹,對每個元素進行檢查和匹配,這無疑增加了計算負擔,可能導致頁面渲染變慢,尤其是初次加載時。

如果您需要初始化css的代碼的話這個網站是個不錯的選擇:CSS Tools: Reset CSS (meyerweb.com)

2-避免直接使用標簽選擇器

請看下面這段代碼做出你的選擇:

<ul class="list">
<li class="list-item"></li>
</ul>
ul*10>li*10//這里代表著10個ul里面每個都擁有10個li標簽

:面對上面的html,你需要選中擁有list-item類名的li,請寫出你認為效率最高的選擇方法

  • A選項 .list li
  • B選項 .list .list-item


    這題我認為效率最高的應該是B選項,下面是我的個人考量,大佬們有不同的見解也歡迎在評論區指出。

    是從右往左進行讀取匹配選擇器,右邊如果先讀取到的如果是li標簽那么將會先匹配所有的li標簽節點,然后在往上尋找是父容器是否是 .list 類,應用css樣式。所以在平常css的書寫中,我們應當減少標簽選擇器的使用。使用類名或者是id 來進行標簽的選擇。

3-減少回流操作

減少回流操作之前,我先介紹一下,什么是回流


回流是指瀏覽器為了重新渲染部分或全部文檔而重新計算元素的位置和尺寸的過程。在回流過程中,瀏覽器會根據各種樣式屬性(如寬高、邊距、填充、邊框等)重新計算元素的位置和大小,然后繪制到屏幕上。(這是比較消耗時間的)



那什么時候會觸發回流操作呢?
導致回流的原因有很多,常見的包括:

  1. DOM元素的添加、刪除或修改:任何對DOM結構的改變都會導致回流。
  2. 樣式計算:修改元素的樣式屬性(如寬高、邊距、填充等)可能導致回流。
  3. 尺寸調整:調整瀏覽器窗口大小或添加/刪除滾動條也會觸發回流。
  4. 獲取某些屬性:讀取某些屬性(如offsetWidthoffsetHeightscrollTop等)時,瀏覽器可能需要回流來確保返回最新的值。


    看看下面這個案例你能找出幾個優化點
for(let i=0;i<10000;i++){document.querySelector('.list').innerHTML +=`<li>我是小麗</li>` ;
}
  • document.querySelector('.list')應當提出到循環外面用變量保存,不然每次都需要重新進行選擇
  • 減少操作原生dom的次數,不能像循環中一樣每次循環操作一次。爭取一次性操作完成,可以像下面這樣
const list_item =  document.querySelector('.list');
let str = "";
for(let i=0;i<10000;i++){str+=`<li>我是小麗</li>` ;
}
list_item.innerHTML =str;

但是其實這里我推薦另外一種寫法也是今天給大家介紹的豬腳之一,**createDocumentFragment**文檔碎片

4-文檔碎片

DocumentFragment?是一個非常有用的 DOM 接口,它被用于創建一個輕量級的文檔對象,它的獨特之處在于它不會被渲染到頁面中,但可以包含各種 DOM 節點。這種方法可以用于優化 DOM 操作,因為它可以減少頁面上的回流和重繪次數。

上面的代碼就可以寫出下面這樣

let content = document.createDocumentFragment();
const list_item =  document.querySelector('.list');for (let i = 0;i < 10000; i++) {let li = document.createElement('li');oSpan.innerHTML = '我是小麗';content.appendChild(oSpan);}
container.appendChild(content);

同樣避免了dom節點的頻繁操作,而且在語義結構上更加的豐富和完善。

結語

本次的分享就到這里了,希望對您有所收獲,喜歡的話就點個關注或者是贊吧,謝謝-???(?????)

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

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

相關文章

Windows 11內置一鍵系統備份與還原 輕松替代Ghost

面對系統崩潰、惡意軟件侵襲或其他不可預見因素導致的啟動失敗&#xff0c;Windows 7~Windows 11內置的系統映像功能能夠迅速將您的系統恢復至健康狀態&#xff0c;確保工作的連續性和數據的完整性。 Windows內置3種備份策略 U盤備份&#xff1a;便攜且安全 打開“創建一個恢…

Ubuntu20.04突然沒網的一種解決辦法

本來要學一下點云地圖處理&#xff0c;用octomap庫&#xff0c;但是提示少了octomap-server庫&#xff0c;然后通過下面命令安裝的時候&#xff1a; sudo apt install ros-noetic-octomap-server 提示&#xff1a;錯誤:7 https://mirrors.ustc.edu.cn/ubuntu focal-security …

MWC上海展 | 創新微MinewSemi攜ME54系列新品亮相Nordic展臺

6月28日&#xff0c; 2024MWC上海圓滿落幕&#xff0c;此次盛會吸引了來自全球124個國家及地區的近40,000名與會者。本屆大會以“未來先行&#xff08;Future First&#xff09;”為主題&#xff0c;聚焦“超越5G”“人工智能經濟”“數智制造”三大子主題&#xff0c;探索討論…

leetcode熱題HOT42. 接雨水

一、問題描述&#xff1a; 給定 n 個非負整數表示每個寬度為 1 的柱子的高度圖&#xff0c;計算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 二、解題思路&#xff1a; 思路1&#xff1a;通過動態規劃的預處理方式&#xff0c;分別計算每個柱子左右兩側的最大高度&…

js數據庫多級分類按樹形結構打印

可以使用 JavaScript 來按層級打印 categories 數組。首先&#xff0c;需要將這個數組轉換成一個樹形結構&#xff0c;然后再進行遞歸或者迭代來打印每個層級的內容。 以下是一個示例代碼&#xff0c;用來實現這個功能&#xff1a; const categories [{ id: 2, name: "…

java如何刪除字符串內部分字符

java中&#xff0c;如果要刪除字符串內部分字符&#xff0c;需要用delete方法&#xff0c;前提字符串是可變字符串StringBuffer類型的。 delete方法的語法格式是sbf.delete(start,end) 其中&#xff0c;sbf是任意StringBuffer對象&#xff0c;start是起始索引&#xff0c;end…

AQ mode

算法原理概述 AQ即adaptive quantization(自適應量化),屬于宏塊級別碼流分配的范疇,在一幀的宏塊之間調整碼率分配,x264中AQ算法的核心內容是:復雜宏塊使用大的QP,簡單宏塊使用小的QP。x264如何定義復雜?x264是根據宏塊內像素值的方差來評價宏塊復雜性,方差越大,宏塊…

溶解氧(DO)理論指南(1)

轉載自梅特勒官網資料&#xff0c;僅用于學習交流&#xff0c;侵權則刪&#xff01; 溶解氧理論指南 1 溶解氧(DO)原理1.1 溶解氧和分壓1.2 氧氣在水中的溶解度1.3 溶解氧對生物的重要性1.4 溶解氧對工業的重要性 1 溶解氧(DO)原理 氧是宇宙中第三大常見元素&#xff0c;也是…

JavaScript(6)——數據類型轉換

為什么需要類型轉換&#xff1f; JavaScript是弱數據類型&#xff1a;JavaScript不知道變量到底屬于哪種數據類型&#xff0c;只有賦值了才清除 使用表單&#xff0c;prompt獲取的數據默認為字符串類型&#xff0c;此時不能直接進行算數運算 隱式轉換 某些運算符被執行時&am…

力扣hot100-鏈表

文章目錄 概要鏈表的類型 題目&#xff1a;相交鏈表題解 概要 鏈表&#xff08;Linked List&#xff09;是數據結構中的一種&#xff0c;用于存儲具有線性關系的數據。在鏈表中&#xff0c;每個元素稱為一個節點&#xff08;Node&#xff09;&#xff0c;每個節點包含兩個部分…

”極大似然估計“和”貝葉斯估計“思想對比

極大似然估計&#xff08;Maximum Likelihood Estimation, MLE&#xff09;和貝葉斯估計&#xff08;Bayesian Estimation&#xff09;是統計學中兩種重要的參數估計方法&#xff0c;它們在思想和應用上有著顯著的差異。下面我將詳細對比這兩種方法的思想&#xff0c;并分別舉出…

兩次叛國投敵,沒有禍及子孫反而家族長盛不衰的傳奇

這個人就是韓國國王韓王信&#xff0c;漢朝八大異姓王之一。 第一次叛國投敵&#xff0c;發生在楚漢爭霸時期。有一次他的軍隊被項羽包圍&#xff0c;于是選擇了投降。不過&#xff0c;這是權宜之計&#xff0c;不久就借機回到劉邦陣營。 第二次叛國投敵&#xff0c;發生在西…

【Linux開發】基于ALSA庫實現音量調節

基于ALSA庫實現音量調節 ALSA庫實現音量調節1、使用alsamixer工具查看音頻接口2、完整代碼2.1、snd_mixer_open2.2、snd_mixer_attach、2.3、snd_mixer_selem_register2.4、snd_mixer_load2.5、snd_mixer_first_elem/snd_mixer_elem_next2.6、snd_mixer_selem_get_playback_vol…

linux下php的psr.so擴展源碼安裝

cd /usr/local/src git clone https://github.com/jbboehr/php-psr.git cd php-psr /usr/local/php/bin/phpize ./configure --with-php-config/usr/local/php/bin/php-config make make install在php.ini中添加extensionpsr.so 重啟php-fpm /etc/init.d/php-fpm relo…

打卡第3天---鏈表相關

除了每天自己寫博客總結我個人的學習收獲情況之外,我也會看其他錄友寫的博客文章,對于其他錄友的博客內容在代碼隨想錄的訓練營都是開誠布公的,都能互相看到。彼此學習,彼此參照,有一位錄友思路很清晰呀,用畫圖軟件把自己對題的思路畫的特別清晰,我 應該向他們學習;除此…

從零開始使用 Docsify 搭建文檔站點

引言 在當今的技術環境中&#xff0c;擁有一份易于訪問和美觀的文檔是至關重要的。Docsify 是一個非常適合快速搭建文檔站點的工具&#xff0c;它簡單易用&#xff0c;且不需要生成靜態文件。本文將帶你一步步從零開始使用 Docsify 搭建一個文檔站點。 1. 安裝 Node.js 和 np…

【ARMv8/v9 GIC 系列 5.1 -- GIC GICD_CTRL Enable 1 of N Wakeup Function】

請閱讀【ARM GICv3/v4 實戰學習 】 文章目錄 GIC Enable 1 of N Wakeup Function基本原理工作機制配置方式應用場景小結GIC Enable 1 of N Wakeup Function 在ARM GICv3(Generic Interrupt Controller第三代)規范中,引入了一個名為"Enable 1 of N Wakeup"的功能。…

上海市計算機學會競賽平臺2023年2月月賽丙組區間的并

題目描述 給定一個數軸上的 &#x1d45b;n 個閉區間&#xff0c;第 &#x1d456;i 個閉區間的兩端點為[&#x1d44e;&#x1d456;,&#x1d44f;&#x1d456;][ai?,bi?]&#xff0c;它們的并集可以表示為若干不相交的閉區間&#xff0c;請按照左端點從小到大的順序輸出…

(一)Docker基本介紹

部署項目的發展 傳統部署適合需要最大性能和可靠性的場景&#xff0c;但在資源利用和管理方面有顯著劣勢。虛擬化部署提供了良好的資源利用率和隔離性&#xff0c;適用于需要靈活擴展和多租戶環境的場景&#xff0c;但存在性能開銷。容器部署在輕量級、可移植性和資源利用率方面…

適合金融行業的國產傳輸軟件應該是怎樣的?

對于金融行業來說&#xff0c;正常業務開展離不開文件傳輸場景&#xff0c;一般來說&#xff0c;金融行業常用的文件傳輸工具有IM通訊、郵件、自建文件傳輸系統、FTP應用、U盤等&#xff0c;這些傳輸工具可以基礎實現金融機構的文件傳輸需求&#xff0c;但也存在如下問題&#…