どうも、くまだです。
CSSのdisplay: contents;の使い方メモ。
【CSS】display: contents;の使いどころ
次のようなPCとSPの配置のとき、ボタンの位置がPCとSPで明らかに位置が違うときにdisplay: contents;を使います。
〇 PC時
〇 SP時
こういうデザインのときSPからコーディングしていて、PCレイアウトやるときに「なんでボタンがそこにいるねん…」という感想が出てくるんですがそこはグッとこらえます。
コードは下記になります。
<section class="p-section">
<div class="p-section__contents">
<div class="p-section__block">
<h2 class="c-title">見出し</h2>
<div class="p-section__button">
<a href="" class="c-button">ボタン</a>
</div>
</div>
<div class="p-section__content">
<div class="p-section__item">コンテンツ</div>
<div class="p-section__item">コンテンツ</div>
<div class="p-section__item">コンテンツ</div>
</div>
</div>
.p-section {
padding: 30px;
background-color: lightgray;
}
.p-section__item {
width: 100%;
height: 100px;
background: pink;
}
.p-section__item+.p-section__item {
margin-top: 16px;
}
.c-title {
font-size: 20px;
font-weight: 700;
}
.c-button {
background: orange;
padding: 8px 10px;
min-width: 120px;
display: inline-block;
}
.p-section__button {
margin-top: 20px;
}
.p-section__contents {
margin-top: 16px;
display: flex;
flex-direction: column;
}
.p-section__item {
width: 100%;
display: block;
}
.p-section__block {
margin-right: 30px;
display: contents;
}
.c-title {
order: 1;
}
.p-section__content {
width: 100%;
display: block;
order: 2;
}
.p-section__button {
order: 3;
}
@media screen and (min-width: 768px) {
.p-section__contents {
display: flex;
flex-direction: row;
}
.p-section__block {
display: block;
}
}
見出しとボタンを格納しているp-section__block要素に、display:contents;を指定。
display:contents;を指定すると、その要素はDOMツリーから削除されます。(子要素に影響ありません)
<div class="p-section__block"> <!-- ←このタグが削除される -->
<h2 class="c-title">見出し</h2><!-- ←子要素に影響はない -->
<div class="p-section__button">
<a href="" class="c-button">ボタン</a>
</div>
</div><!-- ←このタグが削除される -->
イメージとしては、p-section__blockがなくなった状態になります↓
<section class="p-section">
<div class="p-section__contents">
<h2 class="c-title">見出し</h2>
<div class="p-section__button">
<a href="" class="c-button">ボタン</a>
</div>
<div class="p-section__content">
<div class="p-section__item">コンテンツ</div>
<div class="p-section__item">コンテンツ</div>
<div class="p-section__item">コンテンツ</div>
</div>
</div>
あとは、p-section__contentsにFlexBoxを指定し、見出しやボタンにorderプロパティを指定して順番を並べ替えます。
ちなみにこのやり方をしない場合は、ボタンを2つ用意してSPとPCでボタンを表示・非表示切り替えるか、positionプロパティで無理やりそこに配置するか、ぐらいの方法になるかと思います。
ここまで読んでくださりありがとうございました。