Sym - 一个用 Java 实现的现代化社区平台 • 源码 • 注册

Pipe - 小而美的开源博客平台 • 体验 • 皮肤
Solo - 一个用 Java 实现的博客系统,为你或你的团队创建个博客吧! • 源码下载 
Wide - 一个基于 Web 的 Go 语言 IDE • 教程试用

CSS 的 inhert 与 auto

见好就收 ^^

转自:http://www.cnblogs.com/rubylouvre/archive/2009/09/04/1559557.html

一 个很显浅的寓言,千年老树,电打雷劈,屹立不倒,却毁于蝼蚁的侵袭之下。自以为精通 CSS 的人,常常被一些小问题搞到头晕脑胀。通常是一个很小的数值,经 过层层放大歪曲后,整个布局就走形了。CSS 是一门很简单的语言,易学易用,但也最容易出垃圾代码。这是没有深入研究这门语言所致。本人认为,CSS 是由 以下三大块构成的:默认值,继承系统与加权系统。默认值,也就是浏览器在用户没有设置属性的情况下,默认指定的属性。CSS 框架基本都有一个叫 reset.css 的文件,就是对其进行重设,消除各浏览器的差异的。继承系统就是下面要重点讨论的东西。加权系统,也就是优先级的问题,不在本文的讨论范畴,不说了。另,这三个东西都面临着 IE Bug 的侵袭,危害甚大,自己另行了断吧(笑)。

在 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

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

运行代码

我们给父元素设置了字体的样式,没有设置子元素的,当取出子元素的时,发现其值转换为 rgb 格式(当然 IE 除外啦!)

不过,在 IE7 及其之前的版本,是不支持用 inhert 来设置 direction 与 visibility 以外的样式属性。具体可参见这里这里

在 IE8 中,原本是 inherited property 的 text-align 在 th 中失效。

01. < table >
02.    < tr >
03.      < th >Ruby</ th >
04.      < th >Rouvre</ th >
05.    </ tr >
06.    < tr >
07.      < td >By</ td >
08.      < td >司徒正美</ td >
09.    </ tr >
10. </ table >
01. table, tr, td, th {
02.    border-collapse : collapse ;
03.    border : 1px solid #000 ;
04. }
05. table {
06.    text-align : right ;
07. }
08. td, th {
09.    width : 100px ;
10. }

本来 th 应该会从 table 中继承文本向右对齐的设置,但失效了……

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

运行代码

解决 IE8 这个弱智 Bug 也很容易,就是显式地设置 inhert。

01. table, tr, td, th {
02.    border-collapse : collapse ;
03.    border : 1px solid #000 ;
04. }
05. table {
06.    text-align : right ;
07. }
08. td, th {
09.    width : 100px ;
10. }
11. th {
12.    text-align : inherit;
13. }

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

运行代码

此外还有一些 CSS 属性是不能继承的,最经典如 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

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

运行代码

我们给父元素设置了背景颜色,没有设置子元素的,这时会取得浏览器的默认值 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 了。在内联元素中,由于不具备盒子模型,如果不设置,就算是火狐也原本奉还它,这对于精确计算元素的宽度与高度是非常不利的。auto 还 有对称性,这个在居中布局我们常常运用到它。在非度量的属性中,如 overflow,就要具体情况具体分析了。

PS:此文为另一篇文章准备,敬请期待…………………………


欢迎注册黑客派社区,开启你的博客之旅。让学习和分享成为一种习惯!

留下你的脚步