6

これは結果を見ないと説明が難しいかもしれませんので、以下の例をご覧ください。

JSFiddle の例 1 - 問題ないように見える
JSFiddle の例 2 - 壊れている

フィドルからのコード:

HTML:

<ul id="homepage-grid">
        <li id="tile11" class="col1 row1 sizex1 sizey1">
            <a href="#" title="test">
                <img src="http://placehold.it/295x160" alt="test" title="test" style="width: 295px;height: 160px" />
            </a>
        </li>
        <li id="tile8" class="col2 row1 sizex2 sizey1 last">
            <a href="#" title="test">
                <img src="http://placehold.it/602x160" alt="test" title="test" style="width: 602px;height: 160px" />
            </a>
        </li>
        <li id="tile1" class="col1 row2 sizex1 sizey1">
            <a href="#" title="testing">
                <img src="http://placehold.it/295x160" alt="testing" title="testing" style="width: 295px;height: 160px" />
            </a>
        </li>
        <li id="tile4" class="col2 row2 sizex2 sizey1 last">
            <a href="#" title="test3">
                <img src="http://placehold.it/602x160" alt="test3" title="test3" style="width: 602px;height: 160px" />
            </a>
        </li>
        <li id="tile10" class="col1 row3 sizex1 sizey2">
            <a href="#" title="test">
                <img src="http://placehold.it/295x332" alt="test" title="test" style="width: 295px;height: 332px" />
            </a>
        </li>
        <li id="tile12" class="col2 row3 sizex1 sizey2">
            <a href="#" title="test">
                <img src="http://placehold.it/295x332" alt="test" title="test" style="width: 295px;height: 332px" />
            </a>
        </li>
        <li id="tile2" class="col3 row3 sizex1 sizey1 last">
            <a href="#" title="testing2">
                <img src="http://placehold.it/295x160" alt="testing2" title="testing2" style="width: 295px;height: 160px" />
            </a>
        </li>
        <li id="tile9" class="col3 row4 sizex1 sizey1 last">
            <a href="#" title="test">
                <img src="http://placehold.it/295x160" alt="test" title="test" style="width: 295px;height: 160px" />
            </a>
        </li>
    </ul>

CSS:

#homepage-grid {
    width:910px;
    position:relative;
    padding:0;
    overflow: hidden;
}

#homepage-grid li {
    list-style:none;
    float:left;
    padding:0 12px 12px 0;
    display:block;
}

#homepage-grid li.last {
    list-style:none;
    float:left;
    padding:0 0 12px 0;
}

#homepage-grid li a {
    display:block;
}

基本的に私が作成したいのは、データベースによって生成される動的グリッドです (データベース部分は現時点では正常に動作します)。グリッドでは、各タイルは最大 3 列の幅にまたがることができますが、無制限の行にまたがることができるため、問題が発生しているようです。

非常に動的なものの HTML/CSS に問題があります。ご覧のとおり、例 1 から例 2 への 1 つの小さな変更により、左下のタイルを押し上げてスペースを埋め、右のタイルを上に移動してそのスペースを埋める必要があるため、グリッドの大部分が壊れています。

ただし、コードを完全に制御できるので、必要に応じて HTML/CSS を変更できます (つまり、クラス/インライン スタイルなどを追加するなど)。

これは、表を使用すると (比較的) 簡単に機能すると思いますが、表形式のコンテンツではないため、実際にはその道をたどりたくありません。

CSS をこれほど動的にする方法はありますか?
これを実現するには、さらにインライン スタイルを使用する必要がありますか?
フローティングではなく絶対配置など、別の方法で行う必要がありますか?

これを達成する方法についての助けをいただければ幸いです。

4

5 に答える 5

2

私の最初の考えは、のをに設定することheightでし#title12160pxが、その下の要素が同じである場合、これは機能しませんwidth

代わりに、次のことを試してみてください。

グリッドの各「行」の高さが固定されていると仮定して、<div>...</div>または同様のブロック要素でラップしますheight:160px;(または適切なサイズですが、すべてのdiv「行」で同じにします)。

最初の行を画像の最初の行で埋めます。2番目(およびそれ以降)の行については、各「セル」がその前の行と重なっているかどうかを判別します。heightその場合は、必要な行とwidth列のサイズを持つ空のブロック要素で構成される「フィラー」ブロックを追加します。

これにより、<li>...</li>アイテムがdiv「行」を下の行にオーバーフローさせることができます(オーバーフローはvisibleデフォルトで設定されているため)。空のブロック要素は、次の行が前の行からのオーバーフローと重なるのを防ぎます。

このアプローチの欠点は次のとおりです。

  • HTMLがやや醜くなります。
  • 実際のテーブルの代わりに使用する価値があるようにするには、おそらくテーブルに非常に似ています。
  • サーバー側で追加の作業が必要になります。

編集:また、<div>リスト内では許可されていないため、各行内でリストを開始/停止する必要があります。<ul> </ul>または、。の代わりに行としてを使用することもできます<div>

