css選擇器層疊、優(yōu)先級躺屁、樣式?jīng)_突

css選擇器

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>css學習</title>
</head>
<style>
  .h1 {
    color: aliceblue;
  }

  #page-title {
    color: red;
  }

  .title {
    color: aqua;
  }
</style>

<body>
  <header class="page-header">
    <h1 class="title" id="page-title">深入解析css</h1>
    <nav>
      <ul id="main-nav" class="nav">
        <li>
          <a href="/" class="featured">導航1</a>
        </li>
        <li>
          <a href="/">導航2</a>
        </li>
      </ul>
    </nav>
  </header>
</body>

</html>

上面是一個簡單的html案例树姨,對于同一個元素應用多個規(guī)則時,規(guī)則中可能包含沖突的聲明闺兢,在style樣式表中包含了三個規(guī)則集茂缚,每一個規(guī)則給它指定了不同的字體顏色。標題不可能同時擁有三種顏色屋谭,所以最終的效果是顯示的紅色(red)脚囊。

瀏覽器如何知道并解決聲明沖突,這其中層疊指的就是這一系列規(guī)則桐磁。它決定了如何解決沖突悔耘,是css語言的基礎。層疊會依據(jù)三種條件解決沖突我擂。

  1. 樣式表的來源: 樣式是從哪里來的衬以,包括你的樣式和瀏覽器默認樣式等。
  2. 選擇器優(yōu)先級: 哪些選擇器比另一些選擇器更重要校摩。
  3. 源碼順序: 樣式在樣式表里的聲明順序看峻。

疊層的規(guī)則是按照這種順序來考慮的,看下圖

聲明沖突
    |
    |
不同的來源或者重要新 ---是---> 使用更高優(yōu)先級的來源里的聲明
    |
    否
    |
是不是內(nèi)聯(lián)樣式(作用域) ---是---> 使用內(nèi)聯(lián)聲明
    |
    否
    |
選擇器是否有不同的優(yōu)先級 ---是---> 使用更高優(yōu)先級的聲明
    |
    否
    |
使用源碼順序里較晚出現(xiàn)的聲明
          

這些規(guī)則讓瀏覽器可以以預測的方式解決css樣式規(guī)則中的沖突衙吩。

樣式表的來源

你添加到網(wǎng)頁里的樣式表并不是瀏覽器唯一使用的樣式表互妓,還有其他類型或來源的樣式表。你的樣式表屬于作者樣式表坤塞,除此之外還有用戶代理樣式表冯勉,即瀏覽器默認的樣式。用戶代理樣式表優(yōu)先級低尺锚,你的樣式會覆蓋它們珠闰。

用戶代理樣式表在不同瀏覽器上稍有差異,但是大體上是在做相同的事情:為標題<h1><h6>和段落<p>添加上下邊距瘫辩,為列表<ol>,<ul>添加左側內(nèi)邊距伏嗜,為鏈接添加顏色,為元素添加各種默認字號伐厌。

瀏覽器應用了用戶代理樣式表后才會應用你的樣式表承绸,即作者樣式表,你指定的聲明會覆蓋用戶代理樣式表里面的樣式挣轨,如果在html里鏈接了多個樣式表军熏,那么它們的來源都相同,即屬于作者樣式表卷扮。

用戶代理樣式表因為設置了用戶需要的樣式荡澎,所以不會做出一些超出預期的事情均践,當不喜歡默認樣式的時候,可以在自己的樣式表里面設置別的樣式來覆蓋用戶代理樣式即可摩幔。

覆蓋用戶代理樣式

作為一個標準的前端打工仔彤委,必定熟悉覆蓋代理樣式。這種做法實際上就是利用了層疊的樣式來源規(guī)則或衡。你寫的樣式會覆蓋用戶代理樣式焦影,因為來源不同。

樣式來源規(guī)則有一個例外封断,標記為重要!important的聲明斯辰。該聲明就會被標記為重要的聲明。

color:red !important;

標記了!important的聲明會被當做更高優(yōu)先級的來源坡疼,因此總體的優(yōu)先級按照由高到低排列彬呻,如下所示:

  1. 作者的!important
  2. 作者
  3. 用戶代理

理解優(yōu)先級

如果無法用來源解決沖突聲明,瀏覽器會嘗試檢查它們的優(yōu)先級回梧。理解優(yōu)先級很重要废岂,因為作者樣式幾乎都是屬于優(yōu)先級的范圍,日常工作接觸的大部分開發(fā)樣式是來自于同源狱意,如果不理解優(yōu)先級湖苞,寫出來的css樣式會被坑的很慘。

瀏覽器將優(yōu)先級分為兩部分:HTML的行內(nèi)樣式和選擇器的樣式详囤。

行內(nèi)樣式

如果HTML的style屬性寫樣式财骨,這個聲明只會作用域當前元素。實際上行內(nèi)元素屬于“帶作用域”的聲明藏姐,它會覆蓋任何來自樣式表或<style>標簽的樣式隆箩。行內(nèi)樣式?jīng)]有選擇器,因為它們直接作用于所在的元素羔杨。

