在講CSS優先級之前,我們得要了解什麼是CSS,CSS是用來做什麼的。
首先,我們對CSS作一個簡單的說明:CSS是層疊樣式表(Cascading Style Sheets)的簡稱。它的規范代表了互聯網歷史上一個獨特的發展階段。現在對於從事網頁制作的朋友來說,應該很少沒有聽說過CSS了,因為在制作網頁過 程中我們經常需要用到。
其次:我們能通過CSS為文檔設置豐富且易於修改的外觀,以減輕網頁制作者的工作負擔,從而減輕制作及後期維護的代價。
其實現在還來講CSS是什麼,CSS有什麼作用完全是多余的,相信從事網頁制作的朋友都已經或多或少的接觸過了。
言歸正傳,我們開始進入今天的話題:
一、什麼是CSS優先級?
所謂CSS優先級,即是指CSS樣式在浏覽器中被解析的先後順序。
二、CSS優先級規則
既然樣式有優先級,那麼就會有一個規則來約定這個優先級,而這個“規則”就是本次所需要講的重點。
樣式表中的特殊性描述了不同規則的相對權重,它的基本規則是:
最後,按正確的順序寫出三個數字,不要加空格或逗號,得到一個三位數(CSS2.1是用4位數表示)。( 注意,你需要把數字轉換成一個以三個數字結尾的更大的數)。相應於選擇符的最終數字列表可以很容易確定較高數字特性凌駕於較低數字的。
例如:
三、特性分類的選擇符列表
以下是一個按特性分類的選擇符的列表:
選擇符
特性值
h1 {color:blue;}
1
p em {color:purple;}
2.apple {color:red;}
10p.bright {color:yellow;}
11p.bright em.dark {color:brown;}
22#id316 {color:yellow}
100單從上面這個表來看,貌似不大好理解,下面再給出一張表:
選擇符
特性值
h1 {color:blue;} 1 p em {color:purple;} 1+1=2 .apple {color:red;} 10 p.bright {color:yellow;} 1+10=11 p.bright em.dark {color:brown;} 1+10+1+10=22 #id316 {color:yellow} 100通過上面,就可以很簡單的看出,Html標記的權重是1,CLASS的權重是10,ID的權重是100,繼承的權重為0(後面會講到)。
按這些規則將數字符串逐位相加,就得到最終的權重,然後在比較取捨時按照從左到右的順序逐位比較。
優先級問題其實就是一個沖突解決的問題,當同一個元素(內容)被CSS選擇符選中時,就要按照優先級取捨不同的CSS規則,這其中涉及到的問題其實很多。
說到這裡,我們不得不說一下CSS的繼承性。
四、CSS的繼承性
4.1 繼承的表現
繼承是CSS的一個主要特征,它是依賴於祖先-後代的關系的。繼承是一種機制,它允許樣式不僅可以應用於某個特定的元素,還可以應用於它的後代。例如一個BODY定義了的顏色值也會應用到段落的文本中。
樣式定義:
body {color:#f00;}
舉例代碼:
<p>CSS<strong>繼承性</strong>的測試</p>
舉例效果:
這段代碼的應用結果是:“CSS繼承性的測試”這段話是紅顏色的,“繼承性”幾個字由於應用了<strong>標簽,所以是粗體。很顯然,這段文字都繼承了由body {color:#f00;}樣式定義的顏色。這也就是為什麼說繼承性是CSS的一部分。
然而CSS繼承性的權重是非常低的,是比普通元素的權重還要低的0。
我們仍以上面的舉例代碼為例:在樣式定義中添加一條:
strong {color:#000;}
舉例效果:
發現只需要給<strong>加個顏色值就能覆蓋掉它繼承自<body>的樣式顏色。由此可見:任何顯示申明的規則都可以覆蓋其繼承樣式。
4.2 繼承的局限性
繼承是CSS重要的一部分,我們甚至不用去考慮它為什麼能夠這樣,但CSS繼承也是有限制的。
有一些屬性不能被繼承,如:border, margin, padding, background等。
樣式定義:
div {border:1px solid #000;}
舉例代碼:
<div>我是<em>border</em>我是不能被繼承滴</div>
預期效果:
實際效果:
從上面的效果中,我們可以看出,border是不能被繼承的,還有一些其它的屬性也是如此,這裡就不一一列舉。
五、附加說明
還需要說一下,IE是可以識別位置錯誤的@import的,但無論@import在什麼地方,它都認為是位於所有其它規則定義之前的,這可能會引發一些誤會。
優先權問題看起來簡單,但背後還是有非常復雜的機制,在實際應用中需要多多留意。
六、練習
看完上面的文字後,來做幾道非常簡單的題目。(自己答完前,請不要先看各題給出的鏈接地址哦)
1. 如何讓使用兩個使用相同樣式名的元素具有不同的效果:
運行代碼框
[Ctrl+A 全部選擇 提示:你可先修改部分代碼,再按運行]
固定效果:
固定代碼:
2. 如何讓<h3>始終為黑色,而<em>在不被<h3>包含的情況為紅色:
運行代碼框
[Ctrl+A 全部選擇 提示:你可先修改部分代碼,再按運行]
固定效果:
固定代碼:
<h3>討論<em>CSS</em>優先級</h3>
<p>討論<em>CSS</em>優先級</p>
3. 如何寫一個外部樣式使得
<h3 style="color:#000;"> 覆蓋我</h3>
的顏色為紅色:
運行代碼框
[Ctrl+A 全部選擇 提示:你可先修改部分代碼,再按運行]
4. 如何讓同時具有.a,.b樣式的元素只表現.a的顏色樣式:
運行代碼框
[Ctrl+A 全部選擇 提示:你可先修改部分代碼,再按運行]
固定代碼:
<p class="a b">傳說中滴測試</p>
關於樣式優先級,今天就先聊到這。
<div class="test">傳說中的測試</div>
<p class="test">傳說中的測試</p>