zoukankan      html  css  js  c++  java
  • 行内元素与块级元素

    【转摘于前沿视频教室:http://learning.artech.cn/20081026.inline-and-blcok-level.html】

    这个问题不少读者问起,以前都是比较简单的答复了一下。由于问的人比较多,今天专门来谈一谈这个问题。

    问题起因:

    我们在书中举过非常简单的使用a元素制作网页菜单的例子,本质上就是给a元素设置高度、宽度,以及边框等属性。例如下面的代码:

     1 <html>
     2   <head>
     3   <style>
     4   a{
     5     width:200px;
     6     line-height:40px;
     7     border:1px solid red;
     8     background-color:#CCC;
     9     text-decoration:none;
    10     text-align:center;
    11   }
    12   </style>
    13   </head>
    14 <body>
    15   <a href="#">链接文字</a>
    16 </body>
    17 </html>

    显然,我们希望将上面的超级链接设置为200像素宽,40像素高,红色边框,灰色背景,取消下划线。

    那么在浏览器中到底是什么效果呢?下面左图是在IE 6 中的效果,右图是在Firefox中的效果。


    blcok-inline.gif

    可以看到,在IE 6 中的效果,正是我们希望的效果,而在Firefox中,效果并不是我们希望的,宽度宽度都不正确。这是什么原因呢?

    释疑

    这里的原因在于,根据CSS规范的规定,每一个网页元素都有一个display属性,用于确定该元素的类型,每一个元素都有默认的display属性值,比如div元素,它的默认display属性值为“block”,成为“块级”元素(block-level);而span元素的默认display属性值为“inline”,称为“行内”元素。

    div这样的块级元素,就会自动占据一定矩形空间,可以通过设置高度、宽度、内外边距等属性,来调整的这个矩形的样子;与之相反,像“span”这样的行内元素,则没有自己的独立空间,它是依附于其他块级元素存在的,因此,对行内元素设置高度、宽度、内外边距等属性,都是无效的。

    那么链接 a 元素,在默认情况下是什么元素呢?答案是“行内元素”,因此像上面代码中那样,对a元素设置高度、宽度等属性,是无效的,这也就说明了在Firefox中,显示成图中的样子的原因了。

    那么在IE6中,为什么等到了我们希望的效果呢?答案是IE在默认情况下,并没有遵守CSS的规范,它对a元素也同样设置了高度、宽度等属性。因此这里应该说Firefox是符合规定的,而IE在默认下,并不是规范的解释方法。

    这里需要说明的是,如果我们给网页加上 DOCTYPE 指令,对HTML文档的类型加以限定,那么在IE中也会对他按照标准的CSS规范来解释这个代码。

    例如,将上面代码中的第一行,改为:

    1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
    2                 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    3 <html xmlns="http://www.w3.org/1999/xhtml" >

    这时在IE中看到的效果,就会与Firefox中相同了,说明当使用了DOCTYPE指令之后,IE会按照标准的方式解释上面的代码,从而得到与Firefox中相同的效果。

    那么如果希望在标准的方式下,在Friefox和IE浏览器中,都能使a元素获得我们希望的效果,该怎么办呢?

    解决方法

    方法很简单,只需要使用display属性,强制把a元素由inline元素改为block-level即可,方法是,在a元素的CSS样式中增加一条:

    display:block;

    这时在IE、Firefox中就都可以得到我们想要的效果了,可以随意设置高度宽度等各种几何属性了。

    总结与提高

    通过display属性,可以方便地改变一种元素的类型,因此如果读者理解这一点,就会知道实际上div元素和span元素,只需要通过display属性,就可以相互转换了。

    因此,无论一个网页时有什么样的HTML标记来构成的,比如div、ul、li、p等等,他们本质上都是一些盒子而已,在浏览器的眼中,一个网页就是一大堆盒子,你的任务就是把这些盒子按照你的要求放在合适的位置。至于这个盒子是ul、li、p还是div,都无所谓的。

    比如p标记,完全可以理解为有了一些预设属性值的div。比如,你把网页上的p标记,换成div,然后对这个div设置一些CSS属性,就可以和p完全一样了。这就好像,小学我们学习加法和减法,后来才知道,加法和减法本质是一样的,1-1 就等于 1 + (-1) ,同样,乘法和除法也是一样的。

    真正把原理理解透彻了之后,在设计的时候,才可能做到天马行空一样的自由。

    =======华丽的分割线========================

    2008年10月29日补充:

    鹤庭逸 和 anyliv 两位对这篇文章的总结和提高部分,提出了一些意见,我觉得很有益处。

    在这篇文章中,我们谈的实际上是“浏览器眼中”网页,而不是“访问者眼中”的网页。这个区别就好像,一个“排字工人眼中”的小说,和“读者眼中”的小说,是完全不同的,前者只管格式,根本不管内容,而后者关注的是小说的内容。

    同样,对于网页来说,作为设计师,在定义网页结构和内容的时候,关注的是网页的结构和内容,在排版的时候,关注的浏览器如何显示这个页面。

    我们说,p标记和div标记,实际上都是盒子,是强调了问题的一个方面。而从另一个方面——结构和内容的方面来说,当然是完全不同的,不应该、也没有必要代替的。

    希望以上补充可以使这篇文章更全面一些。

  • 相关阅读:
    C#面向对象五(继承、抽象类和抽象方法、多态、虚方法、is、as、new覆盖关键字)
    C#面向对象四(文件与目录操作、序列化与反序列化、XML)
    C#面向对象三(常用控件)
    C#面向对象二(集合泛型及排序)
    C#面向对象一(方法、封装、类、两种数据类型)
    如何最快找到重点 —— 小小码虫瞎想の效率与绩效篇(一)
    Android Telephony —— 手机信号实时变化源码分析过程记录
    Android 某些配置记录
    Macbook Pro 使用小记
    fhq treap 范浩强平衡树
  • 原文地址:https://www.cnblogs.com/slowsoul/p/css.html
Copyright © 2011-2022 走看看