国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

CSS元素選擇器是怎樣運作的?

開發 前端
無論你是編寫一般的 CSS 還是需要經過編譯的 SASS,SCSS,LESS等,最終都被編譯成一行一行的 CSS 樣式屬性,最終交給瀏覽器解析并套用。但是你想過沒有這是如何實現的呢?

在前端工程師的日常工作中,使用 CSS 元素選擇器是稀松平常的事;無論你是編寫一般的 CSS 還是需要經過編譯的 SASS,SCSS,LESS等,最終都被編譯成一行一行的 CSS 樣式屬性,最終交給瀏覽器解析并套用。但是你想過沒有這是如何實現的呢?

瀏覽器渲染

我們先看一下瀏覽器的渲染步驟:

CSS 在被瀏覽器加載后,會被解析成 CSSOM 樹,并嘗試與 Dom 疊加成渲染樹,隨后進行計算位置、渲染等步驟。這樣看來,CSS 屬性套用的關鍵就在于如何從 CSS 轉化成 CSSOM 樹,以及怎么把 CSSOM 套用到 DOM 上去。

CSSOM樹

當我們寫下一組 CSS 樣式時,例如:

  1. #id .class h4 + p { 
  2.    ... 

瀏覽器在解析它時,你可能會認為 CSS 會按照由左到右的依序找出#id>.class>h4>p,最后套用,但實際上瀏覽器解析 CSS 的順序是由右到左的 p>h4>.class>#id。

很違背直覺對吧?但如果考慮到性能問題,從右到左的解析會比從左到右強很多。

假設這有這樣的 HTML:

  1. <div id="div1"> 
  2.     <div class="a"> 
  3.         <div class="b"> 
  4.             ... 
  5.         </div> 
  6.         <div class="c"> 
  7.             <div class="d"> 
  8.                 ... 
  9.             </div> 
  10.             <div class="e"> 
  11.                 ... 
  12.             </div> 
  13.         </div> 
  14.     </div> 
  15.     <div class="f"> 
  16.         <div class="c"> 
  17.             <div class="d"> 
  18.                 ... 
  19.             </div> 
  20.         </div> 
  21.     </div> 
  22. </div> 

以及這邊五條 CSS 樣式規則:

  1. #div1 .c .d {} 
  2. .f .c .d {} 
  3. .a .c .e {} 
  4. #div1 .f {} 
  5. .c .d {} 

讓我們模擬一下,如果把 CSS 從左到右解析,將會生成類似這樣的 CSSOM 樹:

通過<div class =“ d”>中的 .d 來思考,這樣的 CSSOM 樹在套用樣式時,必須對所有的樣式規則進行檢查,以確認樣式規則是否會影響到 .d,到最后才能確定可能會影響到 .d 的樣式規則有這三條:

  • #div1 .c .d
  • .f .c .d
  • .c .d

以此類推,每個 DOM 樹上的元素,都必須便利所有的樣式規則,才可以取得個別的樣式,這樣會造成大量冗余的計算,進而嚴重影響性能。

反過來,如果將前面的 CSS 由右到左進行解析,CSSOM 樹則可能會如下:

和前面的例子一樣,從<div class =“ d”>中 .d 的角度來看,由于會被樣式規則影響到的目標元素,已經全都集中在第一層了,所以就不用再去便利整個 CSSOM 樹了,甚至只需要檢查 .d 以下的子屬性變量是否符合實際 DOM 結構,再將所有符合的樣式規則重新取回,便能完成 .d 對元素的樣式規則套用。

從右到左的解析順序能夠將所有共享的規則路徑收攏在一起,當瀏覽器進行屬性比對時,就不用再便利整個 CSSOM 樹,大大的減少了無效的比對計算。

也可以換個方式思考:在 HTML 的結構中,一個元素可以有無數個子元素,但只能有一個父元素,由子找父(由下往上)搜尋絕對是比較快的。

1. 套用樣式

將 CSSOM 樹解析出來之后就能夠和 DOM 結合了嗎?如果真的有這么簡單就太好了。

除了開發者定義好的 CSS 檔外,還有幾個地方可能會定義樣式規則,影響畫面的渲染:

  • HTML 的 inline style 設置
  • 瀏覽器預設值(就是 CSS reset/normalize 要覆蓋掉的東西)
  • 瀏覽器的使用者偏好設定

瀏覽器負責處理 CSS 的部分,會吧前面所有的東西以及 CSS 文件定義的樣式規則分別整理成單獨的樣式規則組(CSS 規則集),內容記載了樣式規則、目標屬性等信息。

2. 目標屬性

