Flexbox方向切り替えとコンテナクエリ

CSSコンテナクエリを使用して、コンテナの幅に基づいてFlexboxレイアウトをcolumnからrow方向に切り替え、コンポーネントレベルのレスポンシブデザインを実現します。

Component Patterns

詳細な説明

コンテナクエリによるFlexbox方向切り替え

最も一般的なレスポンシブパターンの1つは、縦(column)と横(row)レイアウトの切り替えです。コンテナクエリを使えば、コンポーネントの実際の利用可能スペースに基づいてこれを行えます。

CSS

.flex-container {
  container-type: inline-size;
  container-name: flex-area;
}

.flex-layout {
  display: flex;
  flex-direction: column;
  gap: 1rem;
}

@container flex-area (min-width: 500px) {
  .flex-layout {
    flex-direction: row;
    align-items: center;
  }
}

Column から Row へ

狭いコンテナでは、アイテムは縦に積み重なります。コンテナが500pxに達すると、アイテムは横に流れ、利用可能な幅をより有効に活用します。

実践例:ユーザープロフィール

@container flex-area (min-width: 500px) {
  .user-profile {
    flex-direction: row;
  }
  .user-profile .avatar {
    width: 80px;
    height: 80px;
  }
  .user-profile .info {
    flex: 1;
  }
}

ユーザープロフィールコンポーネントは、狭いコンテキストではアバターが名前の上に表示され、十分なスペースがある場合は横に表示されます。プロフィールウィジェットがどこにでも表示される可能性がある場合、ビューポートベースのメディアクエリでこれを確実に実現することは不可能です。

なぜflex-wrapだけでは不十分か

flex-wrap: wrapはアイテムを折り返しますが、レイアウトがいつ切り替わるか、ブレークポイントで何が変わるかを制御できません。コンテナクエリは、正確なコンテナ幅で任意のCSSプロパティを変更できます。

ユースケース

プロフィールカード、メディアオブジェクト(画像+テキスト)、機能セクション、またはスタックと横並びレイアウトを利用可能なスペースに基づいて切り替えるべきコンポーネントにこのパターンを使用してください。

試してみる — CSS Container Query Builder

フルツールを開く