CSS margin 语法
在 CSS 中,margin 属性用于定义元素的外边距。从下图所示的 CSS 盒子模型中可以看出,margin 处于 border 之外。

语法:
margin: 数值;说明:
margin 的取值是一个数值,它可以是长度值(如 px、em、rem),也可以是百分比值(相对于父元素的宽度)或关键字 auto。
margin 可以为 1 个、2 个、3 个或 4 个值,用来分别设置上、右、下、左四个方向的外边距。
- 1 个值:应用于所有四条边(上、右、下、左)。
- 2 个值:第一个值应用于上下外边距,第二个值应用于左右外边距。
- 3 个值:第一个值应用于上外边距,第二个值应用于左右外边距,第三个值应用于下外边距。
- 4 个值:依次应用于上、右、下、左外边距(顺时针方向)。
对于 margin 属性,小伙伴们要清楚以下几点。
- margin 属性是 margin-top、margin-right、margin-bottom、margin-left 这 4 个子属性的简写。
- margin 属性可以接受负值,这可能导致元素与相邻元素重叠。
- margin 百分比值是相对于父元素的宽度进行计算的,即使是垂直方向的外边距。
- 对 inline 元素(如 span、strong 等)设置 width 和 height 是无效的,但对它们设置 padding 和 margin 是有效的。
CSS margin 摘要
| 属于 | CSS 外边距 |
|---|---|
| 使用频率 | 高 |
| 是否继承 | 否 |
| 默认值 | 0 |
| 兼容性 | 查看 |
| 官方文档 | 查看 |
| MDN | 查看 |
CSS margin 示例
接下来,我们通过几个简单的例子来讲解一下 CSS margin 属性是如何使用的。
示例 1:“只有父元素没有兄弟元素时” 的外边距
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<style>
#father {
display: inline-block; /* 将块元素转换为inline-block元素,使父元素宽度自适应内容 */
border: 1px solid red;
}
#son {
display: inline-block; /*将块元素转换为inline-block元素,使子元素水平排列 */
padding: 50px;
margin-top: 50px;
margin-right: 100px;
margin-bottom: 150px;
margin-left: 200px;
border: 1px solid blue;
background-color: lightskyblue;
}
</style>
</head>
<body>
<div id="father">
<div id="son">绿叶网</div>
</div>
</body>
</html>页面效果如下图所示。

分析:
当只有父元素时,该元素设置的 margin 就是相对于父元素之间的距离。
示例 2:“有兄弟元素时” 的外边距
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<style>
#father {
display: inline-block; /* 将块元素转换为inline-block元素,使父元素宽度自适应内容 */
border: 1px solid red;
}
#son {
display: inline-block; /* 将块元素转换为inline-block元素,使子元素水平排列 */
padding: 50px;
margin-top: 50px;
margin-right: 100px;
margin-bottom: 150px;
margin-left: 200px;
border: 1px solid blue;
background-color: lightskyblue;
}
.brother {
height: 50px;
background-color: lightskyblue;
}
</style>
</head>
<body>
<div id="father">
<div class="brother"></div>
<div id="son">绿叶网</div>
<div class="brother"></div>
</div>
</body>
</html>页面效果如下图所示。

分析:
当既有父元素,也有兄弟元素时,该元素会先看看四个方向有没有兄弟元素存在。如果该方向有兄弟元素,则这个方向的 margin 就是相对于兄弟元素而言。如果该方向没有兄弟元素,则这个方向的 margin 就是相对于父元素而言。
提示: padding 和 margin 的区别在于:padding 体现的是元素的内部结构,而 margin 体现的是元素之间的相互关系。
示例 3:使用 margin: 0 auto; 实现水平居中
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<style>
div {
width: 100px;
height: 100px;
background-color: lightskyblue;
margin: 0 auto; /* 上下外边距 0,左右外边距 auto (实现水平居中) */
}
</style>
</head>
<body>
<div></div>
</body>
</html>页面效果如下图所示。

分析:
在这个例子中,我们将 div 的宽度高度都设置为 100px,然后使用 margin: 0 auto;。auto 值会使浏览器在水平方向上自动分配剩余空间,从而将元素居中。
示例 4:margin 外边距重叠
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<style>
div {
width: 200px;
height: 100px;
}
.box1 {
margin-bottom: 20px; /* 底部外边距 20px */
background-color: hotpink;
}
.box2 {
margin-top: 40px; /* 顶部外边距 40px */
background-color: lightskyblue;
}
</style>
</head>
<body>
<div class="box1"></div>
<div class="box2"></div>
</body>
</html>页面效果如下图所示。

分析:
在这个例子中,box1 的底部外边距为 20px,而 box2 的顶部外边距为 40px。理论上它们之间的距离应该是 20px + 40px = 60px,但由于相邻元素的垂直外边距会重叠,因此实际的外边距为 40px(取较大值)。
margin 的派生子属性
margin 是一个复合属性,它有 4 个派生子属性(如下表所示),用于单独设置某个方向的 margin。
| 子属性 | 说明 |
|---|---|
| margin-top | 上外边距 |
| margin-right | 右外边距 |
| margin-bottom | 下外边距 |
| margin-left | 左外边距 |
