CSS的inherit與auto

來源:互聯網
上載者:User

一個很顯淺的寓言,千年老樹,電打雷劈,屹立不倒,卻毀於螻蟻的侵襲之下。自以為精通CSS的人,常常被一些小問題搞到頭暈腦脹。通常是一個很小的數值,經過層層放大歪曲後,整個布局就走形了。CSS是一門很簡單的語言,易學易用,但也最容易出垃圾代碼。這是沒有深入研究這門語言所致。本人認為,CSS是由以下三大塊構成的:預設值,繼承系統與加權系統。預設值,也就是瀏覽器在使用者沒有設定屬性的情況下,預設指定的屬性。CSS架構基本都有一個叫reset.css 的檔案,就是對其進行重設,消除各瀏覽器的差異的。繼承系統就是下面要重點討論的東西。加權系統,也就是優先順序的問題,不在本文的討論範疇,不說了。

在CSS中,許多屬性都是可以繼承的,如某個段落的字型設定為白色,其元素的字型不用設定或設定為inhert,它就是白色。這些屬性被稱之為inherited property,它會從父元素擷取對應屬性的經過計算與轉換的值(computed value),如果父元素和它的情形一樣,它就繼續往上找,最後沒有就使用瀏覽器的預設值。

下面是 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

http://reference.sitepoint.com/css/inheritvalue

<br /><!doctype html><br /><html dir="ltr" lang="zh-CN"><br /> <head><br /> <meta charset="utf-8"/><br /> <meta http-equiv="X-UA-Compatible" content="IE=8"><br /> <style type="text/css"><br /> </style><br /> <script type="text/javascript"><br /> function getStyle(el, style){<br /> if(!+"\v1"){<br /> style = style.replace(/\-(\w)/g, function(all, letter){<br /> return letter.toUpperCase();<br /> });<br /> return el.currentStyle[style];<br /> }else{<br /> return document.defaultView.getComputedStyle(el, null).getPropertyValue(style)<br /> }<br /> }<br /> var _ = function(id){<br /> return document.getElementById(id);<br /> };<br /> window.onload = function(){<br /> alert(getStyle(_("text2"),"color"))<br /> }<br /> </script></p><p> <title>CSS</title><br /> </head><br /> <body><br /> <div id ="text" style="width:20em;height:140px;background:#8080c0;padding:2px;border:1px solid red;color:#fff">父元素<br /> <div id="text2" style="width:80%;height:4em;background:#b45b3e">子項目</div><br /> </div><br /> </body><br /></html><br />

運行代碼

我們給父元素設定了字型的樣式,沒有設定子項目的,當取出子項目的時,發現其值轉換為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中繼承文本向靠右對齊的設定,但失效了……

<br /><!doctype html><br /><html dir="ltr" lang="zh-CN"><br /> <head><br /> <meta charset="utf-8"/><br /> <meta http-equiv="X-UA-Compatible" content="IE=8"><br /> <style type="text/css"><br /> table, tr, td, th {<br /> border-collapse: collapse;<br /> border: 1px solid #000;<br /> }<br /> table {<br /> text-align: right;<br /> }<br /> td, th {<br /> width: 100px;<br /> }<br /> </style><br /> <title>CSS</title><br /> </head><br /> <body><br /> <table><br /> <tr><br /> <th>Ruby</th><br /> <th>Rouvre</th><br /> </tr><br /> <tr><br /> <td>By</td><br /> <td>司徒正美</td><br /> </tr><br /> </table><br /> </body><br /></html><br />

運行代碼

解決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;  }

<br /><!doctype html><br /><html dir="ltr" lang="zh-CN"><br /> <head><br /> <meta charset="utf-8"/><br /> <meta http-equiv="X-UA-Compatible" content="IE=8"><br /> <style type="text/css"><br /> table, tr, td, th {<br /> border-collapse: collapse;<br /> border: 1px solid #000;<br /> }<br /> table {<br /> text-align: right;<br /> }<br /> td, th {<br /> width: 100px;<br /> }<br /> th {<br /> text-align: inherit;<br /> }<br /> </style><br /> <title>CSS</title><br /> </head><br /> <body><br /> <table><br /> <tr><br /> <th>Ruby</th><br /> <th>Rouvre</th><br /> </tr><br /> <tr><br /> <td>By</td><br /> <td>司徒正美</td><br /> </tr><br /> </table><br /> </body><br /></html><br />

運行代碼

此外還有一些CSS屬性是不能繼承的,最經典如border系列。它被稱之為non-inherited property,如果我們不為它設定,我們只能取得瀏覽器的預設值,預設值在Firefox中被稱之為 initial value 。一個相關的好訊息是,預設值在Firefox也可以指定了,這樣我們就不用reset樣式了!

下面是non-inherited property的一覽表:

  • background
  • border
  • bottom
  • clear
  • display
  • float
  • height
  • left
  • margin
  • outline
  • overflow
  • padding
  • position
  • right
  • top
  • visibility
  • width
  • z-index

<br /><!doctype html><br /><html dir="ltr" lang="zh-CN"><br /> <head><br /> <meta charset="utf-8"/><br /> <meta http-equiv="X-UA-Compatible" content="IE=8"><br /> <style type="text/css"><br /> </style><br /> <script type="text/javascript"><br /> function getStyle(el, style){<br /> if(!+"\v1"){<br /> style = style.replace(/\-(\w)/g, function(all, letter){<br /> return letter.toUpperCase();<br /> });<br /> return el.currentStyle[style];<br /> }else{<br /> return document.defaultView.getComputedStyle(el, null).getPropertyValue(style)<br /> }<br /> }<br /> var _ = function(id){<br /> return document.getElementById(id);<br /> };<br /> window.onload = function(){<br /> alert(getStyle(_("text2"),"background-color"))<br /> }<br /> </script></p><p> <title>CSS</title><br /> </head><br /> <body><br /> <div id ="text" style="width:20em;height:140px;background:#8080c0;padding:2px;border:1px solid red;color:#fff">父元素<br /> <div id="text2" style="width:80%;height:4em;color:#b45b3e">子項目</div><br /> </div><br /> </body><br /></html><br />

運行代碼

我們給父元素設定了背景顏色,沒有設定子項目的,這時會取得瀏覽器的預設值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了。在內嵌元素中,由於不具備盒子模型,如果不設定,就算是Firefox也原本奉還它,這對於精確計算元素的寬度與高度是非常不利的。auto還有對稱性,這個在置中布局我們常常運用到它。在非度量的屬性中,如overflow,就要具體情況具體分析了。

PS:此文為另一篇文章準備,敬請期待…………………………

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.