简要介绍:margin属性有很多常用的,比如inline–block和block元素,拥有margin-top/bottom/left/right,而inline元素没有垂直方向的margin。margin如果后面跟的是百分比,那么四个方向的margin值都只取决于元素的宽度,而与高度无关。下面复习一下margin属性的常见表现:
1.margin重叠
(1)父子元素之间的margin重叠
(注意:margin重叠只发生在垂直方向)
<p class="parent"> <p class="child">我是一个子元素</p> </p> <style> .parent { background:blue; height:50px; } .child { color:white; margin-top:20px; } </style>
表现为:

我们发现,子元素里面的文字并没有实现margin-top,父子元素发生margin重叠,这里相当于在.parent上增加了margin-top:20px;
(2)兄弟元素之间的margin重叠
与父子元素大体类似,遵循的原则为:正正取最大正值,正负取相加值,负负取最负值。
(3)空白元素的margin重叠
<p class="box"> <p></p> </p> .box{ background:#00CC66; overflow: hidden;} .box>p{ margin:50%;}
表现效果为:

我们可以发现,父元素.box的高度只有宽度的一般,因为.box p子元素是一个空元素,因此发生了margin-top:50%与margin-bottom:50%之间的重叠,于是只有一般宽度的高度。
(4)简单说一下如何消除margin重叠:
给元素设置padding,border,将发生重叠元素构成块状格式化上下文结构(BFC)。
2.margin:auto属性
(1)利用margin:auto实现居中,仅适用于block的元素。
<p class="element"></p> .element { width:300px; height:50px; background:blue; margin:auto; }
表现效果为:

(2)为什么不能实现垂直居中
我们发现通过margin:auto仅仅实现了水平方向的居中,但并没有实现垂直方向的居中。因为默认的block,在不设宽度的时候,是填满整个水平宽度的,而在高度上则没有。
(3)通过设置writing-model来实现垂直居中
writing-mode: vertical-lr;
可以使得自动填充垂直方向,这样会在垂直方向居中而水平方向不居中
(4)绝对定位中,通过margin实现水平居中和垂直居中
<p class="container"> <p class="element"></p> </p> <style> .container{ height:100px; width:500px; position:relative; background:red; } .element { position:absolute; top:0; left:0; right:0; bottom:0; width:300px; height:50px; background:blue; margin:auto; } </style>
通过设置绝对定位元素的left/top/bottom/right都为0,那么可以相对祖先元素实现水平和垂直方向全部居中,效果为:
3.margin-start等属性,不常用