CSS

The CSS font-size property sets the size of the text. It affects readability, layout, and accessibility, and it is often best managed with scalable units like rem and responsive functions like clamp().

font-size

font-size は「文字の大きさ」を指定するCSSプロパティです。読みやすさ(可読性)とレイアウトの安定性に直結するため、実務でも試験でも“よく出る基本”のひとつです。

このページでできるようになること

まずは直感:font-size って何?

文字の“物差し”を決めるスイッチ
font-size は、文字そのものの大きさ(見え方)を決めます。小さすぎると読めず、大きすぎると行が折れてレイアウトが崩れます。
レイアウトにも影響する
文字が大きくなると、要素の高さ・折り返し・ボタンの幅なども変わります。「見た目だけ」ではなく、配置にも効きます。
最初の結論:実務は rem が中心になりやすい
px は分かりやすい一方、全体の拡大・縮小を設計しづらい場面があります。実務では rem を基準にして、必要に応じて clamp() で可変にするのが定番になりやすいです。

覚え方:font-size は「読むためのサイズ」。読みやすさを守りつつ、レイアウトも壊さないサイズを選びます。

正確な定義(仕様に沿った説明)

何のために存在するか

テキスト(文字)の大きさを指定し、コンテンツの階層(見出し・本文・注釈など)や、読みやすさ(可読性)をコントロールするために存在します。

何に適用されるか(対象)

