外边距折叠指的是毗邻的两个或多个外边距 (margin) 会合并成一个外边距,本文详细的介绍了一下css外边距折叠的实现,分为3种状况,很是具备实用价值,须要的朋友能够参考下css
前文前端
这是的一个经典的老问题,由于以前恰好有读者朋友问到,顺便整理一下。浏览器
从一个简单例子提及ide
先看一个简单示例:学习
`<``style``>` `.slide1 div {` `margin:10px 0;` `}` `</``style``>` `<``div` `class``=``"slide1"``>` `<``h3``>第1种外边距折叠:兄弟元素</``h3``>` `<``p``>文本上下间距10px</``p``>` `<``p``>文本上下间距10px</``p``>` `</``div``>`
看这个例子中的两个p
标签,根据样式定义:第一个p
的margin-bottom
和第二个p
的margin-top
都是10px,那实际距离应该等于20px才对,可是用浏览器查看一下能够发现,最终的边距是10px
。 这个例子就是外边距折叠:块级元素的上外边距和下外边距有时会合并(或折叠)为一个外边距。spa
分类状况code
外边距折叠有3种基本状况:开发
先不急着记忆,首先,前文的例子中就是第一种状况--相邻的两个元素之间发生的外边距折叠。rem
第二种和第三种状况以下:it
`<``style``>` `.father {` `background-color: green;` `}` `.child {` `margin-top: 50px;` `background-color: red;` `height: 300px;` `}` `.slide3 {` `margin: 10px 0;` `}` `</``style``>` `<``h3``>第2种外边距折叠:父元素和首个子元素</``h3``>` `<``div` `class``=``"slide2 father"``>` `<!-- 父元素是绿色 -->` `<``div` `class``=``"slide2 child"``>` `<!-- 子元素是红色 -->` `</``div``>` `</``div``>` `<``h3``>第3种外边距折叠:空的块级元素</``h3``>` `<``div` `class``=``"slide3"``></``div``>` }//欢迎加入全栈开发交流划水交流圈:582735936 ]//面向划水1-3年前端人员 } //帮助突破划水瓶颈,提高思惟能力
他们的图像也分别如图:
状况2: 子元素的外边距会“转移”到父元素的外面
状况3:该元素的上下外边距会折叠
好了,到这里咱们不妨来看看这几种状况的共同点(建议画一下他们的盒模型,我懒就不画了-_-),能够发现发生外边距折叠的共同缘由:margin之间直接接触,没有阻隔。
如何理解直接接触?很简单:
<p>
标签的垂直方向margin
是直接接触的;padding
,border
都为0,因此margin
和它的子元素也是直接接触的。(这个例子画出盒模型就很好理解)padding
,border
也是0)各类状况下折叠的结果
折叠后的边距如何计算,这个能够简单验证下:
如何防止外边距折叠
前文说到,发生外边距折叠的缘由是,外边距直接接触,所以防止折叠的方式就是,阻隔这个直接接触,组合的方法包括:
border padding
非0,或者有inline
元素隔开,好比父元素里加一行文字也能够(能够直接在状况2尝试)display:table
等(BFC
不熟悉的同窗先查查,我后面补上)小结
还得补充一下,前面讨论的是基本状况,在基本状况下还能够进行组合,好比多个相邻元素之间;多层后代元素嵌套等等,弄明白基本原理,其余状况只要写写小的demo验证下就很好理解了。而后是惯例:若是内容有错误的地方欢迎指出(以为看着不理解不舒服想吐槽也彻底没问题);
以上就是本文的所有内容,但愿对你们的学习有所帮助,