尽管像<div>
这样的元素通常会增长以适应其内容,但使用float
属性可能会导致 CSS 新手出现一个令人吃惊的问题: 如果浮动元素具有非浮动父元素,则父元素将崩溃。
例如:
<div>
<div style="float: left;">Div 1</div>
<div style="float: left;">Div 2</div>
</div>
此示例中的父 div 不会展开以包含其浮动的子项 - 它将显示为height: 0
。
我想在这里创建一个详尽的解决方案列表。如果您了解跨浏览器兼容性问题,请指出它们。
浮动父母。
<div style="float: left;">
<div style="float: left;">Div 1</div>
<div style="float: left;">Div 2</div>
</div>
优点 :语义代码。
缺点 :您可能并不总是希望父级浮动。即使你这样做,你是否漂浮了父母的父母,等等?你必须浮动每个祖先元素吗?
给父母一个明确的高度。
<div style="height: 300px;">
<div style="float: left;">Div 1</div>
<div style="float: left;">Div 2</div>
</div>
优点 :语义代码。
缺点 :不灵活 - 如果内容更改或浏览器调整大小,布局将中断。
在父元素中添加 “spacer” 元素,如下所示:
<div>
<div style="float: left;">Div 1</div>
<div style="float: left;">Div 2</div>
<div class="spacer" style="clear: both;"></div>
</div>
优点 :直接编码。
缺点 :不是语义; spacer div 仅作为布局黑客存在。
将父级设置为overflow: auto
。
<div style="overflow: auto;">
<div style="float: left;">Div 1</div>
<div style="float: left;">Div 2</div>
</div>
优点 :不需要额外的 div。
缺点 :看起来像一个黑客 - 这不是overflow
财产的既定目的。
最可靠和不引人注目的方法似乎是这样的:
演示: http : //jsfiddle.net/SO_AMK/wXaEH/
HTML:
<div class="clearfix">
<div style="float: left;">Div 1</div>
<div style="float: left;">Div 2</div>
</div>
CSS:
.clearfix::after {
content: " ";
display: block;
height: 0;
clear: both;
}
通过一些 CSS 定位,您甚至不需要向父DIV
添加类。
此解决方案向后兼容 IE8,因此您无需担心旧版浏览器失败。
已经建议对解决方案 1 进行调整,如下:
演示: http : //jsfiddle.net/wXaEH/162/
HTML:
<div class="clearfix">
<div style="float: left;">Div 1</div>
<div style="float: left;">Div 2</div>
</div>
CSS:
.clearfix::after {
content: " ";
display: block;
height: 0;
clear: both;
*zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML += '<div class="ie7-clear"></div>' );
}
.ie7-clear {
display: block;
clear: both;
}
此解决方案似乎向后兼容 IE5.5 但未经测试。
也可以设置display: inline-block;
width: 100%;
在不折叠的情况下模拟正常的块元素。
演示: http : //jsfiddle.net/SO_AMK/ae5ey/
CSS:
.clearfix {
display: inline-block;
width: 100%;
}
此解决方案应向后兼容 IE5.5,但仅在 IE6 中进行了测试。
我通常使用overflow: auto
技巧; 虽然这不是严格来说,溢出的用途,它是有点相关 - 足以令它容易记住,一定。在这个例子中, float: left
本身已经被扩展用于各种用途,比溢出更重要。
而不是将overflow:auto
放在父级上,而是将overflow:hidden
我为任何网页写的第一个 CSS 总是:
div {
overflow:hidden;
}
然后我再也不用担心了。