はじめに
レスポンシブデザインを実装する上で、CSSの単位選択は非常に重要な要素です。同じ数値でも使用する単位によって、デバイスの画面サイズやユーザーの設定に応じた挙動が大きく異なります。
「なぜ16pxと1remは同じサイズなのに使い分けが必要なのか」「vwと%はどちらを使うべきか」といった疑問を持つ方は多いのではないでしょうか。これらの疑問に答えるためには、各単位の特性と適切なユースケースを理解する必要があります。
本記事では、CSSの単位について以下の内容を解説します。
- 絶対単位と相対単位の違いと特徴
remとemの使い分けと実践例- ビューポート単位(
vw、vh、vmin、vmax)の活用法 clamp()関数による流動的サイジングの実装- 実務で使える単位選択の判断基準
前提条件
本記事を読み進めるにあたり、以下の知識があることを前提としています。
- HTMLとCSSの基本構文
- CSSプロパティの基本的な使い方
- レスポンシブデザインの基本概念(メディアクエリなど)
動作確認環境
- Google Chrome 131以降
- Firefox 133以降
- Safari 18以降
- Microsoft Edge 131以降
CSSの単位を理解する
CSSで使用できる長さの単位は、大きく絶対単位と相対単位の2種類に分類されます。
flowchart TB
subgraph units["CSSの長さ単位"]
direction TB
subgraph absolute["絶対単位"]
px["px(ピクセル)"]
cm["cm(センチメートル)"]
mm["mm(ミリメートル)"]
pt["pt(ポイント)"]
end
subgraph relative["相対単位"]
subgraph font["フォント相対単位"]
rem["rem"]
em["em"]
ch["ch"]
end
subgraph viewport["ビューポート単位"]
vw["vw"]
vh["vh"]
vmin["vmin"]
vmax["vmax"]
end
subgraph other["その他"]
percent["%(パーセント)"]
end
end
end絶対単位とは
絶対単位は、外部の要因に関係なく常に同じサイズを維持する単位です。
| 単位 | 名称 | 説明 |
|---|---|---|
px |
ピクセル | 画面上の1ピクセル(96dpiで1/96インチ) |
cm |
センチメートル | 物理的な長さ(1cm = 96px/2.54) |
mm |
ミリメートル | 1cm = 10mm |
in |
インチ | 1in = 2.54cm = 96px |
pt |
ポイント | 1pt = 1/72インチ |
Web開発で主に使用される絶対単位は**px(ピクセル)**です。他の単位(cm、mm、ptなど)は印刷用途で使われることがありますが、画面表示ではpxが標準的に使用されます。
|
|
相対単位とは
相対単位は、他の値を基準としてサイズが決定される単位です。基準となる値が変化すると、相対単位で指定されたサイズも連動して変化します。
|
|
相対単位を使用することで、レスポンシブデザインの実装が容易になります。画面サイズやユーザー設定に応じて自動的にサイズが調整されるためです。
絶対単位:pxの特徴と使いどころ
pxの基本
pxはWeb開発で最も広く使用されている単位です。ピクセルという名前ですが、実際にはデバイスの物理ピクセルとは異なるCSSピクセルを指します。
|
|
pxを使用するべき場面
pxは以下の用途で使用することが推奨されます。
| 用途 | 理由 |
|---|---|
ボーダー(border) |
1pxの線は明確に見える必要があるため |
シャドウ(box-shadow) |
影のぼかし具合を正確に制御するため |
| 極小の装飾要素 | スケールすると見えなくなる可能性があるため |
| メディアクエリのブレークポイント | デバイスの画面幅を正確に判定するため |
|
|
pxのデメリット
pxには以下のデメリットがあります。
- ユーザーのフォントサイズ設定を無視する: ブラウザの設定でフォントサイズを変更しても、
pxで指定された要素は変化しない - スケーラビリティがない: 画面サイズに応じて自動調整されない
- アクセシビリティの問題: 視覚に困難を抱えるユーザーがテキストサイズを変更できない
|
|
フォント相対単位:remとem
remの基本
rem(root em)は、ルート要素(<html>)のフォントサイズを基準とする単位です。ブラウザのデフォルトでは、ルート要素のフォントサイズは16pxに設定されています。
|
|
remの最大の利点は、ルートのフォントサイズを変更するだけで、すべてのrem指定要素が比例してスケールする点です。
|
|
emの基本
emは、親要素のフォントサイズを基準とする単位です。これがremとの最大の違いです。
|
|
上記の例のように、emはネストするごとに累積的にサイズが変化します。この特性は意図的に活用することもできますが、予期しない結果を招くこともあります。
remとemの使い分け
remとemの使い分けは、以下の指針に基づいて判断します。
| 用途 | 推奨単位 | 理由 |
|---|---|---|
| フォントサイズ | rem |
一貫したスケーリングを保証 |
| マージン・パディング(グローバル) | rem |
ページ全体で一貫した間隔を維持 |
| コンポーネント内の間隔 | em |
フォントサイズに連動した間隔が必要な場合 |
| メディアオブジェクトの装飾 | em |
テキストサイズに比例させたい場合 |
以下は、emが効果的に機能するコンポーネントの例です。
|
|
flowchart LR
subgraph rem["remを使う場面"]
A["フォントサイズ"]
B["ページ全体のマージン"]
C["メディアクエリの値"]
end
subgraph em["emを使う場面"]
D["コンポーネント内のパディング"]
E["アイコンサイズ"]
F["ボタンの角丸"]
endアクセシビリティとrem
remを使用することで、アクセシビリティが向上します。ユーザーがブラウザの設定でフォントサイズを変更した場合、remで指定された要素はその設定を尊重してスケールします。
|
|
ビューポート単位:vw・vh・vmin・vmax
ビューポート単位の基本
ビューポート単位は、ブラウザの表示領域(ビューポート)のサイズを基準とする単位です。
| 単位 | 基準 | 説明 |
|---|---|---|
vw |
ビューポートの幅 | 1vw = ビューポート幅の1% |
vh |
ビューポートの高さ | 1vh = ビューポート高さの1% |
vmin |
幅と高さの小さい方 | 1vmin = min(vw, vh) |
vmax |
幅と高さの大きい方 | 1vmax = max(vw, vh) |
|
|
vwとvhの活用例
フルスクリーンセクション
|
|
ビューポート幅に応じたフォントサイズ
|
|
ただし、vw単独でフォントサイズを指定すると問題が発生します。
|
|
この問題は後述するclamp()関数で解決できます。
vminとvmaxの活用例
vminとvmaxは、デバイスの向き(縦向き・横向き)に関係なく一貫したサイズを維持したい場合に有効です。
|
|
モバイルブラウザでのvhの問題と解決策
モバイルブラウザでは、アドレスバーの表示/非表示によってビューポートの高さが変化するため、100vhが期待通りに動作しないことがあります。
|
|
この問題に対処するため、新しいビューポート単位が導入されました。
| 単位 | 説明 |
|---|---|
svh |
Small viewport height(アドレスバー表示時のビューポート高さ) |
lvh |
Large viewport height(アドレスバー非表示時のビューポート高さ) |
dvh |
Dynamic viewport height(動的に変化するビューポート高さ) |
|
|
パーセント単位(%)
パーセント単位の基本
パーセント単位は、親要素のサイズを基準として計算されます。ただし、プロパティによって何を基準とするかが異なります。
| プロパティ | 基準 |
|---|---|
width |
親要素の幅 |
height |
親要素の高さ |
padding |
親要素の幅(上下左右すべて) |
margin |
親要素の幅(上下左右すべて) |
font-size |
親要素のフォントサイズ |
line-height |
要素自身のフォントサイズ |
|
|
heightに%を使用する際の注意点
heightにパーセントを使用する場合、親要素に明示的な高さが設定されている必要があります。
|
|
|
|
レスポンシブレイアウトでのパーセント活用
|
|
clamp()関数による流動的サイジング
clamp()関数の基本
clamp()関数は、最小値、推奨値、最大値の3つの引数を取り、値を特定の範囲内に制限します。
|
|
clamp(MIN, VAL, MAX)は、max(MIN, min(VAL, MAX))と等価です。推奨値が最小値と最大値の間にある場合はその値が使用され、範囲外の場合は最小値または最大値が適用されます。
|
|
流動的タイポグラフィの実装
clamp()を使用することで、メディアクエリなしで流動的に変化するフォントサイズを実装できます。
|
|
推奨値の計算式
clamp()の推奨値には、vwと固定値を組み合わせた計算式を使用することが一般的です。
|
|
計算式を設計する際のポイントは以下の通りです。
vwの係数が大きいほど、変化が急激になる- 固定値(
remなど)を加えることで、最小サイズを保証 - 最小値と最大値で安全な範囲を設定
clamp()の活用例
流動的な余白
|
|
コンテナの幅
|
|
流動的なギャップ
|
|
実践的な単位選択ガイド
プロパティ別推奨単位
以下の表は、各プロパティで推奨される単位をまとめたものです。
| プロパティ | 推奨単位 | 理由 |
|---|---|---|
font-size |
rem、clamp() |
アクセシビリティと一貫性 |
line-height |
単位なし(1.5など) | フォントサイズに比例 |
width(コンテナ) |
%、clamp() |
レスポンシブ対応 |
max-width |
rem、px |
読みやすさの上限を設定 |
padding、margin |
rem、em |
一貫した間隔 |
border |
px |
細い線を明確に表示 |
border-radius |
rem、em、% |
スケーラブルな角丸 |
box-shadow |
px、rem |
影の精密な制御 |
決定フローチャート
単位選択の判断フローを以下に示します。
flowchart TD
A["サイズを指定したい"] --> B{"ユーザー設定に<br/>応じてスケールすべき?"}
B -->|Yes| C{"要素のフォントサイズに<br/>連動すべき?"}
B -->|No| D["px を使用"]
C -->|Yes| E["em を使用"]
C -->|No| F{"ビューポートに<br/>応じて変化すべき?"}
F -->|Yes| G{"最小・最大値の<br/>制限が必要?"}
F -->|No| H["rem を使用"]
G -->|Yes| I["clamp() を使用"]
G -->|No| J["vw/vh を使用"]実践例:完全なコンポーネント
以下は、さまざまな単位を適切に組み合わせたカードコンポーネントの例です。
|
|
まとめ
本記事では、CSSの単位について以下の内容を解説しました。
- **絶対単位(px)**は、ボーダーやシャドウなど、スケールが不要な細かい装飾に使用します
- remは、フォントサイズやページ全体の間隔など、一貫したスケーリングが必要な場面で使用します
- emは、コンポーネント内でフォントサイズに連動させたい要素に使用します
- **ビューポート単位(vw、vh)**は、画面サイズに応じた動的なサイズ指定に使用しますが、単独使用には注意が必要です
- clamp()関数を使用することで、最小値と最大値を設定した流動的なサイジングを実現できます
適切な単位を選択することで、アクセシビリティに配慮し、さまざまなデバイスに対応したレスポンシブデザインを効率的に実装できます。実際のプロジェクトでは、本記事で紹介した判断基準を参考に、各プロパティに最適な単位を選択してください。