问题描述
为了了解块格式上下文有什么作用,我试图找出BFC是不是创建的何时发生的事情.
我从您知道的一切都错了, :
.wrapper { width: 740px; background: #cccccc; } .leftSidebar { float: left; width: 200px; } .rightSidebar { float: right; width: 200px; } .mainContent { padding-right: 200px; padding-left: 200px; } .floatMe { float: left; background: teal; color: #fff; }
<div class="wrapper"> <div class="leftSidebar"> <h2>Heading</h2> <pre>.leftSidebar { float:left; width:200px; }</pre> </div> <div class="rightSidebar"> <h2>Heading</h2> <pre>.rightSidebar { float:right; width:200px; }</pre> </div> <div class="mainContent"> <h2>Heading</h2> <pre>.mainContent { padding-right:200px; padding-left:200px; }</pre> <div class="floatMe"> <pre>.floatMe { float:left; background:teal; color:#fff; }</pre> </div> </div> </div>
根据该文章(重点是我的):
在现代浏览器中:
所有元素属于 相同的块格式上下文如此相邻 边缘崩溃.标题的边距"伸出"包装器 对抗p.与IE不同,这就是边缘(不是一个 黑匣子)在包装器上方创建缝隙.
我无法理解"相同的块格式上下文"是什么意思.我想知道为什么在没有块格式上下文的情况下生产出这种奇怪的布局.
我试图通过将* {border: 1px solid blue;}添加到CSS来弄清确切的布局,但是在此更改之后,整体布局发生了很大变化:现在它的行为就像wrapper 是 一个块格式化上下文!
.wrapper { width: 740px; background: #cccccc; } .leftSidebar { float: left; width: 200px; } .rightSidebar { float: right; width: 200px; } .mainContent { padding-right: 200px; padding-left: 200px; } .floatMe { float: left; background: teal; color: #fff; } * { border: 1px solid blue; }
<div class="wrapper"> <div class="leftSidebar"> <h2>Heading</h2> <pre>.leftSidebar { float:left; width:200px; }</pre> </div> <div class="rightSidebar"> <h2>Heading</h2> <pre>.rightSidebar { float:right; width:200px; }</pre> </div> <div class="mainContent"> <h2>Heading</h2> <pre>.mainContent { padding-right:200px; padding-left:200px; }</pre> <div class="floatMe"> <pre>.floatMe { float:left; background:teal; color:#fff; }</pre> </div> </div> </div>
请告诉我发生了什么.
推荐答案
很好的问题,让我思考很多!
这里有很多概念,所以我将一个一个一个接一个:
buggy IE :
什么是" Haslayout",为什么很重要?
有几个错误 可以通过强制"布局"来处理的Internet Explorer(一个 IE内部数据结构)在元素上.
显然,这是一个非标准的解决方法,因此带来了很多不一致之处.阅读有关此 there .
块格式上下文(BFC):
请参阅clear bfc中的漂浮时会发生什么 - 现在高度将在wrapper bfc中的正常行为.
body{ margin: 0; } *{ box-sizing: border-box; } .wrapper{ border: 1px solid; } .wrapper > * { display: inline-block; border: 1px solid red; width: 33.33%; height: 100px; } .left{ float: left; } .right{ float: right; } .center{ height: 50px; } .wrapper:after{ content: ''; display: block; clear: both; }
<div class="wrapper"> <div class="left">Left</div> <div class="center">Center</div> <div class="right">Right</div> </div>
折叠边缘:
有时将块的顶部和底部边缘组合在一起(崩溃) 分为一个边缘,其大小是最大的边距组合 在其中,一种称为边缘崩溃的行为.
相邻块的边缘崩溃, parent和first/last Child 和空块.请参阅有关 this mdn doc
还请注意:
浮动和绝对位置的元素永远不会崩溃.
那么在这里真正发生了什么?
-
因此,现在您将了解BFC,以及在第一种情况下(未指定边框)如何工作的浮动容器 - 这就是为什么floatMe floatMe都会放在其即时mainContent包装中,以及为什么确切为什么wrapper和mainContent的高度在那里.
-
布局和 ie 提到的仅在IE7中,是非标准的.
-
发生的其他一切都是因为保证金崩溃:
a. h2和pre边缘倒塌(相邻兄弟姐妹)
b. mainContent在body上的边距( parent和first/last child )上的边距转移到顶部以倒塌
c.由于wrapper采用mainContent的高度,wrapper高度也向上移动.
d.当您应用边框时会发生什么是在上面(b)中折叠的保证金被无效! (有关原因,请参见上面的MDN文档)
希望现在看起来更好.欢呼!