<li>
    <a href="/" class="featured" style="color:yellow;">導航1</a>
</li>

上面就是一個行內(nèi)樣式捌臊,設置了顏色color為黃色yellow。

如果你希望在樣式表中覆蓋行內(nèi)樣式的聲明兜材,需要在樣式表中對應標簽下的聲明后添加!importanta理澎,這樣能夠將它提升到一個更高優(yōu)先級來源。但如果行內(nèi)樣式也被標記為!imortant那就無法覆蓋它了曙寡。最好不要在行內(nèi)使用!important糠爬,而是只在樣式表中使用!important

選擇器優(yōu)先級

優(yōu)先級的第二部分是由選擇器優(yōu)先級決定举庶。比如执隧,有兩個類名的選擇器比只有一個類名的選擇器優(yōu)先級更高。具體可以看下面的案例。

通過比較選擇器類型來決定哪個選擇器優(yōu)先值最高镀琉。

/* 四個標簽 */
html body header h1{
  color:blue;
}

/* 3個標簽和1個類 */
body header .page-header h1{
  color:orange;
}

/* 2個類 */
.page-header .title{
  color:green;
}

/* 1個id */
#page-title{
  color:red;
}

上面的樣式表中最終顯示的color顏色值為紅色(red)峦嗤。

優(yōu)先級標記

一個常用的表示優(yōu)先級的方式是用數(shù)組形式來標記,通常用都好隔開每個數(shù)滚粟。比如“1寻仗,2,3”表示用1個id凡壤、2個類、2個標簽組成耙替。優(yōu)先級最高的id列為第一位亚侠,緊接著是類,最后是標簽俗扇。

我們可以通過下面的表格來查看各種選擇器和對應的優(yōu)先級硝烂。

選擇器 id 標簽 標記
html body header ul 0 0 4 0,0,4
Body header.page-header h1 0 1 3 0,1,3
.page-header .title 0 2 0 0,2,0
#page-title 1 0 0 1,0,0

現(xiàn)在,通過比較數(shù)值就能快速明確決定哪個優(yōu)先級更高铜幽。所以上面的順序是"1,0,0">"0,2,0">"0,1,3">"0,0,4"滞谢。而優(yōu)先級低的樣式表會被優(yōu)先級高的樣式表給覆蓋。

我們?nèi)粘i_發(fā)不建議某個元素的樣式表寫過長的標簽名和類名連體除抛。一般只要能夠區(qū)分優(yōu)先級即可狮杨。

源碼順序

疊層的第三步,也是最后一步到忽,是源碼順序橄教。如果兩個聲明的來源和優(yōu)先級相同,其中一個聲明在樣式表中出現(xiàn)較晚喘漏,或者位于頁面較晚引入的樣式表中护蝶,則該聲明勝出。

.nav a{
  color:white;
}

a.featured{
  color:gray;
}

在上面方法中翩迈,選擇器優(yōu)先級相同持灰,都是(0,1,1),最終瀏覽器呈現(xiàn)的顏色color是灰色gray负饲。

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末堤魁,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子绽族,更是在濱河造成了極大的恐慌姨涡,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件吧慢,死亡現(xiàn)場離奇詭異涛漂,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進店門匈仗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來瓢剿,“玉大人,你說我怎么就攤上這事悠轩〖淇瘢” “怎么了?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵火架,是天一觀的道長鉴象。 經(jīng)常有香客問我,道長何鸡,這世上最難降的妖魔是什么纺弊? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮骡男,結果婚禮上淆游,老公的妹妹穿的比我還像新娘。我一直安慰自己隔盛,他們只是感情好犹菱,可當我...
    茶點故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著吮炕,像睡著了一般腊脱。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上来屠,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天虑椎,我揣著相機與錄音,去河邊找鬼俱笛。 笑死捆姜,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的迎膜。 我是一名探鬼主播泥技,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼磕仅!你這毒婦竟也來了珊豹?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤榕订,失蹤者是張志新(化名)和其女友劉穎店茶,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體劫恒,經(jīng)...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡贩幻,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年轿腺,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片丛楚。...
    茶點故事閱讀 38,622評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡族壳,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出趣些,到底是詐尸還是另有隱情仿荆,我是刑警寧澤,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布坏平,位于F島的核電站拢操,受9級特大地震影響,放射性物質發(fā)生泄漏功茴。R本人自食惡果不足惜庐冯,卻給世界環(huán)境...
    茶點故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望坎穿。 院中可真熱鬧,春花似錦返劲、人聲如沸玲昧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽孵延。三九已至,卻和暖如春亲配,著一層夾襖步出監(jiān)牢的瞬間尘应,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工吼虎, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留犬钢,地道東北人。 一個月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓思灰,卻偏偏與公主長得像玷犹,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子洒疚,可洞房花燭夜當晚...
    茶點故事閱讀 43,490評論 2 348