MENU

【CSS】display: contents; を使用してカードレイアウトを作成する

display: contents; を使用してカードレイアウトを作成する

PC表示とSP表示でカードレイアウトが変わるときどうすれば良い???

というわけで今回はdisplay: contents;を使用してPC表示とSP表示のときの違ったレイアウトを作成してみたいと思います。

目次

PC表示とSP表示でカードレイアウトが変わるときの実装

PC表示とSP表示でカードレイアウトが変わるとき

上記のようなPCとSPでレイアウトが変わることはよくあると思います。
ですが、今回の場合はどうHTMLを組みますか??

良くある実装方法は下記の方法だと思います↓

全体を囲っているwrapperに「display: flex;」を指定して、bodyimageの要素を横並びにします。
これで簡単にレイアウトできますが、次にSP表示の方を見てください。

タイトルとテキストの間に画像を入れ込みたいのですが、
タイトルとテキストはbodyで囲われている為、その間にimageで囲われている画像を入れ込むことができません。

方法としては、あらかじめbodyのタイトルとテキストの間に画像を入れておいて、
pc表示のときはdiplay: none;で消しておき、sp表示のときにdisplay: block;にする方法。

これでも実装できますが、あまりスマートではありません。
HTMLもごちゃごちゃして、保守性もよくなさそうですね。

そこでHTMLを触らずしてCSSだけで対応できる方法が「display: contents;」です

「display: contents;」を使用する

では実際に「display: contents;」を使ってみましょう!
まずはPC表示のカードレイアウトを見てみましょう。

See the Pen ブログ用 display-content-pc by そす (@Sosgoyo) on CodePen.

青の四角は画像の代わりとして見ておいてください。
まあ良くあるカードのレイアウトです。上記で示した例と同じ構図ですね!
続いてsp表示のカードレイアウトのコードになります。

See the Pen ブログ用 display-content-sp by そす (@Sosgoyo) on CodePen.

HTMLはどちらも一緒です。
CSSを見比べてみましょう。

【CSS PC表示】

.wrapper {
  margin-top: 50px;
  width: 500px;
  display: flex;
  padding: 40px 20px;
  border:1px solid black;
}

.body {
  width: 300px;
  padding: 20px;
}

.title {
  text-align: center;
  font-size: 24px;
}

.text {
  margin-top: 20px;
}

.image {
  width: 200px;
  height: 200px;
  background-color: blue;
}
【CSS SP表示】

.wrapper {
  margin-top: 50px;
  width: 300px;
  display: flex;
  flex-direction: column;
  padding: 40px 20px;
  border:1px solid black;
}

.body {
  padding: 20px;
  display: contents;
  
}

.title {
  text-align: center;
  font-size: 24px;
  order:1;
}

.text {
  width: 300px;
  margin-top: 20px;
  order:3;
}

.image {
  margin-top: 20px;
  margin-inline: auto;
  width: 200px;
  height: 200px;
  background-color: blue;
  order:2;
}

ここでポイントとなるのが「display: contents;」「order」です。
では、順番に説明していきましょう!

display: contents;について

では早速今回の目玉、「display: contents;」について説明します。
display: contents;」で指定した要素はボックスを生成しません。
borderを指定すると分かりやすいですが、基本的に要素は四角いボックスで生成されています。
そのボックスを生成しなくなることで、親要素のボックスに依存することができるようになります。

似たように要素を消す方法として「display: none;」がありますが、こちらは要素の中身も消してしまうので
使い分けが必要ですね。

では、今回の対象を確認するためにもう一度下記をご覧下さい↓

PCとSPのレイアウト説明

bodyの要素に割り込ませたいので、bodyに指定すればよさそうですね!
そうすると、タイトルとテキストと画像が横並びになります。
(親要素のwrapperにdisplay: flex;を指定しているため)

そこで、sp表示のwrapperには「flex-direction: column;」で縦並びにします。
そうすると、タイトル⇒テキスト⇒画像の順に縦並びになります。

次は「order」を使って順番を指定してみましょう!

「order」を使用して順番を決める

「order」は、フレックスコンテナーやグリッドコンテナーの中でアイテムを並べる順序設定します。
「order」の使い方は「z-index」と同じで、若い番号ほど序列が前になります。

今回のCSSを抜粋して見てみましょう。

.title {
  text-align: center;
  font-size: 24px;
  order:1;
}

.text {
  width: 300px;
  margin-top: 20px;
  order:3;
}

.image {
  margin-top: 20px;
  margin-inline: auto;
  width: 200px;
  height: 200px;
  background-color: blue;
  order:2;
}

タイトル⇒order:1; テキスト⇒order: 3; 画像⇒order: 2; と指定していますね!

これで望み通り、カードレイアウトを実装できました!!

まとめ

というわけで今回はdisplay: contents;を使用してPC表示とSP表示のときの違ったレイアウトを作成してみました!
実案件でも頻出のレイアウトですので、是非使いこなしていきましょう!!

よかったらフォローしてね!!
  • URLをコピーしました!
  • URLをコピーしました!
目次