CSS選擇器匹配規(guī)則

近期考慮對CSS進行一些重構,看著以前自己的代碼整個人凌亂了。于是做了一些調研寓娩,看到一些不一樣的地方給大家分享一下。

一呼渣、CSS的匹配規(guī)則

1棘伴、根據CSS定義位置來區(qū)別

平常所認為的優(yōu)先級規(guī)則,從根本上來講是片面的屁置。

默認樣式<外部樣式表<內部樣式表<行內樣式    //是片面的

瀏覽器默認樣式最低焊夸,行內樣式最高,這是肯定的缰犁。
但是外部樣式表和內部樣式表其實優(yōu)先級并沒有太大的區(qū)別淳地,只是我們一般都會在head中先引用外部樣式表,再定義內部樣式表帅容,才形成了以上的觀點颇象。(你完全可以把外部樣式表放到body的下面,雖然不太好但是規(guī)則是允許的)
對于所有的非行內自定義樣式(可以統(tǒng)一稱為樣式表)并徘,

樣式表的優(yōu)先級完全取決于被引入或者定義的位置遣钳。

2、根據選擇器的優(yōu)先級來確定

選擇器的優(yōu)先級規(guī)則為:ID > 偽類 > 屬性 > 類 > 元素 > 通配符麦乞,對于組合選擇器的優(yōu)先級就對以上規(guī)則從左到右依次進行比較蕴茴,知道可以得出結果劝评。
例如:#test_id div 則比#test_id .test_class的優(yōu)先級要低。
通常為了保證樣式的準確性倦淀,我們會使用較高優(yōu)先級的選擇器蒋畜,或者使用多種選擇器的組合形式。

3撞叽、!important

最高優(yōu)先級

二姻成、CSS選擇器解析規(guī)則

前面講到,為了保證樣式應用的準確性愿棋,會使用多種選擇器的組合形式科展。于是,就有了一些比較極端的寫法——總是或者盡量使用更多層級的選擇器組合糠雨。
從準確性來看才睹,毫無問題;從性能上看甘邀,這樣會有什么問題嗎琅攘?
顯然,這涉及到CSS的匹配規(guī)則鹃答。

1乎澄、從右到左的匹配規(guī)則

通常思維是選擇器指定越詳細,則越容易匹配测摔,性能越好置济。這種觀點建立的基礎是,對每一個CSS樣式去查詢匹配dom中的節(jié)點锋八,那么選擇器的詳細程度越高浙于,就越能減少查詢的冗余,性能越好挟纱。例如:

.test_class .test_span1{} // 樣式1
.test_class .test_div1 .test_span1{} // 樣式2
// 布局
<div class="test_class">
        <div class="test_div1"><span class="test_span1">測試1</span></div>
        <div class="test_div2"><span class="test_span2">測試2</span></div>
</div>

按照上述規(guī)則羞酗,樣式1會比樣式2多做一次比較,即對test_span2的比較紊服。
這種CSS查詢匹配dom節(jié)點的方式檀轨,就是常說的從左到右的匹配規(guī)則(針對CSS選擇器而言)——針對樣式1,從左到右匹配5次欺嗤,從右到左匹配7次参萄。

2、從右到左的匹配規(guī)則

還有一種思維是選擇器指定越精簡煎饼,則越容易匹配讹挎,性能越好。這種觀點建立的基礎是,對每一個dom節(jié)點去查詢匹配CSS中的樣式筒溃,那么選擇器的詳細程度越高马篮,查詢匹配的次數就越多,性能越差怜奖。例如:

 .test_div1 .test_span{} // 樣式1
.test_class .test_div1 .test_span{} // 樣式2
// 布局
<div class="test_class">
        <div class="test_div1"><span class="test_span">測試1</span></div>
</div>

按照上述規(guī)則浑测,針對“測試1”的樣式匹配,樣式1要比樣式2少1次匹配歪玲。這種dom節(jié)點查詢匹配CSS選擇器的方式尽爆,就是常說的從右到左的匹配規(guī)則(針對CSS選擇器而言)——針對樣式1,從左到右匹配3次读慎,從右到左匹配2次。

3槐雾、CSS選擇器匹配規(guī)則

事實上雖然上述兩種匹配方式都有一定到理論性夭委,但是結論只有一個——從右到左。至于原因募强,先來看一下一些有趣的回答株灸。

3.1 哲學思維

人可以選擇兩條路,但是真正走的卻只有一條擎值。

最根本的道理慌烧。

3.2 價值取向

英文順序一般先小后大,先具體后寬泛鸠儿,例如姓名是先名后姓屹蚊,地址是X號X街X城市X州、日期是日/月/年进每。
西方比較強調個體價值汹粤,中國比較強調家族觀念。
而從右到左正好符合了西方的個體價值觀田晚。
——很性感的思維嘱兼。

3.3、Sunday算法

這里只做了一個概述贤徒,具體的可以自己百科一下芹壕,還挺有意思的。

