6

首先,此示例仅适用于支持 的浏览器:nth-child,例如 Chrome 或 FireFox。我有一个无序列表,其中奇数列表项向左浮动并向左清除,偶数列表项向右浮动并向右清除。像这样:

HTML:

<ul class="waterfall">
    <li style="height: 100px;">1</li>
    <li style="height: 200px;">2</li>
    <li style="height: 50px;">3</li>
    <li style="height: 100px;">4</li>
    <li style="height: 200px;">5</li>
    <li style="height: 50px;">6</li>
    <li style="height: 50px;">7</li>
    <li style="height: 50px;">8</li>
</ul>​

CSS:

.waterfall {width:302px;}

.waterfall LI {
    min-width: 150px;
    background-color: #CCC;
    margin-top: 2px;
}
.waterfall LI:nth-child(odd) {
    float: left;
    clear: left;
    text-align: right;
}
.waterfall LI:nth-child(even) {
    float: right;
    clear: right;
    text-align: left;
}​

这是小提琴。

目标:

所有奇数列表项都应该向左浮动并堆叠在一起,除了 2px 边距外,两者之间没有间隙。偶数列表项也是如此,除了它们应该向右浮动。

问题简述:

我很困惑,为什么在这个例子中,LI #5 不能出现在 LI #4 之上,而 LI #8 不能出现在 LI #7 之上。换句话说,为什么 LI #5 清除 LI #2,而 LI #8 清除 LI #5?还有,为什么 LI #3 不清除 LI #2(我不想这样,但是如果 LI #5 清除 LI #2,为什么 LI #3 不加入派对)?

TL;博士

到目前为止,我的想法有些不确定。如果第一个元素稍后在标记中定义,则浏览器似乎不希望元素的顶部出现在另一个元素的顶部之上。真的吗?

我知道浮动元素被放置在一条线上,并且任何不适合该线的浮动元素都会跳到一条新线并从那里流动(与绝对定位元素的自由流动概念相反)。换句话说,浮动元素从文档流中移除,但不像绝对定位元素那样从字面上删除,因为浮动元素仍然相对于它开始的任何行定位,并且它仍然占用文档流中的空间。那么,浮动元素悬挂的下一条“线”是如何确定的呢?在这个例子中,为什么 LI #3 不清除 LI #2,而 LI #5 是?

我不是在寻找什么:

通过更改标记、放弃浮动或使用 JavaScript 来使此布局工作的巧妙解决方案。我知道该怎么做。我只是希望以花车的神秘方式接受教育。

4

3 回答 3

4

它并没有你想象的那么神秘,你在 jsFiddle 中的图表实际上很好地说明了它。用语言解释可能很困难,但我会试一试:

本质上,1 向左浮动,2 向右浮动,然后 3 向左浮动并在 2 下向上移动,因为没有规则必须清除右侧。

当谈到 4,它浮动正确,有一个规则,因此你会看到一个硬中断是 2 下的 4 步。这开始了循环,因为 5 现在位于 4 旁边的位置,再次没有什么能阻止 6 从加入 4,因为它不必清除左侧。

7 必须低于 5 的原因与 4 必须低于 3 并再次离开的原因相同。正如评论中提到的,浮动元素不会将它们从流程中删除,这就是为什么您可以将imga浮动p而不是最终将照片放在页面顶部的部分原因,这个概念也可能真的对您有所帮助确切地了解发生了什么。

这有帮助还是只是让事情变得更加混乱?

于 2012-04-30T18:50:36.537 回答
3

CSS 2.1 规范

以下是控制浮动行为的精确规则:

1 左浮动框的左外边缘可能不在其包含块的左边缘的左侧。类似的规则适用于右浮动元素。

2 如果当前框是左浮动的,并且源文档中存在由更早的元素生成的左浮动框,那么对于每个这样的更早的框,当前框的左外边缘必须在前一个盒子的右外边缘,或者它的顶部必须低于前一个盒子的底部。类似的规则适用于右浮动框。

3 左浮动框的右外边缘不得位于其旁边的任何右浮动框的左外边缘的右侧。类似的规则适用于右浮动元素。

4 浮动框的外顶部不得高于其容纳块的顶部。当浮动出现在两个折叠边距之间时,浮动的位置就好像它有一个其他空的匿名块父级参与流一样。这种父级的位置由边距折叠部分中的规则定义。

5 浮动框的外部顶部不得高于源文档中较早元素生成的任何块或浮动框的外部顶部。

6 元素浮动框的外部顶部不得高于包含源文档中先前元素生成的框的任何行框的顶部。

7 一个左浮动框在其左侧有另一个左浮动框,其右外边缘可能不在其包含块的右边缘的右侧。(松散地说:左浮动可能不会突出在右边缘,除非它已经尽可能地向左。)类似的规则适用于右浮动元素。

8 浮箱必须放置在尽可能高的位置。

9 左浮箱尽量放在左边,右浮箱尽量放在右边。较高的位置优于更左/右的位置。

所以

如果第一个元素稍后在标记中定义,则浏览器似乎不希望元素的顶部出现在另一个元素的顶部之上。真的吗?

是的。上面的规则 5 和 6 涵盖了它。

于 2012-04-30T18:58:54.577 回答
0

安装 masonry JS 并将列设置为 1px,然后将边距设置为 2px 或 3px 或每个元素之间所需的空间。祝你好运!

http://masonry.desandro.com

于 2012-04-30T18:43:37.070 回答