談起 CSS 選擇器你容易忽視的點

偽類選擇器

除去眾所周知的 類選擇器 和 ID 選擇器外叠国,還有相對接觸不那么頻繁的 偽類選擇器和 偽元素選擇器虑粥。而提起偽類選擇器瘪阁,大家可能首先想到 :hover/visited/active/focus 四種狀態(tài)偽類软驰,便沒了下文君躺,實際上偽類選擇器是個大家族最铁,這里有一份標(biāo)準(zhǔn)偽類列表

標(biāo)準(zhǔn)偽類索引

基于關(guān)系的選擇器

基于關(guān)系的選擇器
  • 關(guān)系選擇器比較容易令人忽視的就是 A E / A>E 的區(qū)別了咖城,前者是匹配了A的所有后代元素E族檬,而后者匹配的是 A 的所有直系后代元素 E歪赢。
  • 第二個容易令人混淆的就是 B + E 和 B ~ E,二者都針對的兄弟元素(不包括自己)单料。請看如下例子
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        .text2 + span {
            color: blue;
        }
        .text4 ~ span {
            color: red;
        }
    </style>
</head>
<body>
<div class="warp" id="wrap">
    <span class="text1">1</span>
    <span class="text2">2</span>
    <span class="text3">3</span>
    <span class="text4">4</span>
    <span class="text5">5</span>
    <span class="text6">6</span>
</div>
</body>
</html>埋凯。

最終結(jié)果:


  • 對 + 而言,匹配的是——指定元素(.text2 選擇的元素)的下一個扫尖,能匹配 span 選擇器的兄弟元素白对。(也就是說下一個兄弟元素不是 p 標(biāo)簽,那匹配規(guī)則是不生效的换怖。)
  • 而 ~ 則匹配的是——指定元素(.text4 匹配的元素)后的(所有)甩恼,能匹配 span 選擇器的兄弟元素。
    說白了就是后一個和后多個的問題沉颂,二者都是對兄弟元素聲明規(guī)則媳拴,但不是對自己聲明規(guī)則。

優(yōu)先級計算

之前一直含糊的認(rèn)為兆览,優(yōu)先級是個數(shù)值屈溉,數(shù)值越大優(yōu)先級越高,其中一個id選擇器賦值1000抬探,類選擇器賦值100子巾,標(biāo)簽選擇器賦值1,含糊的累加計算來確定優(yōu)先級小压。

CSS3中選擇器的優(yōu)先級如下計算:

  • 獲取選擇器中ID選擇器的個數(shù)线梗,賦值給a
  • 獲取選擇器中類選擇器,屬性選擇器([type="text"])和偽類選擇器(:hover)的個數(shù)怠益,賦值給b
  • 獲取選擇器中標(biāo)簽(type)選擇器和偽元素選擇器(::before)的個數(shù)仪搔,賦值給c
  • 通用選擇器(*)不占優(yōu)先級權(quán)重

將abc三個數(shù)串聯(lián)成一個基數(shù)絕對大的數(shù)字(既無論數(shù)字再大也不進(jìn)位)。

#btn.red      //a=1,b=1,c=0      =>specificity =   110  
.big li       //a=0,b=1,c=1      =>specificity =   11
ul li         //a=0,b=0,c=2      =>specificity =   2

如果兩個specificity值一樣呢蜻牢?那自然是看樣式表中出現(xiàn)的先后順序烤咧,后者可以覆蓋前者的樣式偏陪。

給元素添加的內(nèi)聯(lián)樣式 (例如, style="font-weight:bold") 總會覆蓋外部樣式表的任何樣式 ,因此可看作是具有最高的優(yōu)先級(不包括!important)煮嫌。

!important除外

當(dāng)在一個樣式聲明上使用 !important 規(guī)則(雖然不鼓勵用)時笛谦,該樣式聲明會覆蓋CSS中任何其他的聲明(包括內(nèi)聯(lián)樣式)。
想要覆蓋 !important 只能再增加一條帶 !important 的 CSS 規(guī)則昌阿。

