CSS 中 a 標籤為什麼不能繼承父類的顏色?

嗯,我知道在這麼好的環境下,問這麼Low的問題太der,但是不弄明白心裡痒痒,只能出此下策。

問題是這樣的:

HTML:

&
&文字&
&鏈接&
&

CSS:

div{
color:red;
}

問題出現了,為什麼span標籤繼承了父類的顏色,鏈接就不能。

就是想知道為什麼唯獨鏈接不能,我直到直接設置a的顏色就行。


1、結論:由於CSS的層疊(cascading),a元素繼承自div的樣式(color:red)被瀏覽器的a元素的默認樣式給覆蓋了。

2、理由:

看圖:

圖一:

圖二:

由以上兩個圖可以知道:

1、瀏覽器本身對a元素有默認樣式(user agent stylesheet)(圖二),對span元素沒有默認樣式(圖一)

2、由於CSS的層疊,a元素red顏色繼承自div(Inherited from div)被劃掉了(圖二)。

由此可以得到我上面書寫的結論。

3、涉及到的知識點:

4、參考資料:

Cascade - CSS

《CSS權威指南》第三章


瀉藥

上頭都答的差不多了啦。

如 @李力 所說

其實就是 A 的瀏覽器默認樣式里有帶有偽類。

其特異性值是 [0,0,1,1] (按CSS2的……3(廣義的3……)又有不同)

(用戶)直接設置 div 的是 [0,0,0,1] (其子A再繼承),(導致A特異性值)比上面(瀏覽器默認樣式直接設置)低,無法覆蓋。


因為瀏覽器默認給 a 設置了顏色,而 span 沒有。

火狐開發者工具,在設置面板選中「查看器」下的「顯示瀏覽器樣式」,然後查看元素看看。


Useragent Stylesheet

webkit: html.css in trunk/Source/WebCore/css

IE: Internet Explorer UA Style Sheets

Firefox: http://mxr.mozilla.org/mozilla-central/source/layout/style/html.css


瀏覽器本身對 a 標籤有默認樣式,是直接對 a 標籤指定的

例如在我這 Google Chrome 瀏覽器里:

所以你沒寫任何樣式,但是看到 a 標籤應該是帶下劃線的,還可能是藍的,鏈接訪問過後可能是紅的 ( :visited ) 。

從父級 div 繼承下來的優先順序沒有選擇器高,覆蓋不到。


原因就是樓上幾位說的,不過為這點問題再給a單獨設置顏色明顯不科學。

可以讓a的顏色默認繼承父級,這樣

a {

color: inherit;

}


一句話你就明了:繼承的特殊性是無,連0都不是。所以被用戶代理覆蓋了。


此問題在 stackoverflow 上有討論:css - when will "a" tag not inherit color attribute of parent tag?


推薦閱讀:

css偽元素:after和 :before 存在的意義?
除了聖杯布局和雙飛翼布局還有其他哪些比較有特點的布局方法?
CSS 屬性 display 取值 box 和 flexbox 以及 flex 有什麼不同,分別表示什麼?

TAG:前端開發 | HTML | CSS | CSS3 | DivCSS |