1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

container query

Last updated at Posted at 2023-04-05

主な機能

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

具体的な使用例

Frame 1.png
Frame 2.png
Frame 3.png
具体例として上記画像のように、ページによってレイアウトが変わる使い方が可能
TOPでは3カラムに配置し640px未満のレイアウトを適用、下層ページでは640px以上のレイアウトが採用される

サンプルコード

<!-- 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

// 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

// 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を切り離せるのはメリットとなるだろう

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?