国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > CSS > 正文

CSS:相同元素不同結構重復定義的問題

2024-07-11 08:21:04
字體:
來源:轉載
供稿:網友

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

在這種情況 (針對相同元素在不同結構下的重復定義) 發生的前提下,瀏覽器在渲染頁面文件時,會按照一定規則進行優先級排列,然后根據這個優先級權重對發生狀況的元素進行處理.

而這個瀏覽器遵循的規則是什么呢?

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

<body id="content">
        <div class="box">
                <p class="italic">for testing 2</p>
                <em id="em" class="wrap">for testing 3</em>
        </div>
</body>

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

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

p{ /* 1 */
        color:pink;
}
p.italic{ /* 11 */
        color:red;
}
div.box p{ /* 12 */
        color:black;
}
div p{ /* 2 */
        color:blue;
}
#content div p{ /* 102 */
        color:orange;
}
div p.italic{ /* 12 */
        color:green;
}
body div p{ /* 3 */
       color:olive;
}
body div p.italic/* 13 */
        color:gray;
}

大家來猜猜看結果中的"for testing2"是什么顏色的呢?嗯...不浪費大家眼神了,結果是orange的,奇怪嗎?有疑問嗎?大家有沒有注意到我在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 li.red              /* a=0 b=1 c=3 -> 特征值 =  13 */
li.red.level             /* 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:

p.italic { /* 11 */
        color: black;
}

div .italic { /* 11 */
        color: red;
}

.box p{ /* 11 */
 color:green;
}

.box em#em{ /* 111*/
        color:blue
}

body#content .wrap{ /* 111*/
        color:red
}

body .box #em{ /* 111 */
       color:green
}

#content .box em /* 111 */
       color:gray
}

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

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

p.italic { /* 11.5 */
        color: black;
}

div .italic { /* 11 */
        color: red;
}

.box p{ /* 11.5 */
       color:green;
}

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

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

.box em#em{ /* 111.5*/
        color:blue
}

body#content .wrap{ /* 111*/
        color:red
}

body .box #em{ /* 111 */
        color:green
}

#content .box em /* 111.5 */
        color:gray
}

在這里的第1條和第4條權重值相同,第2條和第3條權重值相同.經交換實驗也能發現這個數值的正確性.之前的權重計算公式曾經出現在eric的書中以及w3的css3規范草稿中[http://www.w3.org/tr/css3-selectors/#specificity].這個半點權重法可以說是我創造的呦~啊哈哈哈.

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 晋城| 永嘉县| 台江县| 汾阳市| 崇明县| 临泉县| 巴青县| 西丰县| 南投县| 边坝县| 淳安县| 长宁县| 城市| 太仆寺旗| 清丰县| 防城港市| 东乡族自治县| 东乌珠穆沁旗| 太康县| 汪清县| 尼勒克县| 林口县| 长顺县| 芜湖县| 都兰县| 临泉县| 临沂市| 墨脱县| 云林县| 五台县| 南通市| 临澧县| 临夏市| 托克逊县| 镇巴县| 临江市| 澄城县| 辽阳市| 蒙城县| 平度市| 壤塘县|