知っておくと便利なCSSの単位: コンテナクエリに基づく相対単位(cqw, cqh, cqi, cqb, cqmin, cqmaxなど)の便利な使い方を解説
Post on:2024年4月4日
CSSでよく使用する単位といえば、px
, r(em)
あたりでしょうか。CSSはそれら以外にもたくさんの単位が使用できます。
第3弾となる今回はコンテナクエリに基づく単位(cqw
, cqh
, cqi
, cqb
, cqmin
, cqmax
など)の便利な使い方を紹介します。
Container query length units -Going beyond pixels and (r)ems in CSS
by Brecht De Ruyte
第1弾・第2弾は、下記をご覧ください。
- フォントに基づく相対単位(em, rem, cap, ch, ex, ic, lhなど)の便利な使い方を解説
- ビューポートに基づく相対単位(vw, vh, lvh, svh, dvh, vb, viなど)の便利な使い方を解説
下記は各ポイントを意訳したものです。
※当ブログでの翻訳記事は、元サイト様にライセンスを得て翻訳しています。
はじめに
シリーズの第3弾となるこの記事では、コンテナに基づいた単位について解説します。はい、その通りです、ついにコンテナ要素に基づいた単位がすべてのブラウザで使用できるようになりました。これは個人的な感想ですが、コンテナクエリはまだ広く使用されていない思います。
参考: CSS コンテナクエリの準備はできてる? 安定版のブラウザにサポート、ポリフィルも大幅にアップデートされました
今回もこれまでと同様に、MDNのリストに基づいており、各単位の基本的なことだけでなく、より実践的な使い方まで解説します。
コンテナクエリの単位を使用するための基礎知識
まずは、対象となるコンテナが必要です。HTMLは下記の通りです。
1 2 3 |
<div class="container"> <div class="item">A cool container item</div> </div> |
次に、CSSでcontainer-type
を設定し、max-width
も設定しました。
1 2 3 4 |
.container { container-type: inline-size; max-width: 800px; } |
そして、ここからが重要な部分ですが、何が起きているのかを視覚化するためのスタイルを加えます。
1 2 3 4 5 6 7 8 9 10 11 12 |
.container { container-type: inline-size; max-width: 800px; width: 100%; text-align: center; border: 2px dotted #695958; } .item { background: #271f30; color: white; } |
これで準備は完了です、container-type
を設定し、基本的なスタイルを追加しました。次は、コンテナクエリの各単位について詳しく解説します。
CSSの単位: cqwとは
CSSのcqw
単位とは、コンテナ要素の幅を表す相対単位です。1cqw
はコンテナ要素の幅の1%に相当します。たとえば、コンテナの幅を100px
に設定すると、50cqw
は50px
になります。ビューポートに対する相対単位vw
単位とは対照的に、そのコンテナの幅に対する要素のサイズを定義することができます。ただし、ビューポートやフォントの単位と同様に、font-size
, width
, padding
, margin
などの<length>
値を受け入れるすべてのプロパティで使用できます。
デモには千の言葉以上に意味があるので、さっそく見てましょう。
前述のコンテナ内の.item
に以下のCSSでマージンを追加してみます。
1 2 3 4 |
.item { /* 前述のコードは略 */ margin: 5cqw; } |
これで.item
にはコンテナに基づいたマージンが設定されます。デモでコンテナのサイズを変更して試してみてください。
See the Pen
Basic container unit example by coliss (@coliss)
on CodePen.
続いて、他のプロパティにもcqw
単位を使って追加してみます。
1 2 3 4 5 |
.item { margin: 6cqw; padding: 1cqw; font-size: 5cqw; } |
max-width
値の異なるコンテナを追加すると、cqw
単位の挙動がよく分かると思います。もちろん、それぞれの幅を変更してその可能性を確認してみてください。
See the Pen
Margins, padding and font-size with container units by coliss (@coliss)
on CodePen.
親にcontainer-type
を設定しなかった場合は、どうなると思いますか?
その場合、コンテナクエリの単位はビューポート単位(この場合はvw
)にフォールバックします。
CSSの単位: cqhとは
CSSのcqh
単位とは、cqw
が幅を表すのと同様に、コンテナ要素の高さを表す相対単位です。1cqh
はコンテナ要素の高さの1%に相当します。たとえば、コンテナの高さを100px
に設定すると、50cqh
は50px
になります。
前述のデモをすこし変更して、.item
のCSSをcqh
単位に変更してみます。
1 2 3 4 5 6 |
.item { margin: 10cqh; padding: 10cqh; height: 80cqh; font-size: 12cqh; } |
しかし、これだけではあまり効果がありません。高さなので、ブロック軸を使用するにはcontainer-type
も変更する必要があります。
1 2 3 |
.container { container-type: size; } |
あとは、幅の代わりに、コンテナの高さも変更します。
1 2 3 4 5 6 7 8 9 10 11 |
.container { height: 100px; } .container-2 { height: 200px; } .container-3 { height: 100px; } |
これで、コンテナの高さが考慮されていることが分かります。
See the Pen
Container units based on height by coliss (@coliss)
on CodePen.
実践的な例は、次の2つの単位がもっとも重要であるため、そこで解説します。
CSSの単位: cqi, cqbとは
デフォルトで論理バリアントを使用するのは、とても良い習慣だと思います。私も論理バリアントをよく使用しますが、そのほとんどはRTLのライティングモードです。これはこの違いには当てはまりませんが、将来的に何が起こるかは分からないので、習慣にしておくのは良いことでしょう。
- CSSの
cpi
単位とは、コンテナ要素のインライン軸の1%を表す相対単位です。欧米言語は読み取り方向が左から右のため、水平方向になります。たとえば、コンテナのインラインサイズを100px
に設定すると、50cpi
は50px
になります。 - CSSの
cqb
単位とは、コンテナ要素のブロック軸の1%を表す相対単位です。欧米言語では垂直方向ですが、モンゴル語では読み取り方向が上から下のため、これは水平方向になります。たとえば、コンテナのブロックサイズを100px
に設定すると、50cqb
は50px
になります。
さっそく、実践的な例を見てましょう。
バナーをメインコンテンツからサイドバーに移動させ、それに基づいてサイズを調整するcqi
単位のデモページを実装します。
HTMLはメインコンテンツとサイドバーの2カラムのグリッドで、2つの子にcontainer-type
を与えます。
1 2 3 4 |
<div class="grid"> <main></main> <aside></aside> </div> |
1 2 3 4 5 6 7 |
.grid { display: grid; grid-template-columns: 2fr 1fr; > * { container-type: inline-size; } } |
次に、バナーを作成し、メインコンテンツに配置します。
1 2 3 4 5 6 7 8 9 10 11 |
<div class="grid"> <main> <div class="banner"> <h2>This is an awesome banner</h2> <p> Depending on the container, this will adjust its font-size and paddings to fit perfectly </p> </div> </main> <aside></aside> </div> |
インライン軸で作業をしたいので、cqi
単位を使ってバナーのスタイルを設定します。
1 2 3 4 5 6 7 8 9 10 11 |
.banner { padding: 3cqi; background: #55673e; font-size: 3cqi; border-radius: 0.5rem; } .banner h2 { font-size: 4cqi; margin: 0 0 1cqi; } |
これで準備は完了です。
さっそく、バナーをサイドバーにコピペしてみます。cqi
単位を使用すると、コンテナ要素に依存されるので下記のようにバナーのスタイルが変化します。
メインコンテンツとサイドバーに同じバナーを配置
実際の動作は、デモページでご覧ください。
※分かりやすくするため、スタイルをいくつか追加しています。
See the Pen
Multiple banners with container units by coliss (@coliss)
on CodePen.
メインコンテンツとサイドバーに配置された2つのバナーを比べると、padding
は問題ないですが、font-size
がサイドバーではすこし小さいようです。これはfont-size
に最小値と最大値を設定することで調整できます。そうです、前回の記事で解説した流動的なタイポグラフィのテクニックを使用します。
バナーのfont-size
の設定にclamp()
関数を使用してみます。
1 2 3 4 5 6 7 |
.banner { font-size: clamp(1rem, 2cqi + 0.5rem, 1.5rem); } .banner h2 { font-size: clamp(1.3rem, 3cqi + 0.5rem, 2.4rem); } |
最小値に1.3rem
、最大値に1.5rem
を設定しました。これによりルックアンドフィールが格段によくなります。
下記はこのアップデートをしたデモページです。
See the Pen
Banner with container units and clamp() function for font-sizes by coliss (@coliss)
on CodePen.
もちろん、font-size
だけでなく、margin
やpadding
にも適用できます。表示サイズを変更して、どのように動作するかご覧ください。
デモページのCSSには、コメントでwriting-mode: tb-rl;
があります。このコメントをはずして有効にすると、ライティングモードが変わり、別のレイアウトを見ることができます。
すべては論理的であることが重要です、CSSがおこなうことは奇跡であり、美しく、魔法のようです。
ライティングモードを変更した場合
cqbと宣言された高さ
ブロックサイズにコンテナクエリの単位を使用する場合、ちょっとした問題があります。その場合、コンテナは宣言された高さを持つ必要があるということです。ない場合は、オーバーフローしてしまいます。これは残念ながら、仕様における制限の一つです。
次の実践的な例は、小さなバナーを作成し、ブロックの高さに応じてfont-size
を設定します。
HTMLは、下記の通りです。
1 2 3 4 |
<section class="intro"> <h1>Be<br />Query</h1> <img src="..." alt="" /> </section> |
ビューポートの高さの80%
が必要ですが、別のページでは変更できるようにCSSを設定します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
.intro { display: flex; justify-content: space-between; container-type: size; background: rebeccapurple; block-size: 80dvb; } h1 { font-family: 'Oswald', sans-serif; font-size: clamp(1rem, 20cqb + 0.5rem, 10rem); padding: 2cqi; line-height: 1.2; } |
cqb
単位をclamp()
関数内でどのように使用したかに注目してください。実際の動作は、デモページでご覧ください。
See the Pen
cqb container unit example by coliss (@coliss)
on CodePen.
CSSの単位: cqmin, cqmaxとは
CSSのcqmin
単位とcqmax
単位は、コンテナ要素の幅と高さの両方に基づいて動的なサイズ設定ができる相対単位です。この2つの単位は、アスペクト比やコンテナの形状に適用するスタイルを定義できます。
- CSSの
cqmin
単位とは、cqi
(インラインサイズの1%)またはcqb
(ブロックサイズの1%)の小さい方の値を表します。たとえば、インラインサイズが100px
で、ブロックサイズが200px
の場合、50cqmin
は50px
になります。 - CSSの
cqmax
単位とは、cqi
またはcqb
の大きい方の値を表します。たとえば、インラインサイズが100px
で、ブロックサイズが200px
の場合、50cqmax
は100px
になります。
これらの単位は、ビューポートによってコンテナの形状が変化する場合に特に便利です。バナーの例でみてましょう。padding
にcqi
の代わりにcqmax
を使用して、ブロックサイズとインラインサイズの間の最大値を考慮してみます。
1 2 3 4 5 6 |
.banner { padding: 3cqmax; background: #55673e; font-size: clamp(1rem, 2cqi + 0.5rem, 1.5rem); border-radius: 0.5rem; } |
実際の動作は、デモページでご覧ください。
表示サイズを変更して、アスペクト比が変わるとどうなるか実感してみてください。
See the Pen
Using cqmax for paddings - resize for effect by coliss (@coliss)
on CodePen.
終わりに
2024年にデベロッパーが使いこなせるようになる必要がある単位は、このコンテナクエリの単位とそれに付随する単位でしょう。CSSを日常的に使用している場合は、将来のために備えておく必要があると思います。
私はすこし完璧主義なので、絶対単位を無視することはできませんが、ここまで解説した相対単位も楽しみたいと思います。
sponsors