116-css-1-布局~盒模型margin

116-css-1-布局~盒模型margin

概述

margin 属性为给定元素设置所有四个(上下左右)方向的外边距属性。

外边距控制的是元素外部空出的空间。相反,padding操作元素内部空出的空间。

重叠

上下元素的下上外边距有时会重叠,实际空出的空间长度变为两外边距中的较长值。

垂直相邻元素的margin-top和margin-bottom会发生重叠

外边距重叠是指两个【垂直】 【相邻】的块级元素,当上下两个边距相遇时,其外边距会产生重叠现象,且重叠后的外边距,等于其中较大者。(水平方向不会发生)

原因

根据W3C文档的说明,当符合以下条件时,就会触发外边距重合

  • 都是普通流中的元素且属于同一个 BFC
  • 没有被 padding、border、clear 或非空内容隔开
  • 两个或两个以上垂直方向的「相邻元素」
相邻元素包括父子元素和兄弟元素

重叠后的margin计算

  • 1、margin都是正值时取较大的margin值
  • 2、margin都是负值时取绝对值较大的,然后负向位移。
  • 3、margin有正有负,从负值中选绝对值最大的,从正值中选取绝对值最大的,然后相加

解决方案

BFC

嵌套父子解决方案

『解决办法』

  • 1、为父元素定义1px的border-top或padding-top。
  • 2、为父元素添加overflow:hidden。
  • 3、子元素或父元素设置display:inline-block。
  • 4、父元素加前置内容(::before)生成。(推荐)
.parent-box::before {
    content : "";
    display :table;
}

相邻兄弟解决方案

『解决办法』

1)为了达到想要的间距,最好在设置margin-top/bottom值时统一设置上或下;

补充

空白内容的<p></p>也会重叠

负值

① 相对定位

margin-top 和 margin-left 负值,元素向上、左移动

margin-right 和 margin-bottom 负值,自身不移动,其右边和下边的元素会向左、上移动

② 绝对定位

margin-right 和 margin-bottom 会令自身移动

通过负边距进行偏移的元素,它会放弃偏移前占据的空间,这样它后面文档流中的其它元素就会“流”过来填充这部分空间。 文档流只能是后面的流向前面的,即文档流只能向左或向上流动,不能向下或向右移动

应用

左右布局

水平居中

在现代浏览器中实现水平居中,可以使用 display: flex; justify-content: center;

不过,在 IE8-9 这样的不支持弹性盒布局的旧式浏览器中,上述代码并不会生效。此时要实现在父元素中居中,可使用 margin: 0 auto;

推荐阅读

https://developer.mozilla.org/zh-CN/docs/Web/CSS/margin