iT邦幫忙

26

css的串接(Cascade)規則與明確度(Specificity)

  • 分享至 

  • xImage
  •  

使用CSS來定義Web樣式時,難免會有不同的樣式去定義到同一個元素的情況,這時究竟採用哪一種樣式,會由串接(cascade)規則與明確度(specificity)來決定。

串接規則:

不同的樣式表來源,由串接的重要性決定。

標示 !important的使用者樣式 > 標示 !important的設計者樣式 > 設計者樣式 > 使用者樣式 > 瀏覽器預設樣式

明確度:

設計者自己定義css時,彼此間元素鎖定衝突的情況,則由明確度決定。如果明確度相同,則後定義的會覆蓋之前定義的。

明確度的是由 0,0,0,0這樣的格式來計算的。數字越左邊代表越大。

以下是選擇器(selector)與明確度的值

(1)行內定義的css => 1,0,0,0
(2)id => 0,1,0,0
(3)class => 0,0,1,0
(4)html元素和虛擬元素 => 0,0,0,1

而明確度是可以串接和累加的,例如:

h1.foo {color:blue}

就是由h1(第4種)的0,0,0,1,加上 .foo(第3種)的 0,0,1,0,所以它的明確度就變成 0,0,1,1

再一個例子

h1#bar{color:green}

它的明確度就會變成 h1 -> 0,0,0,1而#bar是 0,1,0,0,明確度就成為 0,1,0,1

另外,有時我們會使用後代選擇器(descendat selector)的方式來定義css,例如:

div p {}

這是div與p同樣都是html的元素(第4種),所以它的明確度就是會 0,0,0,2

了解這樣的規則之後,我們可以來看看實際衝突的例子。

div span {color:blue} /* 0,0,0,2 */
div p span {color:red} /* 0,0,0,3 */

在上面例子中,div的span原本是字型顏色是藍色,但是如果span是被包在p當中,由於它的明確度更高,因此顏色就會是紅色。

另外,如果在同一個元素中定義不同的選擇器,像下面的例子

<h1 id="bar" class="foo">css</h1>

由於id的明確度比class高,所以最後會套用id的樣式,也就是color:green,而非color:blue。

有些時候在定義css時,明明已經改過css設定值,但是就是無法變更,這時就有可能是其他更高明確度的設定值導致的。

建議可以用firefox的firebug來協助css設定,如果有css的值被其他明確度更高的值取代的話,它就會將被覆蓋的值畫刪除線,這時就可以知道有問題,而可以去找到真正在作用的值。


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
0
5min
iT邦好手 3 級 ‧ 2008-04-09 09:50:01

好分享,推

0
plutosrita
iT邦研究生 1 級 ‧ 2008-04-09 11:05:04

看來挺不錯,謝謝喔

0
xsenie628
iT邦新手 1 級 ‧ 2008-04-10 02:47:57

謝謝你提供實用的訊息

0
john651216
iT邦研究生 1 級 ‧ 2008-04-10 17:01:38

好分享

0
davistai
iT邦大師 1 級 ‧ 2008-04-12 16:12:27

可參考~~

0
fanylu60
iT邦研究生 1 級 ‧ 2008-04-14 16:29:53

謝謝分享

0
yce701116
iT邦研究生 1 級 ‧ 2008-04-14 16:35:46

謝謝分享

0
tgunlu
iT邦研究生 1 級 ‧ 2008-04-20 14:24:39

謝謝分享

0
海綿寶寶
iT邦大神 1 級 ‧ 2008-05-01 18:08:03

高等用法,第一次看到

0
loripan
iT邦研究生 1 級 ‧ 2008-05-08 01:18:46

感謝提供分享

0
jennymsn
iT邦好手 10 級 ‧ 2008-05-08 23:09:48

謝謝分享

0
funkent
iT邦高手 1 級 ‧ 2008-05-13 23:37:10

不太了解這樣的串接好處是什麼

0
tyc1220
iT邦研究生 1 級 ‧ 2008-05-24 23:36:16

感謝分享此資訊

我要留言

立即登入留言