CSS的inherit與auto使用分析
更新時間:2010年01月02日 12:50:03 作者:
一個很顯淺的寓言,千年老樹,電打雷劈,屹立不倒,卻毀于螻蟻的侵襲之下。自以為精通CSS的人,常常被一些小問題搞到頭暈腦脹。
通常是一個很小的數(shù)值,經(jīng)過層層放大歪曲后,整個布局就走形了。CSS是一門很簡單的語言,易學易用,但也最容易出垃圾代碼。這是沒有深入研究這門語言所致。本人認為,CSS是由以下三大塊構成的:默認值,繼承系統(tǒng)與加權系統(tǒng)。默認值,也就是瀏覽器在用戶沒有設置屬性的情況下,默認指定的屬性。CSS框架基本都有一個叫reset.css 的文件,就是對其進行重設,消除各瀏覽器的差異的。繼承系統(tǒng)就是下面要重點討論的東西。加權系統(tǒng),也就是優(yōu)先級的問題,不在本文的討論范疇,不說了。另,這三個東西都面臨著IE Bug的侵襲,危害甚大,自己另行了斷吧(笑)。
在CSS中,許多屬性都是可以繼承的,如某個段落的字體設置為白色,其元素的字體不用設置或設置為inhert,它就是白色。這些屬性被稱之為inherited property,它會從父元素獲取對應屬性的經(jīng)過計算與轉換的值(computed value),如果父元素和它的情形一樣,它就繼續(xù)往上找,最后沒有就使用瀏覽器的默認值。
下面是 inherited properties的一覽表:
border-collapse
border-spacing
caption-side
color
cursor
direction
empty-cells
font
font-family
font-stretch
font-size
font-size-adjust
font-style
font-variant
font-weight
letter-spacing
line-height
list-style
opacity
list-style-image
list-style-type
quotes
text-align
text-indent
text-transform
white-space
word-spacing
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁面才能執(zhí)行]
我們給父元素設置了字體的樣式,沒有設置子元素的,當取出子元素的時,發(fā)現(xiàn)其值轉換為rgb格式(當然IE除外啦!)
不過,在IE7及其之前的版本,是不支持用inhert來設置direction與visibility以外的樣式屬性。具體可參見這里與這里
在IE8中,原本是inherited property的text-align在th中失效。
<table>
<tr>
<th>Ruby</th>
<th>Rouvre</th>
</tr>
<tr>
<td>By</td>
<td>司徒正美</td>
</tr>
</table>
table, tr, td, th {
border-collapse: collapse;
border: 1px solid #000;
}
table {
text-align: right;
}
td, th {
width: 100px;
}
本來th應該會從table中繼承文本向右對齊的設置,但失效了……
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁面才能執(zhí)行]
解決IE8這個弱智Bug也很容易,就是顯式地設置inhert。
table, tr, td, th {
border-collapse: collapse;
border: 1px solid #000;
}
table {
text-align: right;
}
td, th {
width: 100px;
}
th {
text-align: inherit;
}
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁面才能執(zhí)行]
此外還有一些CSS屬性是不能繼承的,最經(jīng)典如border系列。它被稱之為non-inherited property,如果我們不為它設置,我們只能取得瀏覽器的默認值,默認值在火狐中被稱之為 initial value 。一個相關的好消息是,默認值在火狐也可以指定了,這樣我們就不用reset樣式了!
下面是non-inherited property的一覽表:
background
border
bottom
clear
display
float
height
left
margin
outline
overflow
padding
position
right
top
visibility
width
z-index
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁面才能執(zhí)行]
我們給父元素設置了背景顏色,沒有設置子元素的,這時會取得瀏覽器的默認值transparent(W3C那一方好像只要是顏色都會轉換為rgb格式,多出的a為Alpha)
http://monc.se/kitchen/38/cascading-order-and-inheritance-in-css http://elizabethcastro.com/html/extras/cssref.html
接著我們來看auto,這是一個含糊不清但是有長度概念的值。應用于以下屬性:
overflow
cursor
height
width
marker-offset
margin
margin-* (left|bottom|top|right|start|end)
top
bottom
left
right
table-layout
z-index
-moz-column-width
languages
在塊級元素的可度量的屬性中(如width,height),如果不設置值,其默認值是auto,但它很容易會被父級元素的值覆蓋,也就是隱式地成為了inhert了。在內聯(lián)元素中,由于不具備盒子模型,如果不設置,就算是火狐也原本奉還它,這對于精確計算元素的寬度與高度是非常不利的。auto還有對稱性,這個在居中布局我們常常運用到它。在非度量的屬性中,如overflow,就要具體情況具體分析了。
PS:此文為http://chabaoo.cn/article/21718.htm做準備。
在CSS中,許多屬性都是可以繼承的,如某個段落的字體設置為白色,其元素的字體不用設置或設置為inhert,它就是白色。這些屬性被稱之為inherited property,它會從父元素獲取對應屬性的經(jīng)過計算與轉換的值(computed value),如果父元素和它的情形一樣,它就繼續(xù)往上找,最后沒有就使用瀏覽器的默認值。
下面是 inherited properties的一覽表:
復制代碼 代碼如下:
border-collapse
border-spacing
caption-side
color
cursor
direction
empty-cells
font
font-family
font-stretch
font-size
font-size-adjust
font-style
font-variant
font-weight
letter-spacing
line-height
list-style
opacity
list-style-image
list-style-type
quotes
text-align
text-indent
text-transform
white-space
word-spacing
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁面才能執(zhí)行]
我們給父元素設置了字體的樣式,沒有設置子元素的,當取出子元素的時,發(fā)現(xiàn)其值轉換為rgb格式(當然IE除外啦!)
不過,在IE7及其之前的版本,是不支持用inhert來設置direction與visibility以外的樣式屬性。具體可參見這里與這里
在IE8中,原本是inherited property的text-align在th中失效。
<table>
<tr>
<th>Ruby</th>
<th>Rouvre</th>
</tr>
<tr>
<td>By</td>
<td>司徒正美</td>
</tr>
</table>
table, tr, td, th {
border-collapse: collapse;
border: 1px solid #000;
}
table {
text-align: right;
}
td, th {
width: 100px;
}
本來th應該會從table中繼承文本向右對齊的設置,但失效了……
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁面才能執(zhí)行]
解決IE8這個弱智Bug也很容易,就是顯式地設置inhert。
table, tr, td, th {
border-collapse: collapse;
border: 1px solid #000;
}
table {
text-align: right;
}
td, th {
width: 100px;
}
th {
text-align: inherit;
}
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁面才能執(zhí)行]
此外還有一些CSS屬性是不能繼承的,最經(jīng)典如border系列。它被稱之為non-inherited property,如果我們不為它設置,我們只能取得瀏覽器的默認值,默認值在火狐中被稱之為 initial value 。一個相關的好消息是,默認值在火狐也可以指定了,這樣我們就不用reset樣式了!
下面是non-inherited property的一覽表:
background
border
bottom
clear
display
float
height
left
margin
outline
overflow
padding
position
right
top
visibility
width
z-index
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁面才能執(zhí)行]
我們給父元素設置了背景顏色,沒有設置子元素的,這時會取得瀏覽器的默認值transparent(W3C那一方好像只要是顏色都會轉換為rgb格式,多出的a為Alpha)
http://monc.se/kitchen/38/cascading-order-and-inheritance-in-css http://elizabethcastro.com/html/extras/cssref.html
接著我們來看auto,這是一個含糊不清但是有長度概念的值。應用于以下屬性:
overflow
cursor
height
width
marker-offset
margin
margin-* (left|bottom|top|right|start|end)
top
bottom
left
right
table-layout
z-index
-moz-column-width
languages
在塊級元素的可度量的屬性中(如width,height),如果不設置值,其默認值是auto,但它很容易會被父級元素的值覆蓋,也就是隱式地成為了inhert了。在內聯(lián)元素中,由于不具備盒子模型,如果不設置,就算是火狐也原本奉還它,這對于精確計算元素的寬度與高度是非常不利的。auto還有對稱性,這個在居中布局我們常常運用到它。在非度量的屬性中,如overflow,就要具體情況具體分析了。
PS:此文為http://chabaoo.cn/article/21718.htm做準備。
相關文章
用css alpha 濾鏡 實現(xiàn)input file 樣式美化代碼
用css alpha 濾鏡 實現(xiàn)input file 樣式美化代碼...2007-12-12position:relative/absolute無法沖破的等級
position:relative/absolute無法沖破的等級...2007-03-03