【CSS】px / % / rem / em / vw の違い【図解】

どうも、くじらいどです。

CSSの数字のうしろに付いてる px とか rem とか vw。なんとなく px だけ使ってる人、けっこう多いと思います。

これ、全部「何を基準にした長さか」が違うだけなんですよね。そこさえわかれば、使い分けはそんなに難しくないと思います。

この記事では px / % / em / rem / vw の違いを、実際に動く例を見ながら整理したいと思います。

くじらいど

AIにコードを書いてもらっても「なんでここremなの?」がわからないと直せないんですよね。ここは押さえておくとラクです。


目次

結論:違いは「何を基準にするか」だけ

先に全体像の表を出しておきます。

単位読み方基準にするものひとことで
pxピクセル基準を持たない(固定値)親や画面に左右されない固定値
%パーセント親要素親のサイズに対する割合
emエム文字サイズ(font-sizeは親)入れ子にすると膨らむ
remレムページ全体の文字サイズ入れ子にしても膨らまない
vw / vhブイダブリュー / ブイエイチ画面(ウィンドウ)の幅・高さ画面サイズに連動する

▼ 基準の位置を図にするとこうなります

画面(ウィンドウ)= vw / vh の基準
html(ページ全体)= rem の基準
親要素 = % の基準
この要素自身 = em の基準

px は基準を持たない固定値(=この図の外)

ここから1つずつ見ていきます。

px|固定の長さ

一番わかりやすい単位です。16px と書いたら、どこに書いても16px。親も画面サイズも関係ありません。

.box {
  width: 200px;
  font-size: 16px;
}

▼ 表示例

200px 固定

画面を狭くしても広くしても、この幅は変わらない

確実に思ったとおりになるのがメリットです。デメリットは、ブラウザの「既定の文字サイズ」設定を大きくしても追従しづらいこと。ページ全体を拡大するズーム(Ctrl+)なら px でも大きくなりますが、文字サイズだけを上げる設定には反応しにくい、という意味です。目が悪い人向けの配慮としては、そこが弱点になります。

なので枠線やアイコンのような「変わってほしくないもの」はpx、文字サイズはpx以外、というのが今の主流です。

%|親要素に対する割合

%は親要素のサイズを基準にした割合です。親が400pxなら、50%は200pxになります。

▼ 表示例(外枠が親)

親要素(幅100%)
width: 50%
width: 25%

親の幅が変われば、中身も一緒に変わる

Point

%は「何の%か」がプロパティによって違います。width は親の幅、font-size は親の文字サイズ、height は親の高さ。ちなみに padding や margin は上下でも親の幅が基準になります(ここが引っかかりポイント)。

「height: 100% が効かない」もこれが原因です。親に高さが指定されていないと、100%の計算元がないので無視されます。

em|文字サイズ基準(入れ子で膨らむ)

em は文字サイズを基準にした単位です。ただし「どの要素の文字サイズを1にするか」がプロパティによって変わります。padding など font-size 以外はその要素自身の文字サイズ、font-size に使ったときだけ親要素の文字サイズが基準になります。

たとえば文字サイズが16pxの要素なら、padding: 2em は32px(自分基準)。一方 font-size: 2em はの文字サイズの2倍です。

この「font-size だけ親が基準」という性質がクセもので、次のように入れ子にすると効いてきます。

.item {
  font-size: 1.5em;   /* 親の1.5倍 */
}

これを入れ子にすると、1.5倍の1.5倍の1.5倍…とどんどん膨らんでいきます。

▼ 表示例(1.5em を3重に入れ子にした場合)

1階層目(1.5em = 24px)
2階層目(36px)
3階層目(54px)

入れ子にするたびに1.5倍される(16→24→36→54px)

くじらいど

「なぜかこの部分だけ文字がめちゃくちゃデカい」の犯人はだいたいこれです。

ただしこの性質、ボタンの内側の余白には便利です。padding を em にしておくと、文字を大きくしたときに余白も一緒に大きくなって、バランスが崩れません。

rem|ページ全体の文字サイズ基準(膨らまない)

rem は em の「膨らむ」問題を解決した単位です。基準が親ではなくhtml要素(ページ全体)の文字サイズに固定されています。

ブラウザの初期設定では html は16pxなので、1rem = 16px。どこに書いても変わりません。

▼ 表示例(さっきと同じく3重に入れ子。今度は1.5rem)

1階層目(24px)
2階層目(24px)
3階層目(24px)

何重に入れ子にしても24pxのまま

rem の一番のメリットは読者がブラウザの文字サイズを変えたときに、ページ全体がきれいに拡大されることです。html の文字サイズが基準なので、そこが変われば rem で書いた部分は全部一緒に変わります。

なので、文字サイズは基本 rem にしておくのが良いと思います。

rempx換算(html=16pxのとき)
0.875rem14px
1rem16px
1.25rem20px
1.5rem24px
2rem32px

em と rem の使い分け

 emrem
基準自分の文字サイズ(font-sizeのみ親)html の文字サイズ
入れ子膨らむ膨らまない
向いてる用途ボタンの余白・アイコンの大きさなど「文字に連動させたいもの」文字サイズ・全体の余白

vw / vh|画面サイズ基準

vw は画面(ウィンドウ)の幅を100とした単位です。vh は高さ版。

  • 100vw = 画面の幅いっぱい
  • 50vw = 画面の幅の半分
  • 100vh = 画面の高さいっぱい(スクロールなしで1画面ぶん)

▼ 表示例(ブラウザの幅を変えると、この帯の長さも変わります)

width: 50vw
width: 25vw

親の幅ではなく「画面の幅」が基準なのがポイント

「画面いっぱいのメインビジュアル」みたいなときに使います。

Point

100vw には縦スクロールバーの幅も含まれます。そのため width: 100vw と書くと、環境によっては横スクロールバーが出てしまうことがあります。単に横幅いっぱいにしたいだけなら width: 100% のほうが安全です。

結局どれを使えばいいのか

迷ったときの目安がこちらです。

指定したいものおすすめの単位理由
文字サイズrem読者の文字サイズ設定に追従できる
余白(margin・padding)rem全体で単位を揃えられる
ボタンの内側の余白em文字サイズに連動して自然に伸びる
枠線・角丸px拡大されると不自然。固定でいい
カラムの幅% または fr親に合わせて伸縮させたい
画面いっぱいの高さvhファーストビューを作るとき
くじらいど

ざっくり「文字と余白はrem、線はpx」だけ覚えておけば、だいたい困らないと思います。

まとめ

  • 違いは「何を基準にした長さか」だけ
  • px=固定値、%=親、em=文字サイズ(font-sizeは親)、rem=ページ全体の文字サイズ、vw/vh=画面
  • em は入れ子にすると膨らむ。rem は膨らまない
  • 1rem = 16px(ブラウザ初期設定の場合)
  • 文字サイズは rem にすると、読者の文字拡大に対応できる
  • height: 100% が効かないのは、親に高さがないから
  • width: 100vw は横スクロールが出ることがある。100% を使う

単位は暗記するものというより、「これは何を見て伸び縮みするのか」を1回理解すれば終わりの話です。ここがわかっていると、AIが書いたコードを読んだときに「あ、ここremだから全体拡大に対応してるのね」と意図が読めるようになると思います。

以上、くじらいどでした!

あわせて読みたい

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

アラサー社会不適合者の くじらいど です。
喘息・アトピー・鼻炎持ち。
趣味は絵を描くこと。

「失敗と後悔の海」を超えて、
自分の人生を描いています。

コメント

コメントする

目次