你问我答(31)——行内元素与块级元素
这个问题不少读者问起,以前都是比较简单的答复了一下。由于问的人比较多,今天专门来谈一谈这个问题。
问题起因:
我们在书中举过非常简单的使用a元素制作网页菜单的例子,本质上就是给a元素设置高度、宽度,以及边框等属性。例如下面的代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | <html>
<head>
<style>
a{
width:200px;
line-height:40px;
border:1px solid red;
background-color:#CCC;
text-decoration:none;
text-align:center;
}
</style>
</head>
<body>
<a href="#">链接文字</a>
</body>
</html> |
显然,我们希望将上面的超级链接设置为200像素宽,40像素高,红色边框,灰色背景,取消下划线。
那么在浏览器中到底是什么效果呢?下面左图是在IE 6 中的效果,右图是在Firefox中的效果。

可以看到,在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 2 3 | <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" > |
这时在IE中看到的效果,就会与Firefox中相同了,说明当使用了DOCTYPE指令之后,IE会按照标准的方式解释上面的代码,从而得到与Firefox中相同的效果。
那么如果希望在标准的方式下,在Friefox和IE浏览器中,都能使a元素获得我们希望的效果,该怎么办呢?
解决方法
方法很简单,只需要使用display属性,强制把a元素由inline元素改为block-level即可,方法是,在a元素的CSS样式中增加一条:
1 | 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标记,实际上都是盒子,是强调了问题的一个方面。而从另一个方面——结构和内容的方面来说,当然是完全不同的,不应该、也没有必要代替的。
希望以上补充可以使这篇文章更全面一些。
再次感谢 鹤庭逸 和 anyliv !
6,566


不错~~转发了。。
文章如果能附带 html的哪些标记是 行内元素还是块元素 就更好了
老师好: 我买过您的一本DIV+CSS的书籍.里面的你的视频.其中您讲到内容标记和结构标记 而且指出table是结构标记. 在我的印象中.table是存储数据的.那么应该是内容标记. 不知理解是否正确. 请问老师内容标记和结构标记划分的标准是什么.或者能否总结一下那些标签是内容标记 那些是结构标记. 在网上我搜索了这两个概念基本没有答案. 麻烦老师了
怎么没有人回答哦…继续关注中
看完这篇文章,很有收获。谢谢分享!
我想要《通CSS+DIV》本书的素材在哪找啊
现在有素材了,谢谢了嘿嘿
小狼,
抱歉,这本书的素材在随书光盘中,又合出版社合同,目前不能提供。
如果您觉得这本书的内容是和您学习,不妨买一本,支持一下很多为这本书付出努力的人:)
谢谢您喜欢我们的书!
温老师能总结那些是行内元素,那些是块级元素,最好是列个表,这样我们好查阅使用啊
wu,
其实你需要知道的行内元素就是 span 和 a ,其他的行内元素,比如 strong、b、font 这些都是以前在HTML中用来设定文字样式的标记,而使用CSS以后,这些标记应该都不用了,所以知道它们没有什么用,弄不好反而让初学者混淆了一些概念。
此言差异!把语义置于何地!
在现在学这些的人太多了,
小王,
学的人多好啊,说明是主流技术,多少都应该了解一些的。
其结构和内容方面最直接的影响就是 搜索引擎 ,当然其次也有其他一些影响,例如,对于关闭 CSS 功能的一些掌上阅读设备等等。
就如贵站举办的那次 ”24小时CSS竞赛“ 附带所说:”不同的浏览器会不有同的表现,但是最好的作品应该在不同的浏览器中都有很好的表现。另外,我们也希望看到在关闭了 CSS/Javascript/ 图像的情况下,依然可以有良好表现的网页。“
ps:一段文字使用 p 包起来和用 h1 包起来对于搜索引擎来说差别还是相当大的。哈哈……
anyLiv ,
是每个问题都有很多方面,随着读者的不断地深入,就会在各个方面之间找到平衡了。
谢谢您的留言!
1 .li {float:right ; display:inline; }为什么在IE和FIREFOX和safari不一样。谢谢老师解答。 www.roadge.com/iblog 最下面的那个列表不知道出了什么问题。
nabate,
关于CSS在不同浏览器的兼容性,建议你看一下下面3篇文章,可能对你有所帮助:
http://learning.artech.cn/20071119.css-browser-debug.html
http://learning.artech.cn/20080129.css-debug-skills.html
http://learning.artech.cn/20080203.firefox-ie-css-hack.html
从 CSS 呈现上来说,确实是“块级元素”与“行内元素”可以相互转换,但还是有很多不同的,否则也不会有那么多的 HTML 标签了。
anyliv ,
多谢补充,我已经对文章做了补充说明,请提意见和建议。
总结与提高里面有些说法可能会误导初学者 。。
“比如,你把网页上的p标记,换成div,然后对这个div设置一些CSS属性,就可以和p完全一样了”
好像忘记了一个重要的部分: 结构和语义。。
鹤庭逸,
多谢补充,我已经对文章做了补充说明,请提意见和建议。
块级元素和行内元素似乎一直都是个问题。。。
请温老师总结那些是行内元素,那些是块级元素。
可可,
比如 strong、b、font 这些在HTML中用于设置样式和属性的是行内元素,其他大多是块级元素。