為了提升后面的計算效率,瀏覽器的 CSS 處理內核會按照樣式規則組中個別規則的目標屬性將其分組存放;一共分為以下四組

  • idRules
  • classRules
  • tagNameRules
  • universalRules

這樣在取用時,可以依據目標元素是否存在這個屬性,快速篩出可能會套用的樣式。

套用規則

最后是套用規則。瀏覽器會遵循以下順序和樣式規則權重套用所有的樣式規則:

  • 瀏覽器的預設值
  • 瀏覽器的使用者偏好設定
  • 開發者定義的 CSS
  • inline style
  • 加上 !important 的樣式屬性

你可能會好奇:為什么 inline style 和開發者定義的 CSS 會被另外處理?

我們可以回顧一下瀏覽器渲染的步驟,由于 inline style 存在于 DOM 元素中,只能在 CSS 套用到 DOM 上時才會接觸到,事前無法將兩者結合。

CSS 效率

實際上瀏覽器在這里已經完成了優化機制;瀏覽器會自動將狀態一致的元素做樣式快照。狀態一致就是要滿足以下幾個條件:

  • 沒有設定 ID
  • tag 及 class 必須完全一致
  • 沒有設定 style 屬性
  • 樣式規則中不能使用各種同級選擇器(例如:〜,+,:first-child 等)

由于上面的條件,以及前面討論到的 CSS 運算過程,編寫 CSS 時也有幾個地方可以稍微留心一下:

  • 由于樣式規則的目標屬性會分組存放,id 選擇器效率非常高,所以是不能與其他條件混用的。
  • 不要寫過深的 CSS 樣式規則
  • 能不用 inline style 就不要用,除了難以維護外,由于是存在于 DOM 樹上,無法預先與其他樣式合并計算,所以效率也會大打折扣

如果能夠注意到這類典型的小細節,CSS 效率自然也可以大幅提升。

 

責任編輯:趙寧寧 來源: 前端先鋒
相關推薦

2013-03-11 10:30:56

CSSWeb

2023-01-30 08:42:33

CSS選擇器性能

2010-09-07 11:14:32

CSS屬性選擇器CSS

2023-03-16 10:20:55

CSS選擇器

2010-09-03 09:30:29

CSS選擇器

2010-08-26 12:47:15

CSSclass

2010-09-06 08:52:00

CSS選擇器

2016-10-19 14:54:46

css選擇器css3css

2022-04-14 09:01:19

CSS父選擇器CSS類

2011-10-24 10:30:20

CSS

2025-03-28 02:44:00

2019-10-31 13:17:13

無人超市人臉識別移動支付

2022-04-01 09:02:19

CSS選擇器HTML

2010-09-06 09:41:28

CSS繼承

2024-04-30 10:59:03

WebSocketCSS選擇器

2024-03-27 09:09:40

CSS選擇器

2022-12-23 10:26:09

CSShas()

2010-09-06 09:34:16

CSS派生選擇器

2010-09-06 09:50:34

id選擇器CSS

2010-08-26 12:53:40

CSSid選擇器
點贊
收藏

51CTO技術棧公眾號