基于聲明形式的優(yōu)先級
<style>
 //二者都是以 id 屬性做為辨識信息的選擇器饥脑,但是前者以 id 選擇器的形式,后者以屬性的形式聲明
 #id{ color: "red";}
 [id="milk"]{ color: "green"}
</style>
<div id="milk">牛奶</div>

最終這個div的color仍然是 red懦冰,因為 [id="milk"]是以屬性選擇器來添加權(quán)重的灶轰。

容易令人誤解的點

如下例子:
@question 這里兩個選擇器,前者對應(yīng)的優(yōu)先級值 假設(shè)是 0/0/2 后者不應(yīng)該是 0/1/1 嗎刷钢,按理后者優(yōu)先級更高笋颤,但是實際 span 標(biāo)簽的顏色 是 紅色的。

       div span{
           color:red;
       }
        div:first-child{
            color:blue;
        }

這是為什么呢闯捎?

實際上當(dāng)你在確定一個元素的樣式表時椰弊,首先要考慮的并不是優(yōu)先級许溅;只有當(dāng)同一個元素瓤鼻,有多個樣式聲明時,這時候考慮優(yōu)先級才有意義贤重。

請看如下例子:

    <style>
        #wrap {
            color: red;
        }
        span {
            color: blue
        }
    </style>

...

<body>
<div class="warp" id="wrap">
    <span class="text1">233</span>
    <span class="text3">text3</span>
    <p>
        <span class="text2">466</span>
    </p>
</div>

這里的 span 元素的 color 會是什么顏色呢茬祷?
最終都是藍(lán)色。

這里的 color: red; 是屬于繼承而來的顏色并蝗,在 CSS 規(guī)則中直接作用于元素的 樣式聲明總是會 覆蓋 從祖先元素繼承而來的規(guī)則祭犯。

當(dāng)同一個元素有多個聲明的時候,優(yōu)先級才會有意義滚停。因為每一個直接作用于元素的CSS規(guī)則總是會接管/覆蓋(take over)該元素從祖先元素繼承而來的規(guī)則沃粗。來自MDN

參考閱讀:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市键畴,隨后出現(xiàn)的幾起案子最盅,更是在濱河造成了極大的恐慌,老刑警劉巖起惕,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件涡贱,死亡現(xiàn)場離奇詭異,居然都是意外死亡惹想,警方通過查閱死者的電腦和手機(jī)问词,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來嘀粱,“玉大人激挪,你說我怎么就攤上這事辰狡。” “怎么了灌灾?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵搓译,是天一觀的道長。 經(jīng)常有香客問我锋喜,道長些己,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任嘿般,我火速辦了婚禮段标,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘炉奴。我一直安慰自己逼庞,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布瞻赶。 她就那樣靜靜地躺著赛糟,像睡著了一般。 火紅的嫁衣襯著肌膚如雪砸逊。 梳的紋絲不亂的頭發(fā)上璧南,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天,我揣著相機(jī)與錄音师逸,去河邊找鬼司倚。 笑死,一個胖子當(dāng)著我的面吹牛篓像,可吹牛的內(nèi)容都是我干的动知。 我是一名探鬼主播,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼员辩,長吁一口氣:“原來是場噩夢啊……” “哼盒粮!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起奠滑,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤丹皱,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后养叛,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體种呐,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年弃甥,在試婚紗的時候發(fā)現(xiàn)自己被綠了爽室。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖阔墩,靈堂內(nèi)的尸體忽然破棺而出嘿架,到底是詐尸還是另有隱情,我是刑警寧澤啸箫,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布耸彪,位于F島的核電站,受9級特大地震影響忘苛,放射性物質(zhì)發(fā)生泄漏蝉娜。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一扎唾、第九天 我趴在偏房一處隱蔽的房頂上張望召川。 院中可真熱鬧,春花似錦胸遇、人聲如沸荧呐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽倍阐。三九已至,卻和暖如春逗威,著一層夾襖步出監(jiān)牢的瞬間峰搪,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工庵楷, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留罢艾,地道東北人楣颠。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓尽纽,卻偏偏與公主長得像,于是被迫代替她去往敵國和親童漩。 傳聞我的和親對象是個殘疾皇子弄贿,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,792評論 2 345

推薦閱讀更多精彩內(nèi)容