css 优先级
在講CSS優先級的優先級之前,我們得要了解什么是CSS,CSS是用來做什么的。
首先,我們對CSS作一個簡單的說明:CSS是層疊樣式表(Cascading Style Sheets)的簡稱。它的規范代表了互聯網歷史上一個獨特的發展階段。現在對于從事網頁制作的朋友來說,應該很少沒有聽說過CSS了,因為在制作網頁過程中我們經常需要用到。
其次:我們能通過CSS為文檔設置豐富且易于修改的外觀,以減輕網頁制作者的工作負擔,從而減輕制作及后期維護的代價。
其實現在還來講CSS是什么,CSS有什么作用完全是多余的,相信從事網頁制作的朋友都已經或多或少的接觸過了。
言歸正傳,我們開始進入今天的話題:
一、什么是CSS優先級?
所謂CSS優先級,即是指CSS樣式在瀏覽器中被解析的先后順序。
二、CSS優先級規則
既然有優先級,那么就會有一個規則來約定這個優先級,而這個“規則”就是本次所需要講的重點。
樣式表中的特殊性描述了不同規則的相對權重,它的基本規則是:
1. 統計選擇符中的ID屬性個數。
2. 統計選擇符中的CLASS屬性個數。
3. 統計選擇符中的HTML標記名個數。
最后,按正確的順序寫出三個數字,不要加空格或逗號,得到一個三位數(css2.1是用4位數表示)。( 注意,你需要把數字轉換成一個以三個數字結尾的更大的數)。相應于選擇符的最終數字列表可以很容易確定較高數字特性凌駕于較低數字的。
例如:
1. 每個ID選擇符(#someid),加 0,1,0,0。
2. 每個class選擇符(.someclass)、每個屬性選擇符(形如[attr=value]等)、每個偽類(形如:hover等)加0,0,1,0。
3. 每個元素或偽元素(:firstchild)等,加0,0,0,1。
4. 其它選擇符包括全局選擇符*,加0,0,0,0。相當于沒加,不過這也是一種specificity,后面會解釋。
三、特性分類的選擇符列表
以下是一個按特性分類的選擇符的列表:
| 選擇符 | 特性值 |
| h1 {color:blue;} | 1 |
| p em?{color:purple;} | 2 |
| .apple?{color:red;} | 10 |
| p.bright?{color:yellow;} | 11 |
| p.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是不能被繼承的,還有一些其它的屬性也是如此,這里就不一一列舉。
五、附加說明
1. 文內的樣式優先級為1,0,0,0,所以始終高于外部定義。這里文內樣式指形如<div style="color:red">blah</div>的樣式,而外部定義指經由<link>或<style>卷標定義的規則。
2. 有!important聲明的規則高于一切。
3. 如果!important聲明沖突,則比較優先權。
4. 如果優先權一樣,則按照在源碼中出現的順序決定,后來者居上。
5. 由繼承而得到的樣式沒有specificity的計算,它低于一切其它規則(比如全局選擇符*定義的規則)。
6. 關于經由@import加載的外部樣式,由于@import必須出現在所有其它規則定義之前(如不是,則瀏覽器應該忽略之),所以按照后來居上原則,一般優先權沖突時是占下風的。
?
優先級的實際應用中的問題?
一、css優先級
FF:?? ID選擇器(形如#divMain{}) > 類(形如.divSpecial{}) > 標簽(形如body{})?
IE:??? 類 > ID選擇器 > 標簽
例:
<div id="divMain" class="divSpecial">內容兒</div>
在Firefox中表現出 #divMain{} 所定義的樣式,而在IE中則表現出 .divSpecial{} 所定義。
二、CSS文件的優先級
1、標有"!important"的規則有最高優先級
一個樣式規則可以有一個"important"附帶標簽,表示該樣式規則具有最高優先級。例如下面例子中,前景色被標為important。
H1{color:black !importan; font-family:sans-serif}
注意:這種聲明容易引起混亂,因此通常使用得較少。
2、創作者規則優先級高于瀏覽者規則
瀏覽器允許瀏覽者創建樣式規則以覆蓋系統缺省值。在此情況下,由網頁創作者明確設定得樣式優先級較高,而瀏覽者設置得樣式規則優先級較低。
3、更特殊得規則優先于不夠特殊的規則
在決定特殊性時,selector中的ID屬性有最高優先級。基于ID selector的優先級可通過計數Selector中類屬性的數量確定,數量越多優先級越高。假如規則仍然無法確定優先級,則HTML元素名的數量決定了特殊性。
4、在同一個級別的情況下,最后指定的規則有優先權
假如兩個或更多的規定在應用了前三個規定具有相同優先級,則后給出的規則優先于早先給出的規則。
如果在網頁的HEAD標記中同時使用了STYLE標記符(指定嵌入式樣式)和LINK標記符(指定鏈接式樣式),并且這兩個樣式指定中同時應用了具有同一優先級別的樣式,則STYLE標記符和LINK標記符的先后順序將決定樣式的優先級。
例如,如果在LINK所鏈接的樣式表(mycss.css)中定義了以下一條樣式規則:
H1{color:red}
同時在嵌入式樣式定義中也定義了一條規則:
H1{color:yellow}
在網頁中的樣式定義如下所示:
<HEAD>
<LINK rel=stylesheet href="mycss.css" type="text/css">
<STYLE>
<!--
H1{color:yellow}
-->
</STYLE>
</HEAD>
由于STYLE標記符中定義的樣式后出現,因此它具有更高的優先級,所以網頁中H1標記符的內容將顯示為黃色(yellow)。同樣,如果將Link標記符的位置移動到<STYLE></STYLE>標記符之后,則網頁中H1標記符的內容將顯示為紅色(red)。
另外,由于直插式樣式(使用HTNL標記的style屬性設置的樣式)的位置最接近于樣式作用的標記符,因此它通常具有高優先級。
轉載于:https://www.cnblogs.com/hainange/archive/2009/03/12/6153218.html
總結
- 上一篇: WSE3.0构建Web服务安全(4):M
- 下一篇: linux下访问windows共享文件夹