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;
}​

これがフィドルです。

ゴール:

奇数番号のリスト アイテムはすべて左にフロートし、2 ピクセルの余白を除いて隙間なく積み重ねます。右にフロートする必要があることを除いて、偶数番号のリスト項目にも同じことが当てはまります。

一言で言えば質問:

この例では、LI #5 が LI #4 の上に表示されず、LI #8 が LI #7 の上に表示されない正確な理由について、私は混乱しています。つまり、LI #5 が LI #2 をクリアし、LI #8 が LI #5 をクリアするのはなぜですか? また、LI #3 が LI #2 をクリアしないのはなぜですか?

TL;DR

これまでの私の考えは、やや決定的ではありません。最初の要素がマークアップで後で定義されている場合、ブラウザは要素の上部が別の要素の上部に表示されることを望んでいないようです。本当?

フロート要素は線上に配置され、その線に収まらないフロート要素は新しい線にジャンプしてそこから流れることを理解しています (絶対配置要素のフリーフローの概念とは対照的に)。言い換えれば、フロート要素はドキュメント フローから削除されますが、絶対配置要素ほど文字どおりではありません。フロート要素は、それが開始されたどの行に対しても相対的に配置され、ドキュメント フロー内のスペースを占めるためです。では、浮動要素がぶら下がっている次の「行」はどのように決定されるのでしょうか? この例では、LI #3 が LI #2 をクリアしないのに、LI #5 がクリアするのはなぜですか?

私が探していないもの:

マークアップを変更するか、フロートを放棄するか、JavaScript を使用することで、このレイアウトを機能させる賢い解決策です。私はそれをすべて行う方法を知っています。フロートの神秘的な方法を教えてもらいたいだけです。

4

3 に答える 3

4

それはあなたが思っているほど神秘的ではなく、jsFiddle の図は実際にそれをかなりよく示しています。言葉で説明するのは難しいかもしれませんが、試してみます。

基本的に、1は左に浮き、2は右に浮き、3は左に浮き、2の下に移動します。これは、右をクリアしなければならないというルールがないためです。

右に浮く 4 になると、ルールがあり、2 の下に 4 の移動があった場合にハード ブレークが発生します。5 が 4 の隣に位置するため、サイクルが最初からやり直され、再び 6 の移動を止めるものは何もありません。左をクリアする必要がないため、4 に参加します。

4 が 3 未満でなければならないのと同じ理由で、7 は 5 未満でなければなりません。コメントで述べたように、フローティング要素はフローからそれらを削除しません。これが、ページの上部に写真が表示されない理由の一部です。imgこのp概念も本当に役立つかもしれません何が起こっているのかを正確に理解してください。

それはまったく役に立ちますか、それとも物事をより混乱させるだけですか?

于 2012-04-30T18:50:36.537 に答える
3

CSS 2.1仕様から:

フロートの動作を管理する正確なルールは次のとおりです。

1左フローティングボックスの左外縁は、それを含むブロックの左端の左側にあってはなりません。同様のルールが右フローティング要素にも当てはまります。

2現在のボックスが左フローティングで、ソースドキュメントの前の要素によって生成された左フローティングボックスがある場合、そのような前のボックスごとに、現在のボックスの左外縁が前のボックスの右外縁、またはその上部が前のボックスの下部よりも低くなければなりません。同様のルールが右フローティングボックスにも当てはまります。

3左フローティングボックスの右外縁は、その隣にある右フローティングボックスの左外縁の右側にあることはできません。同様のルールが右フローティング要素にも当てはまります。

4フローティングボックスの外側の上部は、それを含むブロックの上部より高くすることはできません。フロートが2つの折りたたみマージンの間に発生すると、フロートは、フローに参加している他の点では空の匿名ブロックの親を持っているかのように配置されます。そのような親の位置は、証拠金の崩壊に関するセクションの規則によって定義されます。

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 に答える