Sunday算法是Daniel M.Sunday于1990年提出的字符串模式匹配接奈。其核心思想是:在匹配過程中踢涌,模式串發(fā)現不匹配時,算法能跳過盡可能多的字符以進行下一步的匹配鲫趁,從而提高了匹配效率斯嚎。

而從右向左也正符合這一算法。

3.4、瀏覽器加載方式

訪問網頁的整個過程在瀏覽器的表現:

請求數據--詞法語法解析--下載link文件--生成dom樹--構建render樹--繪制

而CSS樣式的匹配正是在構建render樹時進行的堡僻,所以需要采用對每個dom節(jié)點查詢匹配CSS選擇器的方式糠惫,即從右到左的匹配規(guī)則(從1、2可以知道這樣匹配的次數較少)钉疫。

三硼讽、結論

很顯然,我們在定義樣式的選擇器時牲阁,在準確表達的情況下固阁,應該盡量較少選擇器組合中的冗余,從一定程度上提升CSS的性能城菊。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末备燃,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子凌唬,更是在濱河造成了極大的恐慌并齐,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,036評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件客税,死亡現場離奇詭異况褪,居然都是意外死亡,警方通過查閱死者的電腦和手機更耻,發(fā)現死者居然都...
    沈念sama閱讀 93,046評論 3 395
  • 文/潘曉璐 我一進店門测垛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人秧均,你說我怎么就攤上這事食侮。” “怎么了目胡?”我有些...
    開封第一講書人閱讀 164,411評論 0 354
  • 文/不壞的土叔 我叫張陵疙描,是天一觀的道長。 經常有香客問我讶隐,道長起胰,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,622評論 1 293
  • 正文 為了忘掉前任巫延,我火速辦了婚禮效五,結果婚禮上,老公的妹妹穿的比我還像新娘炉峰。我一直安慰自己畏妖,他們只是感情好,可當我...
    茶點故事閱讀 67,661評論 6 392
  • 文/花漫 我一把揭開白布疼阔。 她就那樣靜靜地躺著戒劫,像睡著了一般半夷。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上迅细,一...
    開封第一講書人閱讀 51,521評論 1 304
  • 那天巫橄,我揣著相機與錄音,去河邊找鬼茵典。 笑死湘换,一個胖子當著我的面吹牛,可吹牛的內容都是我干的统阿。 我是一名探鬼主播彩倚,決...
    沈念sama閱讀 40,288評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼扶平!你這毒婦竟也來了帆离?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,200評論 0 276
  • 序言:老撾萬榮一對情侶失蹤结澄,失蹤者是張志新(化名)和其女友劉穎盯质,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體概而,經...
    沈念sama閱讀 45,644評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,837評論 3 336
  • 正文 我和宋清朗相戀三年囱修,在試婚紗的時候發(fā)現自己被綠了赎瑰。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,953評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡破镰,死狀恐怖餐曼,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情鲜漩,我是刑警寧澤源譬,帶...
    沈念sama閱讀 35,673評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站孕似,受9級特大地震影響踩娘,放射性物質發(fā)生泄漏。R本人自食惡果不足惜喉祭,卻給世界環(huán)境...
    茶點故事閱讀 41,281評論 3 329
  • 文/蒙蒙 一养渴、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧泛烙,春花似錦理卑、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽帆疟。三九已至,卻和暖如春宇立,著一層夾襖步出監(jiān)牢的瞬間踪宠,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評論 1 269
  • 我被黑心中介騙來泰國打工泄伪, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留殴蓬,地道東北人。 一個月前我還...
    沈念sama閱讀 48,119評論 3 370
  • 正文 我出身青樓蟋滴,卻偏偏與公主長得像染厅,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子津函,可洞房花燭夜當晚...
    茶點故事閱讀 44,901評論 2 355

推薦閱讀更多精彩內容

  • 1. 介紹 瀏覽器可能是最廣泛使用的軟件肖粮。本書將介紹瀏覽器的工作原理。我們將看到尔苦,當你在地址欄中輸入google....
    康斌閱讀 2,020評論 7 18
  • 簡介網絡瀏覽器很可能是使用最廣的軟件涩馆。在這篇入門文章中,我將會介紹它們的幕后工作原理允坚。我們會了解到魂那,從您在地址欄輸...
    wengjq閱讀 2,030評論 2 15
  • 1.CSS 元素選擇器 最常見的 CSS 選擇器是元素選擇器。換句話說稠项,文檔的元素就是最基本的選擇器涯雅。如果設置 H...
    饑人谷_小侯閱讀 863評論 0 1
  • 這一個星期 我看完了三本所謂的雜書 在如此忙碌的生活中 我都很少會有一個月看完一本書的時候了 有堆積如高山的作業(yè)要...
    噗啦噗嗤閱讀 1,943評論 0 0
  • 想象力小孩子總是更豐富活逆,因為沒有條條框框的限制,但是成人的聯(lián)想能力也不容易小覷拗胜,因為他們有更多的生活經驗蔗候, 超過3...
    V5特湘葉葉閱讀 515評論 0 0