【フォントディスプレイ】

font-display とは?

💡 フォント読み込み中に文字が消える問題、たった1行で解決できる
📌 このページのポイント
font-display — Webフォント読み込み中の表示戦略 読み込み中 読み込み後 特徴 swap システムフォントで表示 Webフォントに切替 推奨 block テキスト非表示(FOIT) Webフォントで表示 文字が消える optional システムフォントで表示 遅ければ切替しない CLS=0 fallback 短時間だけ非表示 猶予期間内のみ切替 バランス型 @font-face内で font-display: swap; と指定 — Google Fontsもswapを推奨
font-displayの各値と表示挙動の比較
ひよこ ひよこ

Webサイトを開いたとき、一瞬テキストが見えなくなることがあるんだけど、あれは何?

ペンギン先生 ペンギン先生

それはFOIT(Flash of Invisible Text)と呼ばれる現象だよ。ブラウザWebフォントのダウンロードを待っている間、テキストを非表示にしてるんだ。font-displayプロパティで制御できるよ

ひよこ ひよこ

font-display: swapってよく見るけど、どういう意味なの?

ペンギン先生 ペンギン先生

swapは「まずシステムフォント(端末に入ってるフォント)で表示して、Webフォントが読み込めたら差し替える」という戦略だよ。テキストが消えることがなくなるからFCPが改善するんだ

ひよこ ひよこ

でもフォントが切り替わるとガクッとずれたりしない?

ペンギン先生 ペンギン先生

いいところに気づいたね!swapだとフォント切り替え時にレイアウトシフトが起きることがある。それが気になるならoptionalを使う手もあるよ。optionalは通信が速ければWebフォントを使い、遅ければシステムフォントのまま表示する賢い戦略なんだ

ひよこ ひよこ

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

ペンギン先生 ペンギン先生

多くの場合はswapで十分だよ。Google Fontsもデフォルトswapをつけてるしね。ブランドフォントなどデザイン上どうしても必要ならblock、パフォーマンス最優先ならoptionalがおすすめ。size-adjustプロパティを併用するとフォント切り替え時のズレも軽減できるよ

ひよこ ひよこ

実際のCSSってどう書くの?コードで見たい!

ペンギン先生 ペンギン先生

@font-faceの中でこう書くよ。`@font-face { font-family: 'MyFont'; src: url('myfont.woff2'); font-display: swap; }` これだけ!Google Fontsを使うなら URLに `&display=swap` をつけるか、最近のGoogle Fontsはデフォルトswapが入ってるから確認してみてね

ひよこ ひよこ

fallbackっていう値もあると聞いたんだけど、swapと何が違うの?

ペンギン先生 ペンギン先生

fallbackはswapより待機時間が短いバランス型だよ。swapは「システムフォントで即表示 → いつまでもWebフォントに切り替え待ち」だけど、fallbackは「約100ミリ秒だけ非表示にして読み込みを待ち、3秒以内にダウンロードできなければシステムフォントを使い続ける」という戦略なんだ。フォント切り替えのちらつきを減らしつつ、ある程度Webフォントを使いたいときに向いてるよ

ひよこ ひよこ

Core Web Vitalsへの影響はどう変わるの?

ペンギン先生 ペンギン先生

font-displayはFCPFirst Contentful Paint)とCLS(Cumulative Layout Shift)の両方に関係するよ。blockを使うとFOITが起きてFCPが悪化する。swapFCPは改善するけど、フォント切り替え時にレイアウトがずれてCLSが悪化する可能性がある。optionalやfallbackはCLSも抑えやすい。GoogleのLighthouseもfont-displayの設定を評価項目の一つにしているよ

ひよこ ひよこ

size-adjustってどうやって使うの?

ペンギン先生 ペンギン先生

@font-faceにもう一行追加するだけだよ。`@font-face { font-family: 'MyFont'; src: url('myfont.woff2'); font-display: swap; size-adjust: 105%; }` みたいに、フォールバックフォントと大きさを合わせてCLSを0に近づけられる。たとえばNoto Sans JPとシステムフォントの文字幅の差を測って調整すると、切り替えてもほとんどずれなくなるんだよ

ひよこ ひよこ

日本語フォントって特別に気をつけることはある?

ペンギン先生 ペンギン先生

日本語フォントはファイルサイズが英語フォントの10〜50倍になることが多いから、font-displayの選択がより重要になるよ。Noto Sans JPはサブセット化しても2〜3MBになることもある。そのためunicode-rangeで必要な文字だけ読み込んだり、Google Fontsのtext=パラメーターで使用文字を絞り込んだりする工夫と組み合わせるのがベストプラクティスだね

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「font-display」って出てきたら「Webフォント読み込み中のテキスト表示戦略」と思えればだいたいOK!
📖 おまけ:英語の意味
「font-display」 = フォント表示制御
💬 font(フォント)のdisplay(表示方法)を制御するCSSプロパティで、文字が見えなくなる問題を防ぐんだよ
← 用語集にもどる