【実務・中級編】 font-displayプロパティとフォントレンダリング – Webブラウザの仕組み実践ガイド

Webフォントの「一瞬の空白」を制する:font-displayの深層とブラウザの舞台裏

やあ。今日はフロントエンドエンジニアが避けて通れない、しかし意外とブラックボックスになりがちな「フォントレンダリング」の話をしよう。

君たちも経験があるはずだ。「ページを開いた瞬間、一瞬だけテキストが消える(FOIT)」、あるいは「初期フォントからWebフォントにガタッと切り替わる(FOUT)」。この現象、単なるデザインの崩れではなく、ブラウザのレンダリングパイプラインが「フォントがまだ届いていない」という事実にどう立ち向かったかの痕跡なんだ。

今日は、この挙動を制御する `font-display` プロパティの本質を、ブラウザの内部構造と照らし合わせながら紐解いていく。

—

ブラウザは「フォントが届かない」とき、どう動くのか?

ブラウザのレンダリングエンジン(BlinkやWebKit)にとって、Webフォントの読み込みは「非同期の外部リソース」だ。HTMLをパースしてDOMツリーを構築し、CSSOMと結合してレンダーツリーを作る際、ブラウザは「ここにこのフォントが必要だ」と認識する。

しかし、ネットワーク越しにWoff2が届くまでの間、ブラウザは判断を迫られる。
1. FOIT (Flash of Invisible Text): フォントが来るまでテキストを表示しない。
2. FOUT (Flash of Unstyled Text): とりあえずシステムフォントで表示し、後で差し替える。

この挙動を制御するのが `font-display` だ。これを理解することは、Webパフォーマンスの指標である「LCP(Largest Contentful Paint)」を最適化する上でも極めて重要になる。

—

font-displayの使い分け:現場の知恵

実務でよく使うのは、主にこの3つだ。

  • `block`: 読み込み完了までテキストを隠す。厳格なタイポグラフィを求めるならアリだが、LCPスコアには致命的。
  • `swap`: 即座にフォントを表示し、読み込み後に切り替える。今のWebの最適解。
  • `fallback`: 100ms程度は隠し、その後読み込めなければシステムフォントで固定する。

僕が自信を持って薦めるのは、基本的には `swap` だ。ユーザーは「フォントが完璧であること」よりも「情報が早く読めること」を求めているからね。

—

実践的な実装サンプル

以下に、最もモダンでパフォーマンスに配慮した `@font-face` の書き方を置いておく。これをそのまま自分のプロジェクトのCSSに貼り付けてみてくれ。

/

  • ベストプラクティス:font-display: swap を採用しつつ、
  • 読み込み後のガタつきを最小限にするための設定

/
@font-face {
font-family: ‘MyCustomFont’;
src: url(‘/fonts/my-font.woff2’) format(‘woff2’);
/

  • swapを指定することで、ブラウザは即座にフォントを描画する。
  • これにより、ユーザーはテキストが消える時間を待たなくて済む。

/
font-display: swap;

/

  • 応用: 読み込み前後の「レイアウトのガタつき」を抑えるヒント
  • size-adjust や ascent-override を併用すると、
  • システムフォントとWebフォントのサイズ差を微調整して
  • 切り替わりの瞬間の違和感を極限まで減らせる。

/
size-adjust: 100%;
}

—

パイプラインを意識した最適化の極意

ここからが少し深い話だ。`font-display: swap` を使うと、読み込み完了後にフォントが差し替わる際、ブラウザはレンダーツリーを再評価し、再レイアウト(Reflow)と再ペイント(Repaint)を行う。

もし、Webフォントとシステムフォントで文字の幅が大きく異なると、この瞬間にコンテンツ全体がピョコッと動いてしまう。ユーザーの視線を乱すこの挙動を防ぐには、以下の3つを意識してほしい。

1. preloadの検討: 重要なヘッダーフォントなどは `` を使って、パースの初期段階でフォント取得を優先させる。
2. Font Metrics Override: 上記のサンプルコードで触れた `size-adjust` 等を使い、システムフォントの見た目をWebフォントに近づける。これにより「切り替わり」の心理的負荷を減らすんだ。
3. 不要なウェイトは読み込まない: 「もしかしたら使うかも」で `bold` や `italic` をすべて読み込むのはやめよう。それはブラウザのメモリとネットワーク帯域をドブに捨てるようなものだ。

最後に

ブラウザは君たちのコードを、常に「どうすれば最速で画面を出せるか」という葛藤の中で解釈している。`font-display` を適切に設定するということは、ブラウザに対して「このテキストは、システムフォントでいいから今すぐ見せてくれ」と明確な優先順位を伝えることと同じなんだ。

技術仕様を暗記するのではなく、ブラウザが裏で何に悩み、何を優先しているのかを想像する。それが、中級からシニアへ駆け上がるための唯一の道だよ。

何か詰まったら、またいつでも相談してくれ。応援しているぞ。

コメント

タイトルとURLをコピーしました