コンテナ船のイラスト

コンテナ要素に基づく相対的な CSS の単位(cqw, cqh, cqi, cqb, cqmin, cqmax)

コンテナクエリ単位とは、コンテナ要素に基づいてスタイルを定義するための相対的な長さを表す単位です。例えば `1cqw` はコンテナ要素の幅の 1% に相当します。

コンテナクエリ(@container)とは、親コンテナ要素に基づいてスタイルを定義できる CSS の機能です。メディアクエリ(@media)では画面全体の幅に応じてスタイルを変更する必要がありましたが、コンテナクエリでは任意の要素に基づいたスタイルを適用できるため、より柔軟なレイアウトの実現が可能です。

.card {
  display: grid;
  grid-template-columns: 1fr;
}
 
@container (min-width: 600px) {
  /* カードの親要素の幅が 600px 以上の場合、2 列に変更 */
  .card {
    display: grid;
    grid-template-columns: 1fr 1fr;
  }
}

コンテナクエリを使用してスタイルを適用する場合、コンテナクエリ単位を使用できます。コンテナクエリ単位は、親コンテナ要素に対する相対的な長さを表す単位です。コンテナクエリ単位は以下の 6 つが定義されています。

  • cqw:コンテナ要素の幅(width)のパーセンテージ。1cqw はコンテナ要素の幅の 1% に相当する。
  • cqh:コンテナ要素の高さ(height)のパーセンテージ。1cqh はコンテナ要素の高さの 1% に相当する。
  • cqi:コンテナ要素のインラインサイズのパーセンテージ。1cqi はコンテナ要素のインラインサイズの 1% に相当する。
  • cqb:コンテナ要素のブロックサイズのパーセンテージ。1cqb はコンテナ要素のブロックサイズの 1% に相当する。
  • cqmin:コンテナ要素のインラインまたはブロックサイズの小さい方の値のパーセンテージ。
  • cqmax:コンテナ要素のインラインまたはブロックサイズの大きい方の値のパーセンテージ。
インラインサイズ、ブロックサイズとは

インラインサイズ、ブロックサイズとは CSS の論理プロパティ における概念です。簡単に説明すると、インラインサイズは幅(width)に、ブロックサイズは高さ(height)に対応します。

論理プロパティは言語表記方向(LTR または RTL)に依存してレイアウトを制御するという目的で導入されました。例えば、英語のような左から右に書かれる言語では、leftstart に、rightend に対応しています。反対にアラビア語のような右から左に書かれる言語では、leftend に、rightstart に対応しています。

論理プロパティは言語表記方向(LTR または RTL)に依存してレイアウトを制御するという目的で導入されました。例えば、英語のような左から右に書かれる言語では、leftinline-start に、rightinline-end に対応しています。反対にアラビア語のような右から左に書かれる言語では、leftinline-end に、rightinline-start に対応しています。

縦書きの文章においては inlineblock の意味が入れ替わることには注意が必要です。縦書きの場合、inline は垂直方向を指し、block は水平方向を指します。つまり、縦書きの場合、inline-size は高さ(height)を、block-size は幅(width)を指すことになります。

横書きの文章の場合には、将来の多言語対応に備えて、普段から論理プロパティを使用することが好ましいでしょう。

コンテナクエリ単位を使用することで、コンテナ要素の具体的なサイズに依存せずにスタイルを適用できるため、コンテナ要素を気にせずに柔軟に使用できます。コンテナクエリ単位の使用例を見ていきましょう。

コンテナクエリ単位の使用例

コンテナクエリを使用できるようにするために、コンテナ要素を定義する必要があります。

以下の HTML において、.container 要素がコンテナ要素と定義する例を示します。

<div class="container">
  <div class="box">This is a super cool box!</div>
</div>

コンテナ要素を定義するためには CSS の container-type プロパティを使用します。container-type プロパティは以下の値を指定できます。

  • size:コンテナクエリはインラインいおよびブロックサイズに基づいて適用される
  • inline-size:コンテナクエリはインラインサイズに基づいて適用される
  • normal:基本値(通常動作)
.container {
  container-type: inline-size;
}

コンテナ要素を定義したら、.box 要素にコンテナクエリを使用してスタイルを適用します。

.box {
  /* コンテナ要素のインラインサイズの 80% */
  font-size: 5cqi;
}

以下のデモでは、width がそれぞれ異なる .container 要素に対して、.box 要素の文字の大きさが変化していることが確認できます。

まとめ

  • コンテナクエリ単位はコンテナ要素に基づいてスタイルを定義するための相対的な長さを表す単位
  • コンテナクエリ単位は以下の 6 つが定義されている
    • cqw:コンテナ要素の幅(width)のパーセンテージ
    • cqh:コンテナ要素の高さ(height)のパーセンテージ
    • cqi:コンテナ要素のインラインサイズのパーセンテージ
    • cqb:コンテナ要素のブロックサイズのパーセンテージ
    • cqmin:コンテナ要素のインラインまたはブロックサイズの小さい方の値のパーセンテージ
    • cqmax:コンテナ要素のインラインまたはブロックサイズの大きい方の値のパーセンテージ
  • コンテナクエリ単位を使用するためには、コンテナ要素を定義する必要がある
  • コンテナ要素を定義するためには、container-type プロパティを使用する

参考

記事の理解度チェック

以下の問題に答えて、記事の理解を深めましょう。

コンテナクエリ単位の説明として誤っているものはどれか?

  • cqw はコンテナ要素の幅(`width`)のパーセンテージを表す

    もう一度考えてみましょう

  • cqh はコンテナ要素の高さ(`height`)のパーセンテージを表す

    もう一度考えてみましょう

  • cqi はコンテナ要素のインラインサイズのパーセンテージを表す

    もう一度考えてみましょう

  • cqb はコンテナ要素のボーダーボックスのパーセンテージを表す

    正解!

    cqb はコンテナ要素のブロックサイズのパーセンテージを表します。

コンテナ要素を定義するために使用する CSS プロパティはどれか?

  • container-type

    正解!

  • container

    もう一度考えてみましょう

  • container-query

    もう一度考えてみましょう

  • container-size

    もう一度考えてみましょう

  • container-width

    もう一度考えてみましょう

コンテナ要素の width が 800px のとき、`5cqi` は何ピクセルに相当するか?

  • 5px

    もう一度考えてみましょう

  • 40px

    正解!

    5cqi はコンテナ要素のインラインサイズの 5% に相当するため、800px の 5% は 40px です。

  • 800px

    もう一度考えてみましょう

  • 400px

    もう一度考えてみましょう


Contributors

> GitHub で修正を提案する
この記事をシェアする
はてなブックマークに追加

関連記事