block 和 inline 的区别是?

作者:棕熊 来源:棕熊@Think Fast 时间:2009-12-08 13:00:00 

在讲样式表开发管理之前,我想插播一个小知识。前几天看web标准设计组里,看到龍佑康同学问到关于 block 和 inline 的区别。记得以前也经常会有人问这样的问题,国内的论坛也好,国外的论坛也好,似乎大家都会比较疑惑这两者究竟是用来干什么的。想想其实好多人都会在这里犯一些比较常见错误,所以干脆就开一篇文章专门讲讲 block 和 inline 吧。

- 讲表现之前先要讲概念

这里我要强调一下,概念在前端开发中是很重要的啦~

可能很多人都觉得,随便搞个样式,左摆摆右弄弄,能用就行了,但是实际上,很多情况都会有一些非常棘手的状况。对于这些状况,你需要有应对。应对的方法取决于很多因素,其中一个是灵感,还有一个就是对概念深入的理解了。

这里,我们要明确的概念是——什么是 block, 而什么又是 inline 呢?

其实,金光闪闪bling bling的规范里,在三个完全不同的地方提到了block和inline的概念。或许这个就是为什么这么多人都会感到confused 的原因吧=v=

- Block-level Elements VS Inline Elements

第一处讲到block和inline概念的地方是在 HTML 的规范中。确切的说应该是 block-level elements (块级元素)inline elements (内联元素):

所有允许被 BODY 元素包含的元素,要么是块级的;要么是内联的;要么既可以算作块级的,也可以算作内联的。但是绝对不存在一个能被BODY包含,但即非块级,又非内联的元素。

常见的块级元素有 DIV, FORM, TABLE, P, PRE, H1~H6, DL, OL, UL 等等。

常见的内联元素有 SPAN, A, STRONG, EM, LABEL, INPUT, SELECT, TEXTAREA, IMG, BR 等等。

另外,SCRIPT, OBJECT, MAP, BUTTON, DEL, INS 这些元素,既可以作为块级元素,也可以作为内联元素。


  • 那么块级元素和内联元素具体有什么区别呢?具体表现在以下几个方面:

    • 一般来说块级元素可以包含块级元素和内联元素;但内联元素只能包含内联元素。要注意的是,每个特定的元素,能包含的元素也是特定的,所以具体到个别元素上,这条规律是不适用的

      比如 P 元素,只能包含内联元素,而不能包含块级元素。

      1: <!-- 这样做是错误的 -->

      2: <p><div>一段文字</div></p>

      3: 

      4: <!-- 这样才是王道 b=v= -->

      5: <p><span>一段文字</span></p>

    • 另一个区别是在显示上。块级元素通常被现实为独立的一块,前后都会和换一行;内联元素则前后不会产生换行,一系列内联元素都在一行内显示。但是,最终决定页面显示的是样式表,而非元素本身。这条规则的制定,估计多半是为了让那些先于规范出现的浏览器能自圆其说而已

      比如我们知道,TABLE 元素的默认显示布局其实是用一套独特的 display: table 规则;而 BR 元素,根本本身就是个换行;哪怕一个DIV,都能用样式表直接指定它 display: inline,所以这条规则也根本等于没用。

    • 那么本质的区别呢?其实最本质的区别在于——在 Strict 的DTD下,BODY 元素只能包含块级元素,而不能包含内联元素。或许你要问,不是说BODY包含的元素不是块级就是内联么?怎么没有内联了?很简单——因为在Transitional 的DTD里,BODY也是可以包含内联元素的

      大家来看具体例子:

      <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

      <html xmlns="http://www.w3.org/1999/xhtml">

      <head>

      <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

      <title>Block-Level vs Inline Demo</title>

      </head>

       

      <body>

       

      <!-- 这样做是错的 -->

      <img src="/SomeImage.png" title="an image" alt="an image" />

       

      <!-- 一定要这样做才可以哟 -->

      <p><img src="/SomeImage.png" title="an image" alt="an image" /></p>

       

      </body>

      </html>

      <!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">

      <head>

      <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

      <title>Block-Level vs Inline Demo</title>

      </head>

       

      <body>

       

      <!-- 换了个DTD就都OK了 -->

      <img src="/SomeImage.png" title="an image" alt="an image" />

      <p><img src="/SomeImage.png" title="an image" alt="an image" /></p>

       

      </body>

      </html>


标签:block,inline,区别,css
0
投稿

猜你喜欢

  • python用pip install时安装失败的一系列问题及解决方法

    2021-10-15 23:11:43
  • python GUI库图形界面开发之PyQt5窗口控件QWidget详细使用方法

    2023-05-25 23:48:29
  • Python中正则表达式的用法实例汇总

    2021-10-02 07:48:08
  • InnoDB的关键特性-插入缓存,两次写,自适应hash索引详解

    2024-01-18 01:28:23
  • Javascript中判断变量是数组还是对象(array还是object)

    2024-04-17 09:51:28
  • Python的文本常量与字符串模板之string库

    2022-04-11 05:13:25
  • go slice 数组和切片使用区别示例解析

    2023-06-22 04:07:16
  • 详解MySQL 8.0 之不可见索引

    2024-01-22 17:41:46
  • 在查询分析器理启动或停止SQL Agent服务

    2009-01-08 16:20:00
  • python 打印完整异常问题

    2022-11-04 16:04:11
  • 如何利用JS将手机号中间四位变成*号

    2024-02-23 20:07:51
  • MySQL存储过程中的sql_mode问题

    2011-01-04 19:50:00
  • JS实现跟随鼠标闪烁转动色块的方法

    2024-04-16 09:05:21
  • Python实现arctan换算角度的示例

    2023-07-16 20:31:28
  • Python远程linux执行命令实现

    2023-11-17 14:48:14
  • Django跨域请求问题的解决方法示例

    2023-05-25 13:28:27
  • python实现简单飞机大战小游戏

    2023-12-19 06:55:37
  • MySQL表字段设置默认值(图文教程及注意细节)

    2024-01-18 14:34:52
  • OpenSearch 初探

    2008-06-19 12:06:00
  • Python正则表达式re.sub()用法详解

    2022-05-29 14:30:01
  • asp之家 网络编程 m.aspxhome.com