于 2013-03-05T05:28:23.403 に答える
1

わかりました、これは単なる考えです。最大 3 列で行の高さが固定されていると仮定すると、1 列あたりの超過行数を格納する配列を作成し、負の margin-top またはクラスを追加して、特定の数の行を「引き上げる」ことができます。例えば:

最初に、列ごとの行のプールは、2 行のアイテムを追加した後です。3 行と 2 行の高さのアイテムをさらに 2 つ追加[0][0][0]するようなものです 。次に配置されるアイテムは、最初の最も短い列に配置する必要があります。この例では 1 列 (3 - 2) の最大値から最小値を引いた差によってプルアップされます。追加された要素が 2 行の高さの場合、プールは次のアイテムになり、一番右の列に配置されます。 3行(5 - 2)引き上げられました。[2][0][0][2][3][2][5][3][2]

それで全部です!一見するとうまくいくように見えますが、十分にテストしていません。

于 2013-03-08T08:48:19.403 に答える
1

フロートでこの問題に遭遇するでしょう。ただし、そのページの 1 つの要素の配置を変更すると、すべてが期待どおりの場所に配置されます。

更新されたフィドル

以下を CSS に追加します。

#homepage-grid li#tile10 {
    position: absolute;
    top: 342px;
}

これにより、問題のある要素がドキュメント フローから切り離され、残りのリスト項目に適用される「フロート」によって垂直方向のスペースが割り当てられなくなります。最後のアイテムは右にフロートされるため、絶対位置のタイルと重なることはありません。

編集

以下のコメントによると、これを行うにはもう少し柔軟な方法があります。この例は、投稿されたコードで機能します。

更新されたフィドルで行われた仮定:

  1. sizex1、sizey1、sizex2 などは定数値です。
  2. これらの右側のコンテンツが右にフロートされること (これは左にフロートされたアイテムの場合は逆に機能しますが、これらのシナリオは問題ではないように思われます。左側の要素が縦に大きい)
  3. ユーザーは、スタイルをオーバーライドしたり、レイアウトの作成時にスタイルを適用したりできます。これは主に、position: absolute特定の要素に不必要に適用されないように制御するためのものです。

これが何をするか:

この CSS は、特定のクラスを持つ兄弟の存在に基づいて異なるルールを設定します。sizex1 sizex2 sizey1これが、との値の不変性sizey2が重要である理由です。

CSS:

#homepage-grid li.col1:not(.row1):not(.row2) {
    position: absolute;
}
#homepage-grid li.col1.sizey1.row1 ~ li.col1.row2 { /* The first column of the first row has a sizey of 1 */
    top: 172px;
}
#homepage-grid li.col1.sizey2.row1 ~ li.col1.row2{ /* The first column of the first row has a sizey of 2 */
    top: 342px;
}
#homepage-grid li.col1.sizey1.row1 ~ li.col1.sizey1.row2 ~ li.col1.row3 { /* The first column of the first row has a sizey of 1 and the first column of the first row has a sizey of 1 */
    top: 344px;
}
#homepage-grid li.col1.sizey2.row1 ~ li.col1.sizey2.row2 ~ li.col1.row3{ /* The first column of the first row has a sizey of 2 and the first column of the second row has a sizey of 2 */
    top: 684px;
}
#homepage-grid li.col1.sizey2.row1 ~ li.col1.sizey1.row2 ~ li.col1.row3,
#homepage-grid li.col1.sizey1.row1 ~ li.col1.sizey2.row2 ~ li.col1.row3 { /* The first column of the first row has a sizey of 2 and the first column of the second row has a sizey of 1, or vice versa */
    top: 514px;
}

理想的には、#homepage_grid li.col1ページ配信時に値を設定する必要があります。こうすることで、正しい間隔を維持するためにドキュメント フローから分割するタイルを選択できます。通常は:not()セレクターを使用してこれを実現しますが、古いブラウザーとの互換性を探している場合は、オーバーライドを簡単に使用できます。

例:

#homepage-grid li.col1:not(.row1):not(.row2) {
    position: absolute;
}

*上記は、行 3 以上のみをドキュメント フローから分割します。

#homepage-grid li.col1 {
  position: absolute;
}
#homepage-grid li.col1.row1, #homepage-grid li.col1.row2 {
  position: static;
}

これは上記と同じことを達成しますが、より冗長です。ただし、標準に準拠していないブラウザでも適切に表示されます。

EDIT 2 わかりやすくするために、jQuery を使用してページの読み込み時に適切な要素を静的に設定する例を次に示します。

別のフィドルの例

于 2013-03-08T15:51:20.603 に答える
0

ネスティングが可能なグリッド システムが必要です。

次に、グリッドのレイアウトで完全な行を検索します。

次に、すべての行で完全な列などを検索します。

于 2013-03-08T15:46:21.427 に答える
-1

Masonryのような JavaScript プラグインを使用することを強くお勧めします。

于 2013-03-06T21:37:24.387 に答える