需要解释为什么将右浮动元素作为div中的第一个元素来修复新行问题

Ton*_*ich 1 html css

我有一个带有几个元素的div,最后一个元素是一个按钮,我希望它与div的右边缘相距10个像素.div和按钮具有固定的宽度.该按钮具有显示:内联(注意浮动元素获得阻止行为).问题是给按钮一个右浮动总是把按钮放在一个新的行中,即使div中有足够的空间.

我找到的简单解决方案是将按钮作为div中的第一个元素.它适用于IE6,7,8和FF.我想知道这是否是css标准中的预期行为?

我没有提到过这个小技巧的CSS书籍,也没有点击过我.如果有人可以参考解释此行为的书籍或网站,我将不胜感激.

增加: 容器div正在使用此css来包含子项

.group:after {
    content: ".";
    display: block;
    height: 0;
    clear: both;
    visibility: hidden;
}
Run Code Online (Sandbox Code Playgroud)

cbe*_*ski 7

浮点数非常奇怪,因为它们对于盒子模型没有预测性.你可能会认为花车留在父母身边,但他们没有.坦率地说,浮动行为非常不直观.在下面的示例中,父级是蓝绿色,浮动是紫色.

示例代码

<!DOCTYPE HTML>
<html><head><title>Float Tests</title></head>
<style>
.parent { border: 1px solid #00ddaa; margin-bottom: 5em; }
.float { border: 1px solid #dd00bb; float: right; }
.clear { clear: both; }
p { margin: 0; }
</style>
<body>

<div class="parent">
<p class="float">Paragraph 1</p>
<p>Paragraph 2</p>
<p>Paragraph 3</p>
<div></div>
</div>

<div class="parent">
<p>Paragraph 1</p>
<p>Paragraph 2</p>
<p class="float">Paragraph 3</p>
<div></div>
</div>

<div class="parent">
<p>Paragraph 1</p>
<p>Paragraph 2</p>
<p class="float">Paragraph 3</p>
<div class="clear"></div>  <!-- We're clearing this time -->
</div>

</body></html>
Run Code Online (Sandbox Code Playgroud)

给予

Float Render http://media.banzaimonkey.net/images/forums/floats.png

分析

在第一个例子中,p1是浮动的.p1向右移动,但p1的下边缘不会阻挡p2,因此p2向上滑动以填充空白区域.

在第二个例子中,p3是浮动的.p3向右移动但段落的下边缘不会阻挡父div的下边缘,因此边框向上滑动以填充空白区域.这导致段落出现在div之外.

在第三个例子中,p3再次浮动.它移动到右侧像以前一样,但是当我们添加cleardivP3和家长的收盘之间div,被清除的div针对父块div的下缘.

那么这里发生了什么?

什么float实际上做的是让元素低于周围流动的内容.奇怪的是,它还允许包含块在其周围坍塌.

如果我们的第一个示例中的p1有足够的内容来填充父容器的整个宽度,我们就不会看到任何浮动发生.为了使浮动发生,必须限制浮动块的宽度以允许其他元素溢出到否则将占据的空间中.

那么为什么第3段没有浮动到父容器的顶部?因为段落1和2填充了父容器的整个宽度.如果你想让第二段和第三段都在同一行,你必须将第二段浮动到左边,如下所示:

<div class="parent">
<p>Paragraph 1</p>
<p class="float" style="float: left;">Paragraph 2</p>  <!-- Float left -->
<p class="float">Paragraph 3</p>
<div class="clear"></div>
</div>
Run Code Online (Sandbox Code Playgroud)

其呈现为:

Two Floats http://media.banzaimonkey.net/images/forums/floats2.png

摘要

经验法则是浮动仅允许浮动元素下方的块流动.要共享同一条线的两个项目,您必须浮动两次(一次左侧,一次右侧),或者先放置浮动.此外,如果您希望父级包含浮点数,则必须clear在父级的结束标记之前添加一个浮点数.