CSSHTMLweb制作コーディング

flexを使ったホースシューレイアウトのコーディング

CSS

先輩!自分のコーダー人生は終わりました!

こんなコーディング不可能のカードパターンは無理です

■ ■ ■
 ■ ■

終わらない!人の夢は終わらないぞ!

これはホースシュー配置だね!正式な名前はないけど、他にもダイヤモンド配置、クロス配置とか呼んでる人もいるね!

今回はこのホースシュー配置のコーディングをやってみよう!

今回のゴール!

<!DOCTYPE html>
<html lang="ja">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>ホースシュー配置</title>
  <link rel="stylesheet" href="riset.css">
  <link rel="stylesheet" href="style.css">
</head>

<body>
  <div class="cards">
    <div class="card">
      <img class="card__img" src="https://placehold.jp/040005/ffffff/150x150.png" alt="">
      <div class="card__content">
        <h2 class="card__cardtit">タイトル</h2>
      </div>
      <div class="card__cardtxt">
        <p>
          ダミーテキストダミーテキストダミーテキストダミーテキストダミーテキストダミーテキスト
        </p>
      </div>
    </div>
    <div class="card">
      <img class="card__img" src="https://placehold.jp/040005/ffffff/150x150.png" alt="">
      <div class="card__content">
        <h2 class="card__cardtit">タイトル</h2>
      </div>
      <div class="card__cardtxt">
        <p>
          ダミーテキストダミーテキストダミーテキストダミーテキストダミーテキストダミーテキスト
        </p>
      </div>
    </div>
    <div class="card">
      <img class="card__img" src="https://placehold.jp/040005/ffffff/150x150.png" alt="">
      <div class="card__content">
        <h2 class="card__cardtit">タイトル</h2>
      </div>
      <div class="card__cardtxt">
        <p>
          ダミーテキストダミーテキストダミーテキストダミーテキストダミーテキストダミーテキスト
        </p>
        <div class="card__cardlink">
          <a href="">もっと見る</a>
        </div>
      </div>
    </div>
    <div class="card">
      <img class="card__img" src="https://placehold.jp/040005/ffffff/150x150.png" alt="">
      <div class="card__content">
        <h2 class="card__cardtit">タイトル</h2>
      </div>
      <div class="card__cardtxt">
        <p>
          ダミーテキストダミーテキストダミーテキストダミーテキストダミーテキストダミーテキスト
        </p>
      </div>
    </div>
    <div class="card">
      <img class="card__img" src="https://placehold.jp/040005/ffffff/150x150.png" alt="">
      <div class="card__content">
        <h2 class="card__cardtit">タイトル</h2>
      </div>
      <div class="card__cardtxt">
        <p>
          ダミーテキストダミーテキストダミーテキストダミーテキストダミーテキストダミーテキスト
        </p>
      </div>
    </div>
  </div>
</body>

</html>
.cards {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
}

.card__inner {
  padding-right: 1.5rem;
  padding-left: 1.5rem;
}

@media screen and (min-width: 767px) {
  .card__inner {
    max-width: 1200px;
  }
}

.card__img {
  width: 100%;
  max-width: 100%;
  -o-object-fit: cover;
  object-fit: cover;
}

.textsvg-reason {
  width: 11rem;
  margin: 0 auto;
  display: block;
}

.card__content {
  width: 100%;
  margin-top: 3rem;
  text-align: center;
  display: flex;
  justify-content: left;
  align-items: center;
}

@media screen and (min-width: 767px) {
  .card__content {
    margin-top: 1rem;
  }
}

.card__tit {
  font-size: 3rem;
  font-weight: 700;
  letter-spacing: 2.25;
  text-align: center;
  color: #252b43;
}

.card__tit span {
  display: block;
  font-size: 1.5rem;
  font-weight: 700;
  letter-spacing: normal;
  color: #000;
}

.card__cardtit {
  font-size: 1.9rem;
  font-weight: 700;
  line-height: 1.53;
  color: #252b43;
  margin-top: 0.8rem;
  text-align: left;
  margin-top: 0;
  flex: 1;
  letter-spacing: 0.05em;
}

@media screen and (min-width: 767px) {
  .card__cardtit {
    text-align: center;
  }
}

.card__cardtxt {
  font-size: 1.6rem;
  font-weight: 500;
  line-height: 1.63;
  text-align: left;
  color: #000;
  margin-top: 3rem;
}

.card {
  background-color: #f9f6f0;
  width: 100%;
  margin-top: 6rem;
}

@media screen and (min-width: 767px) {
  .card {
    width: 30%;
    margin: 2rem;
  }
}

.card__cardlink {
  margin-top: 2.8rem;
  font-size: 1.6rem;
  font-weight: 700;
  line-height: 2;
  color: #252b43;
  text-align: center;
}

.card__cardlink a {
  border-bottom: 1px solid #252b43;
  position: relative;
}

flexレイアウトを組む

テキストや画像の設定以外の、レイアウトの構成をメインに解説していきます。

先程のコードを抜粋して部分でみていきましょう。

.cards {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
}

  .card__inner {
    max-width: 1200px;
  }

.cardsはカード全体を囲っている親要素であり、ここにdisplay:flex;を設定することで、子要素のカードを横に配置していきます。

今回は子要素のカードが親要素の.card__innerの幅、1200pxを超えた分だけ、折り返すように設定するために、flexと合わせてflex-wrap: wrap;を設定します。

全体を中央に寄せるためにjustify-content: center;を配置します。

現状、このように横並びで折り返し、中央に全て寄ってるかと思います。

カードとカードの間に余白を取る

ここから実際に各カードの間に余白(margin)をとっていきましょう。

余白の取り方は子要素へmarginを指定する方法と親要素にgapを指定する方法があります。

子要素にmarginをとる方法

  .card {
    width: 30%;
    margin: 2rem;
  }

こちらはカードに直接marginを指定し余白を調整するやり方です。
下記のgapと違い、子要素のカードをnth-of-typeなどで個別で指定することで、カード1枚ごとに余白数を指定できます。

親要素にgapをつける方法

.cards {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  gap: 2rem;
}

こちらは親要素に一括指定することで、まとめて余白を指定することが可能でとても便利ですが、2024年3月時点で一部ブラウザに対応していないため、推奨はされておりません。

ここまでで、見本のレイアウトが完成します。

親要素に全体のレイアウトのルールを設定し、子要素でカードとカードの距離を調整する方法となります。

まとめ

いかがでしたでしょうか?

このレイアウトは筆者が苦戦した記憶が強く残っており、ぜひやり方を共有したいと思い、記載させていただきました。

参考になれば幸いです。

タイトルとURLをコピーしました