詳細解答CSS中相同元素不同結構重複定義的問題

CSS選擇器是構建CSS的基礎.在爲大型,複雜嵌套的(x)HTML文檔進行樣式定義時,很有可能會遇上針對相同元素在不同結構下的重複定義的問題,這個問題也是前端開發人員相對頭痛的問題。

詳細解答CSS中相同元素不同結構重複定義的問題

在這種情況 發生的前提下,瀏覽器在渲染頁面文件時,會按照一定規則進行優先級排列,然後根據這個優先級權重對發生狀況的元素進行處理。

而這個瀏覽器遵循的規則是什麼呢?下面請看小編爲你細細解答。

讓我們來看一段簡單的HTML代碼:

<body =>

<div =>

<p =/p>

<em ="em" "wrap"></em>

</div>

</body>

這是段相當簡單的HTML代碼,但是具有相當的代表性.我們慢慢就能發現它爲什麼具有代表性了.

首先我們來加上一點簡單的CSS聲明:

{

;

}

{ /* 11 */

;

}

{ /* 12 */

;

}

{ /* 2 */

;

}

{ /* 102 */

;

}

{

;

}

{ /* 3 */

;

}

{ /* 13 */

;

}

大家來猜猜看結果中的"For Testing2"是什麼顏色的`呢?嗯...不浪費大家眼神了,結果是的,奇怪嗎?有疑問嗎?大家有沒有注意到我在CSS中加入的註釋中的數字?這是什麼呢?這是CSS選擇器特性權重值.

id選擇器,class類選擇器,HTML標籤選擇器,這3種選擇器就是構成CSS繼承的組件,瀏覽器在渲染它們的時候是有優先權的.而這個優先權在一定情況下是可以計算出來的.

1. 統計在這個選擇器裏面ID選擇器的數目爲a

2. 統計在這個選擇器裏面類的選擇器,屬性選擇器和僞類爲b

3. 統計在這個選擇器裏面的元素名稱數目爲c,其中要忽略僞元素.串聯三個數字爲a-b-c,得到特徵值.

串連這3個數字就可以得到特徵值.

* /* a=0 b=0 c=0 -> 特徵值 = 0 */

li /* a=0 b=0 c=1 -> 特徵值 = 1 */

ul li /* a=0 b=0 c=2 -> 特徵值 = 2 */

ul ol+li /* a=0 b=0 c=3 -> 特徵值 = 3 */

h1 + *[rel=up] /* a=0 b=1 c=1 -> 特徵值 = 11 */

ul ol /* a=0 b=1 c=3 -> 特徵值 = 13 */

l /* a=0 b=2 c=1 -> 特徵值 = 21 */

#x34y /* a=1 b=0 c=0 -> 特徵值 = 100 */

#s12:not(FOO) /* a=1 b=0 c=1 -> 特徵值 = 101 */

這樣就能明白上面代碼中的數字的含義了.

是不是就這麼簡單呢?

應該還有耐人尋味的地方.

比如說我給出這樣一組CSS來定義上面的HTML:

{

;

}

{ /* 11 */

;

}

{ /* 11 */

;

}

{

}

{ /* 111*/

red

}

{ /* 111 */

green

}

{

gray

}

這裏的前3條權重值都是11,後4條聲明的權重值都是111,那我們應該怎麼判斷呢?

首先,我們看這條聲明最終定義的是哪個元素.前3條都是定義這個元素的,不難從中總結出一條規律:在聲明中聲明瞭元素的HTML標籤的,權重又可以增加0.5,那麼根據上面的例子,權重值就會變成:

{

;

}

{ /* 11 */

;

}

{ /* 11.5 */

;

}

可以發現第1條和第3條的權重值還是一樣的,我們試着交換一下他們的位置,天哪,它們之間是可以相互覆蓋的.對,那就證明它們是真正的同層(level)聲明.

那同樣的後4條聲明也可以這樣分析了:

{

}

{ /* 111*/

red

}

{ /* 111 */

green

}

{

gray

}

在這裏的第1條和第4條權重值相同,第2條和第3條權重值相同.經交換實驗也能發現這個數值的正確性,之前的權重計算公式曾經出現在Eric的書中以及W3的CSS3規範草稿中。