首先,这个例子只能在支持的浏览器中运行: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;
}
这是小提琴。 http://jsfiddle.net/bryandowning/HNY9r/
Goal:
所有奇数列表项都应向左浮动并堆叠在一起,除了 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;DR
到目前为止,我的想法还有些不确定。如果第一个元素是稍后在标记中定义的,那么浏览器似乎不希望一个元素的顶部出现在另一个元素的顶部上方。真的吗?
我知道浮动元素放置在一条线上,任何不适合该线的浮动元素都会跳到新线并从那里流动(与绝对定位元素的自由流动概念相反)。换句话说,浮动元素已从文档流中删除,但并不像字面上的绝对定位元素那样,因为浮动元素仍然相对于它起始的任何行进行定位,并且它仍然占用文档流中的空间。那么,浮动元素悬挂的下一条“线”是如何确定的呢?在此示例中,为什么 LI #3 没有清除 LI #2,而 LI #5 却清除了?
我不是在寻找什么:
这是一个聪明的解决方案,可以通过更改标记、放弃浮动或使用 JavaScript 来使此布局发挥作用。我知道如何做到这一切。我只是希望接受关于漂浮的神秘方式的教育。