如果您的 div1 和 div2 周围有一些边距,您可以看到 div3:
<h2>Why it breaks...</h2>
<div style="width:100px;height:100px;background-color:#ffff00;float:left;margin: 0 10px;">div1</div>
<div style="width:100px;height:100px;background-color:#0000ff;float:left;margin: 0 10px;">div2</div>
<div style="width:100px;height:100px;background-color:#00ff33;">div3</div>
<h2>How to fix it...</h2>
<div style="width:100px;height:100px;background-color:#ffff00;float:left;margin: 0 10px;">div1</div>
<div style="width:100px;height:100px;background-color:#0000ff;float:left;margin: 0 10px;">div2</div>
<div style="width:100px;height:100px;background-color:#00ff33;overflow: auto;">div3</div>
但是,这很容易overflow: auto
在 div3 上修复。
见小提琴:http: //jsfiddle.net/audetwebdesign/jv7YB/
为什么你会看到这种效果
流中的 div3,指定高度和宽度为 100px,背景颜色为绿色。
如果没有浮动,您会看到一个位于视口左上角的绿色方块,它是父元素。在绿色方块内,文本(更准确地说,包含文本的行框)位于左上角。
添加浮动时,浮动从视口的左上角开始定位,并绘制在任何常规流入内容上。
然而,包含 div3 文本的 line box 被缩短了为浮动腾出空间,但内联框被推下,因为 div3 容器中没有空间来包含浮动和原始文本。
div3 容器的背景与包含文本的行框是分开的,并且没有像预期的那样被向下推。
当您应用overflow: auto
到 div3 块时,它会创建一个新的块格式化上下文,并且 div3 块就像一个独立的单元,因此绿色背景包含内容和任何子元素。
参考
有关堆叠顺序和背景颜色的绘制方式,请参见:http ://www.w3.org/TR/CSS2/zindex.html#painting-order
对于块格式化上下文:http ://www.w3.org/TR/CSS2/visuren.html#block-formatting
有关为什么按原样实现块格式化上下文的更多见解,请参阅:
为什么 CSS2.1 定义“可见”以外的溢出值来建立新的块格式化上下文?由BoltClock提供