CSSのサイズ関数:calc()、min()、max()、clamp()とビューポート単位

CSSサイズ関数ラボ

CSSのcalc()、min()、max()、clamp()、vhとdvh、fit-content | We.Inc

ビューポート幅のスライダーを動かすと、calc()、min()、max()、clamp()が実際のピクセル値に変わる様子を確認できます。さらにvhとsvh、lvh、dvhの違い、fit-contentとmin-contentの実演、gap、可変フォントサイズのレシピも紹介します。

CSSの数学関数を使うと、1つの値を画面サイズに合わせて変化させられます。calc()を使うと、calc(100% - 2rem)のように異なる単位を1つの式の中で組み合わせられます。min()は候補の中で最も小さい値を選ぶので、width: min(100%, 640px)と書けば要素がはみ出すことはありません。max()は反対に最も大きい値を選びます。clamp(最小値, 推奨値, 最大値)は、画面に合わせて変化する値を、決めた下限と上限の間に収めます。また動的な単位であるdvhは、従来の単位とは違って、モバイルブラウザーで伸び縮みするツールバーの動きに追従します。

目的別に、どの関数を使えばよいか

数式の動きを試すために、ブラウザーのウィンドウを何度もリサイズする必要はもうありません。疑似的なビューポート幅をスライダーで動かすだけで、それぞれの関数がその場でピクセル値に変わり、clamp()が上限や下限に達する位置にも印が付きます。このページではさらに、スマートフォンの画面上でビューポート単位の4種類がそれぞれどの範囲を測っているかを図で示し、内在的なサイズを表すキーワードが実際のボックスでどう働くかも確認できます。

よくある質問

vh、svh、lvh、dvhの違いは何ですか?

スマートフォンでは、スクロールに合わせてブラウザーのツールバーが表示されたり隠れたりします。svhはツールバーが表示された状態の小さいビューポートの1%で、lvhはツールバーが隠れた状態の大きいビューポートの1%です。dvhはその時点の状態に合わせて変わり、スクロールするたびに更新されます。従来の単位は通常、大きいビューポートと同じ値になります。そのため100vhのセクションはモバイルで下が切れてしまうのです。

clamp()、min()、max()はどのブラウザーでも使えますか?

はい。この3つの関数は、2020年以降、主要なすべてのブラウザーで問題なく動作しています。一方、小さい・大きい・動的なビューポート単位は少し遅れて2022年中に登場しましたが、現在では主要なブラウザーのすべてに搭載されています。古い端末もサポートする必要がある場合は、その前の行に従来の単位を使った代替の指定を書いておきましょう。

clamp()で可変のフォントサイズを書くには?

まず、狭い画面のときと広い画面のときの文字サイズをそれぞれ決めます。次に、clamp(小, 推奨値, 大)という形で書きます。推奨値には1rem + 2vwのように、ルート基準の単位と画面幅基準の単位を組み合わせた値を使います。こうすると、ウィンドウの幅に合わせて文字が大きくなりながらも、決めた下限と上限の間に必ず収まります。下のラボを使えば、上限や下限が効き始める正確な画面幅を確認できます。

fit-contentは何をしますか?

width: fit-contentを指定すると、ボックスの幅がコンテンツの大きさに合わせられます。中身にぴったり縮むインラインブロックのような動きですが、使える幅より広くなることはありません。これはmin(max-content, max(min-content, available space))と同じ意味です。グリッドのトラックで使う同名の関数は、自分で決めた上限を使って同じことを行います。

要素間の間隔の指定はflexboxでも使えますか?

はい。gap、row-gap、column-gapは、グリッドだけでなく現在のすべてのブラウザーのフレックスコンテナでも使えます。間隔は要素と要素の間にだけ追加され、外側の端には付きません。子要素の一つひとつにマージンを付けて調整するよりも、ずっとシンプルに書けます。

calc()が値を決める仕組み

内在的なサイズ:min-content、max-content、fit-content

文字だけでなく余白も可変に

vhとsvh、lvh、dvhの違い

ビューポートに対する割合で表す単位

モバイル端末でも安全に画面の高さいっぱいに広がるヒーロー

1行目は、新しいビューポート単位にまだ対応していないブラウザーのための代替の指定です。新しい単位に対応しているブラウザーでは、2行目がその値を上書きします。

calc()、min()、max()、clamp()の使用例

メディアクエリを使わずに作る、読みやすい段組み

最小値を選ぶ関数で幅の上限を決め、パディングには最大値を選ぶ関数を使って12pxより小さくならないようにしています。どちらのルールも、メディアクエリに頼らず、それぞれ単独でフレームの幅に合わせて変化します。

固定幅のサイドバーと可変幅のメインエリアを計算式で並べる

メインエリアは、全体の幅から120pxのサイドバーと12pxの間隔を差し引いた、残りの幅をすべて使って表示されます。

min-content、max-content、fit-content

コンテンツから決まる内在的なサイズを表すキーワード

フレックスとグリッドでのgap

折り返すフレックスの行とグリッドで同じ間隔を使う

行方向と列方向の間隔は、それぞれ別々の値に設定できます。どちらの場合も、外側の端には余白が追加されません。

可変の文字サイズと余白のスケール

カスタムプロパティを使って作る、小さな可変スケール

スケールの各段階は、幅がおよそ360pxのスマートフォンから1280pxのデスクトップまでの間で、少しずつ大きくなります。上のラボを使って、数値を自由に調整してみてください。

ビューポートラボ

疑似ビューポート幅(px)

{px}pxでの可変見出し

疑似的な幅での計算結果

関数

宣言

{vp}pxのとき

clampの最小値(rem)

clampの最大値(rem)

推奨値:remの部分

推奨値:vwの部分

最大値が最小値より小さいため、どの幅でも最小値が使われます。

幅がおよそ{from}pxになるまでは{min}remのまま、およそ{to}pxまで大きくなり、その後は{max}remで止まります。

画面幅基準の部分がないため、ウィンドウの幅が変わっても値は変わりません。

コピー

スマートフォンで各単位の100が覆う範囲

3台のスマートフォン:100svhは表示されたツールバーの間の領域を埋め、100lvhはツールバーが隠れたときのように画面全体を埋め、100dvhはツールバーの変化に追従します

ツールバー表示

ツールバー非表示

ツールバーに追従

灰色の帯はブラウザーのツールバーを表しています。青い部分は、100単位が埋める範囲です。

コンテンツに合わせたサイズの実演

幅のキーワード

使える幅(px)

今週末は、すべてのご注文が送料無料になります

無料で始める · クレジットカード不要

関連: ガイド|Webマーケティングと集客を学ぶ

製品

ご利用いただける方

機能

リソース

会社情報

サイトマップを見る