container query

## 主な機能

container queryは、要素のstyleをその親コンテナのサイズに応じて適用させることができる
これにより、コンポーネント単位でデザインを行うことができる、また再利用性の向上やレイアウトとコンポーネントのstyleが完全切り離される
コンポーネントは基本的には全ての場所に配置が可能となり、容易にコンポーネントの配置箇所の変更が可能となる


## 具体的な使用例

![Frame 1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311059/892b86db-06b9-bc5d-2f8e-fc7918d81bbe.png)
![Frame 2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311059/b6632c66-1138-3159-6995-daa210a334b6.png)
![Frame 3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311059/865051c9-06d0-4148-6b3f-4b09a03fb4aa.png)
具体例として上記画像のように、ページによってレイアウトが変わる使い方が可能
TOPでは3カラムに配置し640px未満のレイアウトを適用、下層ページでは640px以上のレイアウトが採用される



## サンプルコード

```html
<!-- top.html -->
<ul className="top">
  <li className="top__list">
    <div className="block">
      <img className="block__img" src="example.jpg" alt="Example Image">
      <h2 className="block__title">Example Heading</h2>
      <p className="block__text">Example text</p>
    </div>
  </li>
  <li className="top__list">
    <div className="block">
      <img className="block__img" src="example.jpg" alt="Example Image">
      <h2 className="block__title">Example Heading</h2>
      <p className="block__text">Example text</p>
    </div>
  </li>
  <li className="top__list">
    <div className="block">
      <img className="block__img" src="example.jpg" alt="Example Image">
      <h2 className="block__title">Example Heading</h2>
      <p className="block__text">Example text</p>
    </div>
  </li>
</ul>

<!-- kasou.html -->
<ul className="kasou">
  <li className="kasou__list">
    <div className="block">
      <img className="block__img" src="example.jpg" alt="Example Image">
      <h2 className="block__title">Example Heading</h2>
      <p className="block__text">Example text</p>
    </div>
  </li>
  <li className="kasou__list">
    <div className="block">
      <img className="block__img" src="example.jpg" alt="Example Image">
      <h2 className="block__title">Example Heading</h2>
      <p className="block__text">Example text</p>
    </div>
  </li>
</ul>
```

```scss
// ページ用scss

// top.scss
.top {
  display: flex;
  flex-wrap: wrap;
  justify-content: space-between;

  &__list {
    flex: 0 0 33%;
    margin-bottom: 10px;
    container: layout / inline-size;

    @media (width < 640px) {
      flex-basis: 100%;
    }
  }
}

// kasou.scss
.kasou {
  display: flex;
  flex-wrap: wrap;
  justify-content: space-between;

  &__list {
    flex: 0 0 100%;
    margin-bottom: 10px;
    container: layout / inline-size;
  }
}
```

```scss
// コンポーネント用scss

// block.scss
.block {
  border: 1px solid #ddd;
  padding: 10px;

  &__img {
    width: 100%;
    aspect-ratio: 16 / 9;
    background-color: #ccc;
    display: block;
  }

  @container (width < 640px) {
    display: flex;
    flex-direction: column;
  }
  @container (width >= 640px) {
    display: grid;
    grid-template:
      "image title"
      "image text" /
      1fr 2fr;
    grid-gap: 10px;
    &__img {
      grid-area: image;
    }
    &__title {
      grid-area: title;
    }
    &__text {
      grid-area: text;
    }
  }
}

```
各ページ用のscssファイルにレイアウトの記述を持たせ、コンポーネント用のscssと完全に分離させる一例
※ サンプルではtop.scssとkasou.scssの記述が似通っているので助長に見えるが、重要なのはblockコンポーネントを配置するエリアの幅を、場所によってどのように設定しても最適なレイアウトでblockコンポーネントが表示されるという点になる

## 感想
レイアウトのstyleとコンポーネントのstyleが影響し合わないようにCSSの記述を考えなければならない。CSSの設計に気を使う必要があるが完全にstyleを切り離せるのはメリットとなるだろう