
在开始正文前,先来看两个问题。
对于一个行内元素,设置它的 margin 会有什么表现,为什么它是可行的
答:设置 margin-left
和 margin-right
有影响,而 margin-top
和 margin-bottom
无影响。
行内元素设置 margin 会有位置的改变吗
答:左右 margin
会变,上下 margin
不会变。
以上两个问题均涉及到了 margin 的一些细节,我们详细解释以下结论,来对上述问题进行解读:
? 行内元素中,padding-left / padding-right / margin-left / margin-right
有影响结果;
? 行内元素中,padding-top / padding-bottom / margin-top / margin-bottom
不影响结果;
? padding-top / padding-bottom
虽然不影响结果,但实际上生效了。
举个例子:
html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Titletitle>
<style>/* span {
padding: 10px;
margin: 50px;
background-color: red;
} */div {background-color: yellow;
}style>
head>
<body>
<div>外层上 divdiv>
<div>外层下 divdiv>
body>
html>
html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Titletitle>
<style>span {padding: 10px;margin: 50px;background-color: red;
}div {background-color: yellow;
}style>
head>
<body>
<div>外层上 divdiv>
<span>我是内联元素span>
<div>外层下 divdiv>
body>
html>
运行结果
在 code_1.html
中,我们设置了两个 div
,背景为黄色,运行结果如下:

这时,在 code_2.html
中,我们在两个 div
之间,加一个内联元素 span
,并设置 padding
和 margin
,运行结果为下面这样:

仔细看这个图,先尝试自己理解一下为什么会变成这样。
分两步理解:
第一步,当没有 background-color: red
时,结果是 span
向右移动了 的距离,即:padding-left / padding-right / margin-left / margin-right
影响了结果; padding-top / padding-bottom / margin-top / margin-bottom
不影响结果.

第二步,加上 background-color: red
后,我们发现其实 padding-top / padding-bottom
生效了,不过还是没影响到结果;而 margin-top / margin-bottom
没有生效。

那么我们又产生了一个新的问题:
为什么会出现上述情况
答: 是 不可替换元素 (non-replaced element),而 行内不可替换元素的外边距不会改变该元素的行高。
来理解三个关键词
- 行内元素
- 不可替换元素
- 行高
1. 块级元素(block-level)和行内元素(inline-level)
HTML(超文本标记语言,Hypertext Markup Language)元素大多数都是块级元素或行内元素。
它们的区别在于:默认情况下,块级元素会新起一行。
所有块级元素:

所有行内元素:
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,,
,
,
,
,
,
,
,
,
,
(以上数据来源于 MDN)
2. 可替换元素(replaced element)和不可替换元素(non-replaced element)
可替换元素和不可替换元素可以看作 HTML 元素的另一种分类方式,可替换元素的内容不受当前文档的样式的影响,比如
是一个可替换元素,典型的可替换元素有:
;有些元素仅在特定情况下被作为可替换元素处理,例如:
.
(以上数据来源于 MDN)
它们和块级元素的之间的关系可以这样理解:
3. 行高
像小时候学英语时的四线格,从上到下四条线分别是顶线、中线、基线、底线,分别对应 verticle-align
属性中的 top / middle / baseline / bottom
四个值。如图,上下文本中两条红色基线之间的垂直距离就是行高。
理解了上面三个概念之后,我们就明白了:因为
既是行内元素,又是不可替换元素。而行内元素中,不可替换元素的外边距不会改变该元素的行高,所以在
中当我们试图使用
margin
或 padding
改变元素的外边距时,行高是不变的,只是宽度变大了。
你可能会问:假如把换成可替换元素,改变外边距就会影响行高了?
是的。
如下图,当我们把 换成可替换元素
后,
margin
和 padding
均会影响上下左右的距离。