欧美一区二区三| 91高清视频在线免费观看| 欧美日本中文字幕| 97xxxxx| 精品一区二区三| 欧美亚洲动漫制服丝袜| 牛人盗摄一区二区三区视频| 中文字幕在线看片| 99久久精品免费| 欧美最近摘花xxxx摘花| h视频网站在线观看| 中文字幕av资源一区| 97久久精品午夜一区二区| 亚洲欧美韩国| 欧美性猛交xxxx富婆| 激情成人开心网| 第一社区sis001原创亚洲| 欧美一区欧美二区| 免费一级电影| 国产成人精品aa毛片| 国产精品美女www| 97视频在线观看网站| 久久影院电视剧免费观看| 狠狠色噜噜狠狠色综合久| 国产一区一一区高清不卡| 欧美中文字幕一区二区三区| 国产白丝袜美女久久久久| 亚洲日产国产精品| 日本道色综合久久影院| 国产福利电影在线播放| 色综合久久精品| 米奇在线777| 国产欧美一区二区精品婷婷| 欧美日本韩国在线| 亚洲毛片在线| 国产精品稀缺呦系列在线| 日本三级久久| 欧美激情综合色综合啪啪五月| 99久久伊人| 色悠悠久久久久| 国产精品18| 欧美大胆a视频| 国产一区调教| 日本免费在线精品| 色婷婷色综合| 国产精品一香蕉国产线看观看| 9l亚洲国产成人精品一区二三 | 捆绑紧缚一区二区三区视频| 蜜桃欧美视频| 狠狠色丁香久久婷婷综合丁香| 国产又粗又爽又黄的视频| 美女一区二区三区| 欧美日韩二三区| 亚洲精品中文在线观看| 伊人免费在线| 久久久国产一区二区| 成人在线免费观看91| 国产亚洲欧美另类一区二区三区 | 爽好久久久欧美精品| 亚洲永久激情精品| 2021国产精品久久精品| 91在线电影| 亚洲色图欧美制服丝袜另类第一页| 日韩一级视频| 国产主播一区二区三区四区| 久久精品久久综合| 亚洲美女主播视频免费观看| 欧美精品久久天天躁| 无码小电影在线观看网站免费| 国产精品观看在线亚洲人成网| 成人免费高清视频在线观看| 亚洲在线不卡| 欧美日韩高清不卡| 欧美一级片网址| 欧美精品一卡二卡| 午夜影院观看视频免费| 久久国产麻豆精品| 奇米成人av国产一区二区三区| 922tv免费观看在线| 免费日韩视频| 国产精品美女免费视频| 欧美成人高清在线| 国产专区综合网| 99re在线播放| 国产精品77777竹菊影视小说| 中文字幕免费高清电视剧网站在线观看| 国产国产精品人在线视| 97精品视频在线观看自产线路二| 国产不卡在线| 亚洲a∨一区二区三区| 亚洲国产精彩中文乱码av在线播放 | 成人在线观看毛片| 亚洲精品二三区| 老司机精品视频在线| 成人黄色动漫| 久久久久久久久久久视频| 久久国产精品久久久| 国产精品久久久久久久午夜片| 中文字幕天天干| 成人动漫一区二区三区| 日本一区视频在线| 日韩精品福利一区二区三区| 97视频网站入口| 日韩精品免费一区二区三区| 精品国产乱码一区二区三区四区| 亚洲国产一区二区三区| 污视频网站观看| 亚洲国产精品av| 国产一级不卡视频| 国产清纯美女被跳蛋高潮一区二区久久w | 国产色婷婷国产综合在线理论片a| 午夜免费视频在线国产| 国产丝袜欧美中文另类| 国产综合精品| gogo久久日韩裸体艺术| 蜜桃av在线免费观看| caoporn超碰97| 国产日韩精品视频| 久久视频在线看| 欧美色网一区二区| 一二三四社区欧美黄| 国产精品夜夜嗨| 欧美一二区在线观看| 日韩有码电影| 国产精品国产精品| 亚洲精品欧美激情| 精品一级毛片| 成人香蕉视频| 99热99re6国产在线播放| 中文字幕在线二区| av免费网站观看| 男女激烈动态图| 国产精品一区二区久久| 亚洲精品一区av在线播放| 91精品国产综合久久久蜜臀图片 | 国产欧美精品一区二区三区四区 | www日韩欧美| 亚洲精品系列| 国内精品久久久久久久影视简单 | 国产成人一区二区精品非洲| 亚洲女人av| 色妞ww精品视频7777| av在线不卡精品| 韩国女主播一区二区| free性护士videos欧美| 台湾佬中文娱乐网欧美电影| 黄色精品在线观看| 91九色porn在线资源| 欧美动物xxx| 美女午夜精品| 国产精品久久777777毛茸茸| 蜜桃视频第一区免费观看| 免费在线观看日韩欧美| 亚洲作爱视频| 久久久国产精品| 国产一区二区三区日韩精品| 精品美女视频| 美国成人xxx| 色综合色综合| 国产在线不卡一区二区三区| 超碰aⅴ人人做人人爽欧美| 免费av在线| 欧洲一区二区三区| 麻豆免费版在线观看| 蜜桃视频在线观看www社区| 国产a国产a国产a| 久久精品香蕉视频| 福利在线小视频| 日韩精品你懂的| 久久精品国产福利| 亚洲天堂一区二区| 在线视频国产三级| 黑料吃瓜在线观看| av理论在线观看| 欧美7777| 欧美丰满老妇| 一本色道88久久加勒比精品| 日本麻豆一区二区三区视频| 日本一区二区视频在线观看| 亚洲国产一区二区三区四区| 亚洲精品美女视频| 欧洲精品中文字幕| 91精品国产一区二区三区蜜臀| 亚洲国产wwwccc36天堂| 日本美女一区二区| 亚洲国产一成人久久精品| 香蕉久久网站| 亚洲精品自拍| 51vv免费精品视频一区二区| 婷婷精品在线观看| 日韩精品成人在线观看| 日本精品视频| 欧美阿v一级看视频| 91精品国产自产在线观看永久∴| 伊人精品久久| 影视一区二区三区| 国内精品久久久久国产| 日本精品在线| 自拍av在线| 制服黑丝国产在线|