浪人のサムライ

TOP

コンテナクエリでflexを使う

コンテナクエリでflexを使ってみます。完成はこちら。ウィンドウを伸縮させると、3つの写真が動きます。スマホでは縦並びです。

完成

HTML



<div class="wrapper">

  <div class="content">

  <div class="content__item">
  <figure><img src="images/cloud.JPG" /></figure>
  </div>

  <div class="content__item">
  <figure><img src="images/sakura.JPG" /></figure>
  </div>

  <div class="content__item">
  <figure><img src="images/yama.JPG" /></figure>
  </div>

  </div>

</div>


なんてことはない、HTMLです。wrapperで全体囲み、contentでitemを囲んでいます。wrapper→content→itemという流れです。

名前はCSSのルール内で自由に書いてOKです。分かりやすいものにしましょう。

CSS


.wrapper {
  container-type: inline-size;
}

.content {
  display: flex;
  flex-direction: column;
  gap: 10px;
}

@container (min-width:400px) {
  .content {
    flex-direction: row;
  }
  .content__item {
    width: calc(33.3333333333% - 10px);
    flex-grow: 1;
  }
}

wrapperにたいして、container-type: inline-sizeを書きます。これで設定が完了です。あとは、contentにflexを書きスマホでは縦並びにするので、flex-direction: columnを書きます。

@container (min-width:400px) {}内にCSSを書きます。ちなみに、flexの場合、横並びすると、画像の大きさが均等にならない場合があります。そこで、itemにたいして、widthを決めています。決め方はcalcを使っています。

便利ですね。電卓の必要がありません。

なお、min-widthは、画面サイズではなくて、コンテナのサイズです。混乱しがちですが、400pxにしておけば大体は、うまくいきます。もちろん、このサイトは、ですが。実際は数値の変更があるでしょう。

wrapperに書いている、container-type: inline-size;を、contentに書くとエラーが発生しました。contentにも親要素が必要なようです。

間違っているかもですが、実際、上のようにしないと無理でした。

ちなみに、flex-grow: 1;はgapでできる、1番、右端の余白をなくすものです。flexで気になる場合は、使うといいでしょう。

そもそも、space-betweenを使えばいいって話ですが(笑)。ここでは使いませんでした。正解は1つじゃないので、より良い方法を使うといいでしょう。

さいごに

今日はこれで1日を使いました。中々、勉強になりました。また1つ、賢くなりました。もちろん、このコードをコピペしても上手くいかないと思います。環境が異なるので当たり前です。

ヒントとして活用して頂ければ幸いです。