|
|
|
|
|
定義了某個標(biāo)簽用的CSS類,結(jié)果發(fā)現(xiàn)不起作用,原因其實(shí)很明顯,就是另外還有與之相關(guān)聯(lián)的CSS定義,如果頁面用到的CSS比較多且凌亂,那么檢查起來就比較困難。CSS類不起作用的原因,其實(shí)就是繼承與優(yōu)先的問題。今天我將通過幾個實(shí)例來分析這個問題。
實(shí)例
下面是一個完整的HTML實(shí)例。
HTML結(jié)構(gòu)
<div class="wrap">
<div class="content">
<a href="http://howtostagehomes.com/">content - 卡卡網(wǎng) howtostagehomes.com</a>
</div>
<div class="footer">
<a href="http://howtostagehomes.com/">footer - 卡卡網(wǎng) howtostagehomes.com</a>
</div>
</div>
CSS
div.wrap a{color: blue;}
div.content a{color: red;}
.footer a{color: red;}
由于外層div
的類.wrap
已經(jīng)定義了鏈接的顏色為blue
。而我想在內(nèi)層.footer
的div
把鏈接顏色設(shè)置為red。但代碼執(zhí)行結(jié)果不在預(yù)期,顯示如下:
我們看到,內(nèi)層定義的類.footer
不起作用了。但同時又看到,另一個內(nèi)層.content
的div
,其CSS的定義是有效的。為什么會出現(xiàn)這個情況呢?寫法的差異!
CSS類不起作用的原因:繼承與優(yōu)先
實(shí)例中,.footer
類名前,沒有加上標(biāo)簽div
,而.content
類名前,加上了div
標(biāo)簽。就是這個原因?qū)е铝藢?shí)例中的顯示結(jié)果。
如果想.footer
類的div
,按預(yù)期的想法來顯示,那么就要把類名改一下寫法,把.footer
改為div.footer
,我們看看改后的顯示結(jié)果。
CSS定義優(yōu)先比較:id、標(biāo)簽與類名
CSS定義可以用標(biāo)簽,例如p
、div
,span
等,也可以用類名,例如.wrap
、.content
,.footer
等,還經(jīng)常用到id來作為選擇器,例如#header
,#nav
等。在實(shí)際使用中,經(jīng)常出現(xiàn)多個CSS定義重疊作用的問題。這種情況下,瀏覽器渲染時就會按照CSS繼承與優(yōu)先的規(guī)則來執(zhí)行。
我們看看下面一個實(shí)例。
<style type="text/css">
div a{color: blue;}
.footer a{color: red;}
</style>
<div class="footer">
<a href="http://howtostagehomes.com/">footer - 卡卡網(wǎng) howtostagehomes.com</a>
</div>
已經(jīng)有了div
的CSS定義,在HTML里,某個div
比較特殊,又自己加了個類定義.footer
。結(jié)果顯示如下:
我們看到,這個類.footer
的CSS定義是起作用的。
我們再看看下面的實(shí)例。
<style type="text/css">
#wrap a{color: blue;}
.footer a{color: red;}
</style>
<div id="wrap">
<div class="footer">
<a href="http://howtostagehomes.com/">footer - 卡卡網(wǎng) howtostagehomes.com</a>
</div>
</div>
先有了#wrap
的定義,再有.footer
的定義。結(jié)果顯示這樣。
可以看到,針對id的CSS定義#wrap
,是優(yōu)先于使用類名的CSS定義.footer
的。
總結(jié)
通過本文幾個實(shí)例的分析,對CSS定義的繼承與優(yōu)先應(yīng)該有了一定的了解,就是越具體越優(yōu)先,并且遵循如下規(guī)則:id選擇器 > 類選擇器 > 標(biāo)簽選擇器。