【css】Flexboxで「折り返し」レイアウトを作り、リンクを右下に固定する方法

ECサイトの商品一覧やブログのアーカイブページを作る際、以下のようなレイアウト実装で悩んだことはありませんか?

  1. カードを横並びにして、画面端に来たら自動で折り返したい。
  2. カードの中身(商品名や価格)の長さが違っても、リンクボタンは常に「右下」に揃えたい。

これらは、Flexboxのflex-wrap(折り返し)と、position: absolute(絶対配置)を組み合わせることで、美しく解決できます。

今回は、親要素と子要素それぞれにFlexboxを適用し、思い通りのグリッドレイアウトを作るコードを解説します。

親要素(.wrap):Flexboxで「折り返し」を指定する

まず、カードを包む大枠(親要素)の設定です。 通常、display: flex; を指定しただけだと、子要素は一行に無理やり詰め込まれてしまいます。

そこで、flex-wrap: wrap; を記述して、「入り切らなくなったら次の行へ」という折り返し指示を出します。

実装コード(親要素)

.wrap {
    display: flex;
    flex-direction: row; /* 左から右へ並べる */
    flex-wrap: wrap;     /* 折り返しを有効にする */
    gap: 20px;           /* カード間の余白(任意) */
}

flexの並びを指定するプロパティ一覧

迷った時のためのチートシートです。

プロパティ値動き
row左から右に並べる(初期値)
row-reverse右から左に並べる
column上から下に並べる
column-reverse下から上に並べる
nowrap折り返さない(初期値・一行に収める)
wrap折り返す
wrap-reverse逆方向に折り返す

子要素(.box):カード内のレイアウトと「基準点」

次に、個々のカード(子要素)の設定です。 ここでもレイアウト調整のために display: flex; を使いつつ、中のリンクボタンを絶対配置するための基準点として position: relative; を指定します。

実装コード(子要素・孫要素)

/* カード本体 */
.box {
    position: relative; /* リンクを配置するための基準点 */
    display: flex;      /* 画像とテキストを横並びにする時などに使用 */
    flex-direction: column; /* 縦積みにする場合 */
    width: 300px;       /* 任意の幅 */
    height: 400px;      /* 任意の高さ */
    border: 1px solid #ccc;
    padding-bottom: 50px; /* リンクボタンが被らないように余白を確保 */
}

/* 右下に固定したいリンクボタン */
.link a {
    position: absolute; /* 親(.box)を基準に配置 */
    right: 0;           /* 右端に揃える */
    bottom: 0;          /* 下端に揃える */
    display: block;     /* リンクをブロック要素にする */
    padding: 10px 20px;
    background: #333;
    color: #fff;
}

全体のHTML構造イメージ

このCSSを適用するHTMLは以下のようになります。

<div class="wrap">
    <div class="box">
        <img src="product.jpg" alt="商品画像">
        <h3>商品タイトル(長くてもOK)</h3>
        <p>¥1,000</p>
        <div class="link">
            <a href="#">詳細を見る</a>
        </div>
    </div>
    
    <div class="box">
        </div>
    </div>

まとめ ECサイト制作の鉄板パターン

  • 大枠(.wrap): flex-wrap: wrap; で商品をタイル状に並べる。
  • 個別の枠(.box): position: relative; で基準点を作る。
  • ボタン(.link a): position: absolute; で右下に固定する。

この3点セットは、レスポンシブデザインでスマホ表示にする際も(flex-directionを調整するだけで済むため)非常に管理しやすい記述です。 レイアウト崩れにお悩みの際は、ぜひこの基本形を見直してみてください。