block、inline 和 inline-block三者之间的区别

1. 前言

  • block 和 inline 这两个概念是简略的说法,完整确切的说应该是 block-level elements (块级元素) 和 inline elements (内联元素)。block 元素通常被现实为独立的一块,会单独换一行;inline 元素则前后不会产生换行,一系列 inline 元素都在一行内显示,直到该行排满。
  • 大体来说 HTML 元素各有其自身的布局级别(block 元素还是 inline 元素):
    • 常见的块级元素有 DIV, FORM, TABLE, P, PRE, H1~H6, DL, OL, UL 等。
    • 常见的内联元素有 SPAN, A, STRONG, EM, LABEL, INPUT, SELECT, TEXTAREA, IMG, BR 等。
  • block 元素可以包含 block 元素和 inline 元素;但 inline 元素只能包含 inline 元素。要注意的是这个是个大概的说法,每个特定的元素能包含的元素也是特定的,所以具体到个别元素上,这条规律是不适用的。比如 P 元素,只能包含 inline 元素,而不能包含 block 元素。
  • 一般来说,可以通过 display:inline 和 display:block 的设置,改变元素的布局级别。

2. display: block

  • block 元素会独占一行,多个 block 元素会各自新起一行。默认情况下,block 元素宽度自动填满其父元素宽度。
  • block 元素可以设置 width,height 属性。块级元素即使设置了宽度,仍然是独占一行。
  • block 元素可以设置 margin 和 padding 属性。

3. display:inline

  • inline 元素不会独占一行,多个相邻的行内元素会排列在同一行里,直到一行排列不下,才会新换一行,其宽度随元素的内容而变化。
  • inline 元素设置 width,height 属性无效。
  • inline 元素的 margin 和 padding 属性,水平方向的 padding-left, padding-right, margin-left, margin-right 都产生边距效果;但竖直方向的 padding-top, padding-bottom, margin-top, margin-bottom 不会产生边距效果。
  • 例外: input, video 和 img 等元素设置为 inline 元素 width 和 height 是有效的其 margin 和 padding 属性竖直方向也都是有效的

4. display: inline-block

简单来说就是将对象呈现为 inline 对象,但是对象的内容作为 block 对象呈现。

与 display: inline 相比,主要区别在于 display: inline-block 允许在元素上设置宽度和高度。

同样,如果设置了 display: inline-block,将保留上下外边距/内边距,而 display: inline 则不会。

与 display: block 相比,主要区别在于 display:inline-block 在元素之后不添加换行符,因此该元素可以位于其他元素旁边。

下例展示 display: inline、display: inline-block 以及 display: block 的不同行为:

注意: IE(低版本 IE)本来是不支持 inline-block 的,所以在 IE 中对内联元素使用 display:inline-block,理论上 IE 是不识别的,但使用 display:inline-block 在 IE 下会触发 layout,从而使内联元素拥有了 display:inline-block 属性的表象。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
<!DOCTYPE html>
<html>
<head>
<style>
span.a {
display: inline; /* the default for span */
width: 100px;
height: 100px;
padding: 5px;
border: 1px solid blue;
background-color: yellow;
}

span.b {
display: inline-block;
width: 100px;
height: 100px;
padding: 5px;
border: 1px solid blue;
background-color: yellow;
}

span.c {
display: block;
width: 100px;
height: 100px;
padding: 5px;
border: 1px solid blue;
background-color: yellow;
}
</style>
</head>
<body>
<h1>display 属性</h1>

<h2>display: inline</h2>
<div>
Shanghai is one of the four direct-administered municipalities of
<span class="a">the People's Republic of China</span>. Welcome to
<span class="a">Shanghai</span>!
</div>

<h2>display: inline-block</h2>
<div>
Shanghai is one of the four direct-administered municipalities of
<span class="b">the People's Republic of China</span>. Welcome to
<span class="b">Shanghai</span>!
</div>

<h2>display: block</h2>
<div>
Shanghai is one of the four direct-administered municipalities of
<span class="c">the People's Republic of China</span>. Welcome to
<span class="c">Shanghai</span>!
</div>
</body>
</html>

5. 补充说明

一般我们会用 display:block,display:inline 或者 display:inline-block 来调整元素的布局级别,其实 display 的参数远远不止这三种,仅仅是比较常用而已。

display 所有的参数如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
/* precomposed values */
display: block;
display: inline;
display: inline-block;
display: flex;
display: inline-flex;
display: grid;
display: inline-grid;
display: flow-root;

/* box generation */
display: none;
display: contents;

/* two-value syntax */
display: block flow;
display: inline flow;
display: inline flow-root;
display: block flex;
display: inline flex;
display: block grid;
display: inline grid;
display: block flow-root;

/* other values */
display: table;
display: table-row; /* all table elements have an equivalent CSS display value */
display: list-item;

/* Global values */
display: inherit;
display: initial;
display: revert;
display: revert-layer;
display: unset;

6. 参考文档

block,inline 和 inline-block 概念和区别

CSS 布局 - display: inline-block

block、inline 和 inline-block三者之间的区别

https://pengtech.net/web/block_inline_inline_block.html

作者

鹏叔

发布于

2021-10-26

更新于

2024-08-30

许可协议

评论