2.

CSS font-size 完全ガイド(px / em / rem / % / vw / clamp / キーワード / アクセシビリティ)

編集
この記事の要点
  • font-size は要素のフォントサイズを指定する CSS プロパティ
  • 指定単位は絶対値(px / pt)相対値(em / rem / % / vw / vh)がある
  • rem はルート要素のフォントサイズ基準。スケーラブルでアクセシビリティに有利
  • em は親要素基準。ネストすると倍々で大きくなる落とし穴に注意
  • clamp(min, ideal, max) でビューポートに応じた可変フォントサイズが 1 行で書ける

font-size とは

font-size は要素内のテキストのフォントサイズを指定する CSS プロパティです。指定値は子要素にも継承され、相対単位の基準値としても使われます。

基本構文

セレクタ {
  font-size: 値;
}

/* 例 */
body { font-size: 16px; }
h1   { font-size: 2rem; }
p    { font-size: 1em; }
small{ font-size: 0.875em; }

指定できる単位

単位性質基準使いどころ
px絶対値1 CSS ピクセル細部の固定、デザインカンプ追従
pt絶対値1/72 インチ印刷 CSS
em相対値親要素の font-sizeパーツ単位でスケール
rem相対値ルート(<html>)の font-size全体スケール / アクセシビリティ
%相対値親要素の font-sizeem と同等
vw / vh相対値ビューポート幅 / 高さの 1%レスポンシブな見出し
キーワード離散値ブラウザ既定xx-smallxx-large / smaller / larger

px と rem の違い

px は絶対サイズ、rem はルート基準のスケーラブルサイズです。ユーザーがブラウザの「文字サイズを大きく」を選んだ場合、px は変わらず、rem は連動して大きくなります。アクセシビリティ的には rem 推奨です。

:root { font-size: 16px; }      /* 1rem = 16px 相当 */

h1 { font-size: 2rem; }         /* = 32px */
p  { font-size: 1rem; }         /* = 16px */
.note { font-size: 0.875rem; }  /* = 14px */

em の入れ子問題

em は親基準のため、入れ子にすると倍々に膨らみます。

<div style="font-size:1.2em">  <!-- 1.2em -->
  <div style="font-size:1.2em">  <!-- 1.44em -->
    <div style="font-size:1.2em">  <!-- 1.728em -->
      文字が思ったより大きい!
    </div>
  </div>
</div>

パーツのスケールに em を使うときは「自分の中で完結する」階層に限定すると安全です。全体のスケールには rem を使い分けるのが定番。

レスポンシブ: clamp() で 1 行

従来は @media で段階的に切り替えていたフォントサイズを、clamp() で滑らかに連続変化させられます。

/* clamp(下限, 推奨, 上限) */
h1 {
  font-size: clamp(1.5rem, 4vw + 1rem, 3rem);
}

/* スマホで 24px、PC で 48px くらいまで滑らかに伸びる */

キーワード指定

絶対キーワード相対キーワード
xx-small / x-small / small / medium / large / x-large / xx-largesmaller / larger

ユーザー側の設定に追従しやすいですが、デザインの細部制御には向きません。

line-height との関係

font-size を変えると line-height(行の高さ)も連動して見え方が変わります。読みやすさのため、line-height: 1.5 のような単位なしの比率で指定すると、フォントサイズに比例して自動調整されます。

body {
  font-size: 1rem;
  line-height: 1.6;   /* 1.6 倍。<br>とのバランスが取りやすい */
}

ベース値の設計

多くのデザインシステムでは次のような階段(タイプスケール)を使います。

用途rempx 換算(base 16px)
本文1rem16px
小さい注記0.875rem14px
h31.25rem20px
h21.5rem24px
h12rem32px

アクセシビリティの観点

  • 本文は最低 16px相当を確保(モバイルは Safari の自動ズーム回避にも有効)
  • ユーザーがブラウザでフォントサイズを変更できるよう、rem / em を多用し、root を html { font-size: 100% } にする
  • px 固定のみだとブラウザ設定を無視してしまう
  • コントラスト比(背景との関係)と組み合わせて読みやすさを評価

FAQ

Q: rem の基準を変えたいときは?
A: :root または html の font-size を指定します。html { font-size: 62.5%; } とすると 1rem = 10px となり計算しやすくなりますが、ユーザー設定を尊重するなら 100% のままにしておくのが安全。

Q: vw だけで指定するとどうなる?
A: 非常に小さい画面で読みづらくなります。clamp で下限・上限を設けるのが現代的な書き方です。

Q: ブラウザの最小フォントサイズはある?
A: 多くのブラウザに「最小フォントサイズ」設定があり、それ以下にしても表示されません。極小フォントは要注意。

関連

  • フォント — 親カテゴリ
  • font-family / font-weight / line-height
  • rem / em / vw / clamp()
  • レスポンシブデザイン / メディアクエリ
  • Web Vitals — LCP(最大コンテンツの描画)と font-display
編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. font-familyプロパティ
  2. font-sizeプロパティ
  3. font-weightプロパティで文字の太さを指定する
  4. font-styleプロパティ
  5. font-variantプロパティ
  6. fontプロパティ

最近更新/作成されたページ