<section id="sec"> <style media="screen"> #sec{ background-color: red; } .child{ height: 100px; margin-top: 10px; background: yellow; } </style> <article class="child"></article> </section>
问题:有时当咱们设置子元素的margin-top,可是却发现子元素没有出现上外边距的效果,反而是父元素出现了上外边距的效果。
缘由:边距重叠,一个盒子和其子孙的边距重叠。根据规范,一个盒子若是没有添加BFC,那么它的上边距应该和其文档流中的第一个子元素的上边距重叠。布局
<section id="margin"> <style> #margin{ background-color: pink; overflow:hidden; } #margin>p{ margin: 5px auto 25px; background-color: red; } </style> <p>1</p> <p>2</p> <p>3</p> </section>
此处粉色间距均为25px。
问题:某元素A下边距25px,其兄弟元素B上边距5px,则两者合并为25px(取最大值)。
缘由:兄弟元素边距重叠,取重叠部分最大值。flex
<section id="layout"> <style> #layout{ background-color: red; } #layout .left{ float:left; width: 100px; height: 100px; background-color: purple; } #layout .right{ height: 110px; background-color: #ccc; } </style> <div class="left"></div> <div class="right"></div> </section>
问题:右侧元素.right
把背景色红色覆盖。
缘由:右侧元素.right
与左侧浮动元素.left
的box重叠。spa
BFC定义:code
BFC(Block formatting context)直译为"块级格式化上下文"。它是一个独立的渲染区域,只有Block-level box参与, 它规定了内部的Block-level Box如何布局,而且与这个区域外部绝不相干。
<!-- BFC解决父子元素边距重叠的问题 --> <section id="sec"> <style media="screen"> #sec{ background-color: #f00; overflow: hidden; <!--BFC--> } .child{ height: 100px; margin-top: 10px; background: yellow; } </style> <article class="child"></article> </section>
原理:BFC在页面上是一个独立的容器,父子/外部内部互不影响。orm
<!-- BFC解决兄弟元素边距重叠的问题 --> <section id="margin"> <style> #margin{ background-color: pink; overflow:hidden; } #margin>p{ margin: 5px auto 25px; background-color: red; } .new{ margin: 5px auto 25px; background-color: red; } </style> <p>1</p> <!-- 解决垂直方向边距重叠,增长父元素并设置overflow属性为hidden --> <div style="overflow:hidden"> <p class="new">2</p> </div> <p>3</p> </section>
粉色边距由上至下依次为5,30,30,25。
原理:BFC垂直方向边距不会发生重叠。blog
<!-- BFC元素不与float元素的内容重叠 --> <section id="layout"> <style> #layout{ background-color: red; } #layout .left{ float:left; width: 100px; height: 100px; background-color: purple; } #layout .right{ height: 110px; background-color: #ccc; overflow: auto; /* 建立BFC ,利用BFC元素不与float元素内容重叠 */ } </style> <div class="left"></div> <div class="right"></div> </section>
原理:BFC区域不会与浮动元素的box重叠。文档
<section id="float"> <style> #float{ background-color: purple; overflow:auto; /* 设置BFC清除浮动 */ /* float:left; */ } #float .float{ float: left; font-size:30px; } </style> <div class="float">我是浮动元素</div> </section>
原理:计算BFC高度时,浮动子元素也会参与运算。it
overflow
: hidden/scroll/auto(不为visible)float
不为noneposition
为absolute或者fixeddisplay
为inline-block、table、table-cell、table-caption、flex、inline-flex。