首頁  >  文章  >  web前端  >  分享CSS優先順序的詳細分析

分享CSS優先順序的詳細分析

高洛峰
高洛峰原創
2017-03-10 11:24:511593瀏覽

在講CSS優先權之前,我們得要了解什麼是CSS,CSS是用來做什麼的。

首先,我們對CSS作一個簡單的說明:CSS是層疊樣式表(Cascading Style Sheets)的簡稱。

它的規範代表了網路歷史上一個獨特的發展階段。現在對於從事網頁製作的朋友來說,應該很少沒有聽過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,後面會解釋。

三、特性分類的選擇符清單

#以下是一個依特性分類的選擇符的清單:


#特性值21011#22

#選擇符

#h1 {color:blue;}

1

#p em {color:purple ;}

#.apple {color:red;}

p.bright {color:yellow;}

p.bright em.dark {color:brown;}
################id316 {color:yellow}##############100########## ##

單從上面這個表來看,似乎不大好理解,下面再給一張表:


1##1+1= 2.apple {color:red;}10p.bright {color:yellow;}1+10=11p.bright em.dark {color:brown;}1+10+1+10=22

選擇符號

##h1 {color:blue;}
#p em {color:purple;}
####id316 {color:yellow}######100############

透過上面,就可以很簡單的看出,HTML標記的權重是1,CLASS的權重是10,ID的權重是100,繼承的權重為0(後面會講到)。

依這些規則將數字串逐位元相加,就得到最終的權重,然後在比較取捨時按照從左到右的順序逐位比較。

優先權問題其實就是一個衝突解決的問題,當同一個元素(內容)被CSS選擇符選中時,就要按照優先權取捨不同的CSS規則,這其中涉及到的問題其實很多。

說到這裡,我們不得不說CSS的繼承性。

四、CSS的繼承性

#4.1 繼承的表現

繼承是CSS的一個主要的特徵,它是依賴祖先-後代關係的。繼承是一種機制,它允許樣式不僅可以應用於某個特定的元素,還可以應用於它的後代。例如一個BODY定義了的顏色值也會應用在段落的文字中。

樣式定義:

body {color:#f00;}

#範例程式碼:

繼承性的測試

##範例效果:

分享CSS優先順序的詳細分析

這段程式碼的應用結果是:「CSS繼承性的測試」這段話是紅顏色的,「繼承性」幾個字由於應用了標籤,所以是粗體。很顯然,這段文字都繼承了由body {color:#f00;}樣式定義的顏色。這也就是為什麼說繼承性​​是CSS的一部分。

然而CSS繼承性的權重是非常低的,是比普通元素的權重還要低的0。

我們仍以上面的舉例程式碼為例:在樣式定義中新增一條:

strong {color:#000;}

舉例效果:

發現只需給加個顏色值就能覆寫它繼承自的樣式顏色。由此可見:任何顯示申明的規則都可以覆蓋其繼承樣式。

4.2 繼承的限制

繼承是CSS重要的一部分,我們甚至不用去考慮它為什麼能夠這樣,但CSS繼承也是有限制的。

有一些屬性不能被繼承,如:border, margin, padding, background等。

樣式定義:

p {border:1px solid #000;}

範例程式碼:

< ;p>我是border我是不能被繼承滴

##預期效果:

分享CSS優先順序的詳細分析#實際效果:

分享CSS優先順序的詳細分析從上面的效果中,我們可以看出,border是不能被繼承的,還有一些其它的屬性也是如此,這裡就不一一列舉。

五、附加說明


文內的樣式優先權為1,0,0,0,所以永遠高於外部定義。這裡文內樣式指形如

blah

的樣式,而外部定義是指經由有!important聲明的規則高於一切。
如果!important宣告衝突,則比較優先權。
如果優先權一樣,則依照在原始碼中出現的順序決定,後來者居上。
由繼承而得到的樣式沒有specificity的計算,它低於一切其它規則(例如全域選擇符*定義的規則)。
關於經由@import載入的外部樣式,由於@import必須出現在所有其它規則定義之前(如不是,則瀏覽器應該忽略之),所以按照後來居上原則,一般優先權衝突時是佔下風的。
還需要說一下,IE是可以識別位置錯誤的@import的,但無論@import在什麼地方,它都認為是位於所有其它規則定義之前的,這可能會引發一些誤會。

優先權問題看起來簡單,但背後還是有非常複雜的機制,在實際應用上需要多多留意。

六、練習

看完上面的文字後,來做幾道非常簡單的題目。 (自己答完前,請不要先看各題給出的連結地址哦)

1. 如何讓使用兩個使用相同樣式名的元素具有不同的效果:

#運行程式碼框

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> 
<meta http-equiv="Content-Language" content="gb2312" /> 
<title>test</title> 
<meta name="Author" content="doyoe(飘零雾雨), edzmaster@gmail.com" /> 
<style type="text/css"> 
.test { 
width:200px; 
border:1px solid #000; 
font:12px/200% "宋体"; 
color:#f00; 
background:#ddd; 
} 
p.test { 
color:#fff; 
background:#070; 
} 
</style> 
</head> 
<body> 
<div class="test">测试测试测试</div> 
<p class="test">测试测试测试</p> 
</body> 
</html>

提示:您可以先修改部分程式碼再執行


固定效果:

分享CSS優先順序的詳細分析

固定代码:


2. 如何让

始终为黑色,而在不被

包含的情况为红色:

提示:您可以先修改部分代码再运行


传说中的测试


传说中的测试

 

固定效果:

分享CSS優先順序的詳細分析

固定代码:

讨论CSS优先级


讨论CSS优先级

3. 如何写一个外部样式使得

覆盖我


的颜色为红色:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> 
<meta http-equiv="Content-Language" content="gb2312" /> 
<title>test</title> 
<meta name="Author" content="doyoe(飘零雾雨), edzmaster@gmail.com" /> 
<style type="text/css"> 
h3 { 
color:#f00!important; 
} 
</style> 
</head> 
<body> 
<h3 style="color:#000;">覆盖我</h3> 
</body> 
</html>

提示:您可以先修改部分代码再运行

4. 如何让同时具有.a,.b样式的元素只表现.a的颜色样式:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> 
<meta http-equiv="Content-Language" content="gb2312" /> 
<title>test</title> 
<meta name="Author" content="doyoe(飘零雾雨), edzmaster@gmail.com" /> 
<style type="text/css"> 
.b { 
color:#000; 
} 
.a { 
color:#f00; 
} 
</style> 
</head> 
<body> 
<p class="a b">传说中滴测试</p> 
</body> 
</html>

提示:您可以先修改部分代码再运行

固定代码:

传说中滴测试

关于样式优先级,今天就先聊到这。

以上是分享CSS優先順序的詳細分析的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn