rem と em は「どこを基準にサイズが決まるか」が違うだけ
でも、この違いを理解すると タイポグラフィ設計が一気に安定 します。
rem → ルート(html)のフォントサイズを基準にする
em → その要素自身 or 親要素のフォントサイズを基準にする
この“基準の違い”が、使い分けのすべてです。
ここからは、初心者でも迷わないように
CSS と Tailwind CSS の両方で、例題を交えて丁寧に解説します。
rem:常に「html の font-size」を基準にする
rem の特徴をかみ砕くと
- どこで使っても 同じ基準
- 親の影響を受けない
- レスポンシブ設計と相性が良い
- 文字サイズ・余白・レイアウトの“統一感”が出る
つまり、「全体のスケールを揃えたいとき」 に最適です。
CSS 版:rem の基本例
html {
font-size: 16px; /* 1rem = 16px */
}
h1 {
font-size: 2rem; /* 32px */
}
p {
font-size: 1rem; /* 16px */
margin-bottom: 1.5rem; /* 24px */
}
CSSどこに書いても 1rem は 16px。
親要素の font-size が変わっても影響されません。
Tailwind 版(Tailwind は rem ベース)
Tailwind のサイズはすべて rem で設計されています。
<h1 class="text-4xl">見出し</h1>
<p class="text-base mb-6">本文テキスト</p>
HTMLtext-base→ 1remtext-4xl→ 2.25remmb-6→ 1.5rem
Tailwind を使う=rem を自然に使っている、ということです。
em:その要素 or 親の font-size を基準にする
em の特徴をかみ砕くと
- 親の font-size によって 相対的に変わる
- ネストするとどんどん倍率がかかる
- コンポーネント単位のスケール調整に便利
- ただし、意図せずサイズが膨らむ“em 地獄”に注意
つまり、「コンポーネント内で相対的に調整したいとき」 に向いています。
CSS 版:em の基本例
.card {
font-size: 1rem; /* 16px */
}
.card h2 {
font-size: 1.5em; /* 24px(1.5 × 16px) */
}
.card small {
font-size: 0.875em; /* 14px(0.875 × 16px) */
}
CSSここでのポイントは
em は「その要素の親の font-size」を基準にする ということ。
em が“暴走”する例(初心者がハマりやすい)
.parent {
font-size: 1.2em; /* 1.2 × 親の親 */
}
.child {
font-size: 1.2em; /* 1.2 × 1.2 × 親の親 = 1.44倍 */
}
CSSネストが深いと、意図せずサイズがどんどん大きくなります。
これが「em 地獄」と呼ばれる現象です。
Tailwind で em を使う場合
Tailwind は基本 rem ですが、任意値で em を使えます。
<p class="text-[1.2em]">
親のサイズに比例して大きくなるテキスト
</p>
HTMLただし、Tailwind では em を使う場面は少なく、
ほとんどの場合 rem(デフォルトのユーティリティ)で十分です。
rem と em の使い分け(ここが一番大事)
rem を使うべき場面
- ページ全体の文字サイズ
- 余白(margin / padding)
- レイアウト(width / height)
- Tailwind のユーティリティを使うとき
- レスポンシブでスケールさせたいとき
理由:基準がブレないので、デザインが安定する
em を使うべき場面
- コンポーネント内で相対的にサイズを変えたい
- ボタン内のアイコンサイズを文字に合わせたい
- line-height をフォントサイズに比例させたい
- メディアクエリをフォントサイズ基準にしたい
理由:親のサイズに応じて自然にスケールする
例1:ボタン内のアイコンは em が最適
CSS 版
.button {
font-size: 1rem;
padding: 0.75em 1.5em;
}
.button svg {
width: 1em;
height: 1em;
}
CSSボタンの font-size を変えると、
アイコンも自動でスケールします。
Tailwind 版
<button class="text-base px-[1.5em] py-[0.75em] flex items-center gap-2">
<svg class="w-[1em] h-[1em]" ...></svg>
ボタン
</button>
HTMLアイコンが文字サイズに比例して大きくなるので、
UI の一貫性が保たれます。
例2:カードコンポーネントは rem で安定させる
CSS 版
.card {
padding: 1.5rem;
border-radius: 0.75rem;
}
.card h3 {
font-size: 1.25rem;
}
.card p {
font-size: 1rem;
}
CSSコンポーネントの外側の影響を受けず、
どこに置いても同じ見た目になります。
Tailwind 版
<div class="p-6 rounded-xl">
<h3 class="text-xl font-semibold mb-2">タイトル</h3>
<p class="text-base text-gray-600">説明テキスト</p>
</div>
HTMLTailwind のユーティリティはすべて rem なので、
自然と「安定したコンポーネント」になります。
例3:メディアクエリは em が便利(上級者向け)
ブラウザはメディアクエリの em を
「ユーザーのフォント設定」に応じてスケールします。
CSS 版
@media (min-width: 40em) {
.container {
max-width: 800px;
}
}
CSSユーザーがブラウザの文字サイズを大きくしている場合、
メディアクエリもそれに合わせて発動タイミングが変わります。
アクセシビリティに強い設計です。
まとめ
rem と em の違いは「基準がどこか」だけです。
rem → html の font-size を基準
em → 親 or 自分の font-size を基準
使い分けの結論はこれ。
- rem:全体のスケールを安定させたいとき
- em:コンポーネント内で相対的にスケールさせたいとき
Tailwind は rem ベースなので、
基本は rem(ユーティリティ)を使い、
必要な場面だけ em を任意値で使うのが最適です。