基本:すべての要素
font-size は基本的に全要素に適用できます。特にテキストを表示する要素(例:p, a, button など)で強く意味を持ちます。
疑似要素(::before / ::after
疑似要素の文字にも適用できます(疑似要素は、その要素の一部として表示されるため)。

できること/できないこと(制約)

できること:大きさを指定する(長さ・%・キーワード)
16px のような長さ、120% のような割合、small/large などのキーワードで指定できます。
できないこと:フォント自体を選ぶこと
フォントの種類は font-family、太さは font-weight、行の高さは line-height が担当です。font-size は「サイズだけ」です。

影響範囲(レイアウト/描画/ユーザー操作/アクセシビリティ)

レイアウト
文字が大きくなると、折り返し位置・行数・要素の高さが変わり、結果として全体の高さや余白バランスも変わります。
描画
文字サイズに応じて、フォントの見え方(にじみ・太さの印象)も変わることがあります。特に小さい文字は読みにくくなりがちです。
ユーザー操作
ボタンやリンクの文字が小さいと、内容が読めず操作ミスが起きます。タップ領域そのものは padding などで確保しますが、文字サイズも操作の安心感に直結します。
アクセシビリティ
ユーザーがブラウザのズームやOS設定で文字を大きくしても壊れにくい設計が重要です。相対単位(例:rem)はこの設計と相性が良いです。

基本の書き方(最短の型)

最小サンプル(コピペ用)

まずは、本文を 1rem(多くの環境で約16px)にして、見出しだけ大きくする最小の形です。

CSS

/* 基本:本文は 1rem を基準にする */
body {
    font-size: 1rem;
}

/* 見出しは段階的に大きくする(例) */
h1 { font-size: 2rem; }
h2 { font-size: 1.5rem; }

コピペで動く最小デモ(このページ内で表示)

デモは「悪い例 → 良い例」で、差が一目で分かるようにします。

悪い例:12px 固定(小さくなりやすく、拡大設計もしづらい)

この文章は font-size: 12px です。小さめで、長文になるほど読みにくくなります。

良い例:本文は rem、見出しは clamp() で少しだけ可変

見出しは画面幅に応じて少し変化します

この文章は font-size: 1rem(多くの環境で約16px)です。読みやすさの土台を守りやすく、全体の調整もしやすいです。

HTML

<p class="demoFontSizeMeta"><b>悪い例:</b><code>12px</code> 固定(小さくなりやすく、拡大設計もしづらい)</p>
<div class="demoFontSizeWrap">
    <p class="demoFontSizeBadNote">この文章は <code>font-size: 12px</code> です。小さめで、長文になるほど読みにくくなります。</p>
</div>

<p class="demoFontSizeMeta"><b>良い例:</b>本文は <code>rem</code>、見出しは <code>clamp()</code> で少しだけ可変</p>
<div class="demoFontSizeWrap">
    <p class="demoFontSizeGoodTitle">見出しは画面幅に応じて少し変化します</p>
    <p class="demoFontSizeGoodBody">この文章は <code>font-size: 1rem</code>(多くの環境で約16px)です。読みやすさの土台を守りやすく、全体の調整もしやすいです。</p>
</div>

CSS

.demoFontSizeWrap {
    border: 1px solid #888;
    border-radius: 0.2em;
    padding: 1em;
    background: rgba(152, 152, 152, 0.08);
    margin: 1em 0;
}

.demoFontSizeBadNote {
    font-size: 12px;
    line-height: 1.4;
}

.demoFontSizeGoodBody {
    font-size: 1rem;
    line-height: 1.7;
}

.demoFontSizeGoodTitle {
    font-size: clamp(1.25rem, 1rem + 1vw, 1.75rem);
    font-weight: bold;
    margin: 0 0 0.5em;
}

.demoFontSizeMeta {
    font-size: 0.875rem;
    color: #555;
}

@media (prefers-color-scheme: dark) {
    .demoFontSizeWrap {
        border-color: #666;
        background: rgba(255, 255, 255, 0.06);
    }
    .demoFontSizeMeta { color: #bbb; }
}

よく使う値/典型パターン

px(絶対長さ)
意図した見た目に合わせやすい一方、全体設計での拡大・縮小の“軸”にはしにくいことがあります。部分的な微調整に使われがちです。
rem(ルート基準の相対長さ)
ページ全体の文字サイズを揃えやすく、保守しやすいことが多いです。実務で主役になりやすい単位です。
em(親要素基準の相対長さ)
コンポーネント内で“段階的に”サイズを変えたい時に便利ですが、入れ子が深いと想定外に増減しやすいので注意が必要です。
%(親要素の font-size を基準にした割合)
親が 16px なら 125%20px 相当です。基準を理解すると使いやすいです。
clamp()(最小〜理想〜最大)
レスポンシブで“増えすぎ/減りすぎ”を防ぎながら可変にできます。見出しに使うと効果が分かりやすいです。

どこに書くか(外部CSS/ページ内style/インライン)

基本:外部CSS(推奨)
実務では、再利用・差分管理・保守のために外部CSSが基本です。font-size は複数箇所に影響しやすいので、特に外部CSSで管理した方が安全です。
ページ内 <style>
学習用デモや、単独ページで完結させたい場合に使われます。このページのデモも、コピペで再現できるようにページ内にまとめています。
インライン(例外)
style="font-size: ..." は緊急の検証には便利ですが、運用では“最後の手段”になりがちです。上書き関係が追いづらくなるためです。

仕様として押さえるポイント(初心者が事故りやすい所)

継承する?(inheritance)
やさしい一言:親の文字サイズが、子にも“引き継がれます”。
正確:font-size は継承プロパティです。子要素に指定が無ければ、親の font-size が使われます。
初期値は?(initial)
やさしい一言:指定しなければ“ブラウザの標準”になります。
正確:初期値は medium(キーワード)です。実際のピクセル値は環境(ブラウザ/OS/設定)で変わりえます。
適用対象は?(applies to)
すべての要素に適用されます(疑似要素にも適用されます)。
% の基準は?(percentages)
やさしい一言:% は「親の文字サイズに対して何%か」です。
正確:font-size: 125% は、親の使用値(親の実際に使われているサイズ)を基準にして計算されます。
算出値/使用値(computed/used value)
やさしい一言:“計算した値”と“実際に使う値”は、同じとは限りません。
正確:指定がキーワードや % の場合、内部で計算されて実際の長さになります。DevTools の Computed は「最終的に効いた値」を見るのに役立ちます。
無効値の扱い
font-size: 12 のように単位が無い長さは無効です(0 以外)。無効になると、その宣言はなかったことになり、別のルール(継承や別の指定)が採用されます。
アニメーション可能?(animatable)
基本的にアニメーション可能です(長さとして補間されます)。ただし、文字の拡大縮小アニメは“読みにくさ”につながりやすいため、実務では慎重に扱います。
ショートハンド/ロングハンド
font-size 自体はロングハンドです。ただし、font(ショートハンド)に含まれます。font を使うと font-size もまとめて上書きされる点が落とし穴になりやすいです。

よくある勘違い・混同ポイント

px は“ズームで拡大されない”と思ってしまう
ブラウザのズームは px でも拡大されます。問題になりやすいのは「全体設計としてのスケールの作りやすさ」で、rem の方が“軸”にしやすい場面が多いです。
emrem と同じだと思ってしまう
rem はルート(多くは html)基準、em は親要素基準です。入れ子が深いと em は意図しない増減が起きやすいです。
% は“画面幅に対する割合”だと思ってしまう
font-size% は「親の文字サイズ」基準です。画面幅基準にしたいなら、vwclamp() を検討します。
font(ショートハンド)を軽く書いて事故る
font は省略時の上書きが強く、意図せず font-familyline-height まで変えることがあります。軽い気持ちで使うと、原因追跡が難しくなります。

実務でよくある使用例(制作会社の現場を想定)

方針:本文は rem、コンポーネントは“必要な時だけ” em
  • 満たしたいこと:全体の読みやすさを揃え、あとから調整しやすくする
  • 理由:rem を主役にすると「全体のスケール」を作りやすい
  • 使いどころ:本文・注釈・ボタン文字など、基本のタイポグラフィ全般
見出し:clamp() で“増えすぎ/減りすぎ”を防ぐ
  • 満たしたいこと:スマホで見出しが大きすぎて折れるのを防ぎ、PCでは弱すぎない
  • 理由:clamp() は最小・理想・最大が決められる
  • 使いどころ:ヒーロー見出し、記事タイトル、セクション見出し
注釈・補足:0.875rem のように“段階”で設計する
  • 満たしたいこと:情報の優先度を視覚的に分ける
  • 理由:小さくしすぎると読めないので、段階数を絞って運用する
  • 使いどころ:注釈、日付、補足ラベル、フォームの説明文

実務で起きがちな事故と回避策

事故:サイズ指定が効かない(変わらない)
原因候補:より強い指定(詳細度や読み込み順)に負けている/インライン指定がある/font で上書きされている。
最短の確認:DevTools の Computedfont-size を見て、どのCSSファイル・どのセレクタが勝っているか確認します。
回避策:まずは“勝っているルール”を直す。!important は最終手段にします。
事故:em の入れ子で想定外に大きく(小さく)なる
原因候補:親の font-sizeem で指定していて、掛け算的に増減している。
最短の確認:親→子の順に要素をクリックし、Computed の font-size がどの段階で変化したか見ます。
回避策:全体は rem を主役にし、em は“コンポーネント内だけ”に限定すると事故が減ります。
事故:レスポンシブで見出しが折れすぎる/1行に収まらない
原因候補:見出しが大きすぎる/行長が短い/英単語が長く折れない。
最短の確認:画面幅を狭めて、折れ方を観察。必要なら word-breakoverflow-wrap も検討します。
回避策:clamp() で上限・下限を持たせ、line-height もセットで調整します。
事故:小さくしすぎて読めない(アクセシビリティ低下)
原因候補:注釈のつもりで 12px 固定などにしている/行間が狭い。
最短の確認:100%表示だけでなく、ズーム 125% 〜 200% でも読めるか確認します。
回避策:本文は 1rem 付近を土台にし、注釈も 0.875rem 程度など“下げすぎない”段階を決めます。

アクセシビリティ/UX観点での注意(必要な範囲で)

本文は“読めるサイズ”を下回らない
本文の文字は、多くの場面で 1rem(目安:16px相当)から極端に下げない方が安全です。どうしても小さくする場合でも、情報の重要度が低い箇所に限定します。
ズーム・文字拡大に耐えるレイアウトにする
ユーザーが文字を大きくした時に、ボタンがはみ出す・重なるなどが起きないようにします。固定高さ(height)で“文字を閉じ込めない”のが基本です。
コントラスト(文字色×背景色)もセットで見る
文字サイズを小さくすると、同じ色でも読みにくくなります。小さい文字ほどコントラストは強めが安全です。
動きと読みやすさ
文字サイズのアニメーションは読みにくくなりやすいです。必要なら @media (prefers-reduced-motion: reduce) で動きを抑える設計にします。

関連プロパティ・関連セレクタとの組み合わせ・相互作用

line-height(行の高さ)
文字サイズを変えたら、行間もセットで調整すると読みやすさが安定します。line-height: 1.6 のように単位なしで指定すると、文字サイズに追従しやすいです。
font-family(フォント)
同じ font-size でも、フォントによって“見かけの大きさ”は変わります。違和感が出たらフォント側の影響も疑います。
font(ショートハンド)
font を使うと font-size もまとめて上書きされます。意図せず崩れた時は、font の指定がないか検索します。
clamp() / min() / max()
レスポンシブでサイズを可変にしたい時の定番です。clamp() は「最小〜理想〜最大」で制御できるため、見出しに向きます。
em / rem / %(相対単位)
継承と相性が良い反面、どれを基準にしているかを間違えると事故になります。基準を言葉で説明できる状態にしておくと、デバッグが速くなります。
メディアクエリ(@media
ブレークポイントで段階的に文字サイズを変える方法もあります。ただし増やしすぎると管理が大変になるため、まずは clamp() で“ほどよい可変”を検討すると実務は楽になります。

試験(Webクリエイター能力認定試験)で得点できる整理

用語ミニ辞典(短く)

font-size
文字サイズを指定するプロパティ。継承される。
px
絶対長さの単位(CSSピクセル)。指定が分かりやすい。
rem
ルート要素(多くは html)の文字サイズを基準にした相対長さ。全体設計の軸にしやすい。
em
親要素の文字サイズを基準にした相対長さ。入れ子で増減しやすい。
%
親の font-size を基準にした割合。
clamp()
最小値・理想値・最大値を指定して、値を範囲内に収める関数。
継承(inheritance)
親の値が子に引き継がれる性質。font-size は継承される。

ひっかけポイント(短く)

「問われ方」っぽいミニ確認(解説付き)

Q1. 親が font-size: 16px のとき、子が font-size: 125% なら何px相当?
A. 20px 相当です(16 × 1.25 = 20)。% は親の文字サイズが基準です。
Q2. font-size: 14 と書いたらどうなる?
A. 無効です(0 以外の長さは単位が必要)。その宣言は無視され、別の指定(継承など)が採用されます。
Q3. 次のうち、入れ子が深くなってもサイズが変わりにくいのは?(em / rem
A. rem です。em は親基準なので入れ子で増減しやすいです。
Q4. ボタンの文字サイズを変えたら高さが足りず文字が切れた。まず疑うべきCSSは?
A. 固定高さ(height)や、行間(line-height)です。文字を“固定の箱”に閉じ込めていないか確認します。
Q5. なぜ見出しに clamp() を使うと便利?
A. 画面が狭い時に大きすぎず、広い時に小さすぎない範囲に収められるからです。最小・理想・最大を同時に指定できます。

よくある質問(FAQ)

本文は何pxが正解ですか?
“絶対の正解”はありませんが、実務では本文を 1rem(目安:16px相当)付近に置き、見出しや注釈を段階的に設計することが多いです。小さくしすぎると読みにくさと問い合わせが増えます。
html { font-size: 62.5%; } は使っていいですか?
1rem = 10px 相当にして計算しやすくする狙いがあります。ただし“基準の変更”は全体に影響するため、案件ルールとして統一できる時に使います。途中参加の人が混乱しやすいなら、100% を維持して rem を素直に使う方が安全です。
px を使うのはダメですか?
ダメではありません。問題は“どこを基準に設計するか”です。全体は rem を主役にして、部分的な調整に px を使う、のように役割分担すると破綻しにくいです。
em% はどっちが良い?
どちらも親基準なので、基準の理解が同じくらい大切です。使い分けのコツは「計算のしやすさ」と「設計の意図」を揃えることです。迷うなら rem を主役にして、em/% は限定的に使うのが安全です。
文字を大きくしたらレイアウトが崩れます。どう直せばいい?
まず固定高さ(height)や固定幅で“文字を閉じ込めていないか”を確認します。次に line-heightpadding を見直し、ズーム 200% でも破綻しないか確認します。

よくあるエラー/症状 早見表

指定しても文字サイズが変わらない
原因候補:他のルールに負けている/font で上書き/インライン指定。
確認:DevTools の Computedfont-size の“勝ったルール”を見る。
方向性:勝っているルールを修正する。
em を使ったら想定より大きい(小さい)
原因候補:入れ子で倍率が重なっている。
確認:親→子の順に Computed を追う。
方向性:rem を主役にし、em はスコープを限定する。
レスポンシブで見出しが折れすぎる
原因候補:サイズが大きすぎる/行長が短い/長い単語が折れない。
確認:画面幅を変えて折れ方を見る。
方向性:clamp()line-height をセットで調整する。
文字が切れる(上下が欠ける)
原因候補:固定高さ(height)や、line-height が小さすぎる。
確認:Box Model と Computed を見る。
方向性:固定高さを避け、余白と行間で収める。
小さい注釈が読めないと言われる
原因候補:サイズを下げすぎ/コントラスト不足。
確認:ズーム125%〜200%で確認。
方向性:段階設計(例:0.875rem)にして下げすぎない。

まとめ:迷ったときの判断軸