<div style="float: left;">Left</div>
<div style="float: right;">Right</div>
<div style="clear: both; margin-top: 200px;">Main Data</div>
<div style="float: left;">Left</div>
<div style="float: right;">Right</div>
<div style="clear: both; margin-top: 200px;">Main Data</div>
你可以把这两个浮动的
<div style='overflow:hidden'>
<div style="float: left;">Left</div>
<div style="float: right;">Right</div>
</div>
<div style="clear: both; margin-top: 200px;">Main Data</div>
编辑 — 给这个5年前的答案添加一点内容:我认为混乱行为的原因是有点复杂的 外边距折叠 过程。对于来自OP的原始HTML,一个好的技巧是添加如下CSS规则:
div { border: 1px solid transparent; }
哇!现在(没有我额外添加的<div>
)它运行得很好!嗯,除了那个来自边框的额外像素。特别是,我认为这是clear:both
工作方式和边距折叠规则的组合,导致了原始代码中意外的布局。
再次编辑 - 对于完整(而且我认为是完全准确的)的故事,请参见Mark Amery的精彩回答。细节有些复杂,这个答案没有涉及到。
clear
的说明后,我相当确定它是一个边距折叠效应。然而,我并不完全理解它。我在答案中进行了一些编辑。 - Pointy虽然 Pointy 展示了如何使用 div 包裹浮动元素,但是你也可以在浮动元素和主数据区块之间插入一个空的 div。比如:
<div style="float: left;">Left</div>
<div style="float: right;">Right</div>
<div style="clear: both;"></div>
<div style="margin-top: 200px;">Main Data</div>
在某些情况下,添加 div 包装器可能不是理想的解决方案,这时候这个方法可能会有用。
对于clear
设置为除none
之外的元素,该模型可能会引入额外的组件:清除。
除“none”以外的值可能会引入清除。清除抑制了边距折叠,并作为元素上方的margin-top的间距。
换句话说,在这些情况下,盒模型实际上看起来更像这样:
但是什么时候引入间隔,它应该有多大?让我们从第一个问题开始。规范says:<div style="float: left; background: red;">Left</div>
<div style="float: right; background: green;">Right</div>
<div style="clear: both; margin-top: 200px; background: blue;">Main Data</div>
让我们按照规范的要求,想象一下如果第三个div上的clear
属性设置为none
而不是both
,那么以上代码片段会变成什么样子?
<div style="float: left; background: red;">Left</div>
<div style="float: right; background: green;">Right</div>
<div style="clear: none; margin-top: 200px; background: blue;">Main Data</div>
margin-top
,并且出现在两个浮动的div之后;难道两个浮动的div不应该出现在body的顶部,而第三个div在它们下面200px吗?在我们的例子中,第一个和第二个 div 元素都被浮动了,因此只有第三个 div 元素是 in-flow 的。因此,它的顶部 margin 与其父元素的顶部 margin 相邻,从而使 margin 合并 - 推动整个 body,包括这两个浮动元素。因此,即使第三个 div 元素有一个较大的 margin-top
,它仍然会与其兄弟元素重叠。因此,在这种假设情况下,第三个元素的 clear
设置为 none
,我们满足以下条件:
元素的顶部边框边缘没有超过相关浮动元素
因此:
引入了间隙,并根据 8.3.1 中的规则合并了 margin
这里引入了多少间隙?规范给浏览器提供了两个选项,并附有一些澄清说明:
然后,间隙的量被设置为以下两者中的较大值: 1. 将块的边框边缘与要清除的最低浮动元素的底部外边缘对齐所需的间隙量。 2. 使块的顶部边框边缘处于其假设位置所需的间隙量。 另外,可以将间隙精确地设置为将块的边框边缘与要清除的最低浮动元素的底部外边缘对齐所需的间隙量。 注意:这两种行为都是允许的,但需要评估它们与现有网络内容的兼容性。未来的 CSS 规范将要求其中之一。 注意:间隙可以是负数或零。body {
padding-top: 1px;
}
<div style="float: left; background: red;">Left</div>
<div style="float: right; background: green;">Right</div>
<div style="clear: none; margin-top: 200px; background: blue;">Main Data</div>
因此,我们别无选择,只能对第三个div应用负间隙,以使其顶部边框边缘上移,接触到上面的浮动元素的底部外边缘(也称为边距边缘)。因此,如果每个浮动元素高度为10px,第三个div具有200px的顶部边距,则将应用-190px的间隙。这样,最终实现了问题提出者所看到的最终结果。将块的边框边缘放置在要清除的最低浮动块的底部外边缘上
<div style="float: left; background: red;">Left</div>
<div style="float: right; background: green;">Right</div>
<div style="clear: both; margin-top: 200px; background: blue;">Main Data</div>
overflow: auto
或 overflow: hidden
应该可以解决问题(尽管由于某种原因,如果容器是 body
元素,则无法正常工作)。我不太确定为什么这会起作用,因为它取决于“块格式化上下文”的定义(我还没有研究过并且目前不理解)。 - Mark Amery<div style="float: left;">Left</div>
<div style="float: right;">Right</div>
<div style="float: left; clear: both; margin-top: 200px;">Main Data</div>
替代方案:
您实际上可以在浮动元素上放置一个
margin-bottom
,以向下推动具有clear: both
的下面的元素。
注意:尽管我提出了这个建议,但我必须立即撤回它,因为这不是一般的好主意,但在某些有限的情况下可能是合适的;
<div class='order'>
<div class='address'>
<strong>Your order will be shipped to:</strong><br>
Simon</br>
123 Main St<br>
Anytown, CA, US
</div>
<div class='order-details'>
Item 1<br>
Item 2<br>
Item 3<br>
Item 4<br>
Item 5<br>
Item 6<br>
Item 7<br>
Item 8<br>
Item 9<br>
Item 10<br>
</div>
<div class='options'>
<button>Edit</button>
<button>Save</button>
</div>
</div>
order-details
, 其CSS如下。.order-details
{
padding: .5em;
background: lightsteelblue;
float: left;
margin-left: 1em;
/* this margin does take effect */
margin-bottom: 1em;
}
margin-top
属性,但是除非它大于最高的浮动项目,否则它不会起作用(当然这就是这个问题的重点)。margin-top
属性设置为20em,则它将可见,因为边距是从外部蓝色框的顶部计算的。请在主数据 div 中使用 'padding-top',或者将主数据 div 包装在一个具有 'padding-top' 的 div 中。
.alignright{
float: right;
margin-left: 20px;
margin-top: 20px;
position: relative;
top: -20px;
}
针对您的示例,您可以这样做
<div style="float: left;">Left</div>
<div style="float: right;">Right</div>
<div style="clear: both; margin-bottom: 200px; position: relative; top: 200px;">Main Data</div>