Webフォントの実装
書体を配信するなら、届くまでの数秒をどう見せるかまで決めます。決めなければ、文字が消える時間ができます。
図の中身を文字で読む
- FOIT font-display: block 届くまで文字が出ない。遅い回線ほど長く空白が続く 和文は重い
- 収録字数が数千から数万あり、
- 無圧縮では数MBになる。
- (空白) (空白) 本文が出る サブセット化は必須。
- 使うウェイトだけを読み込む。
- FOUT font-display: swap Regular と Bold で2ファイル。
- 代替書体ですぐ出す。届いたら差し替わる 読み込まないウェイトを指定すると、
- ブラウザが機械的に太らせて字形が崩れる。
- 本文が出る 本文が出る 本文が出る 差し替えのずれを抑える
- size-adjust と ascent-override で
- 0秒 フォント到着 代替書体の見た目を本命に寄せる。
ひと目で#
- Webフォント
- サーバーから配信して使う書体。端末に入っていなくても表示できる
- FOIT
- 届くまで文字が出ない(
font-display: block) - FOUT
- 代わりの書体で先に出し、届いたら差し替える(
font-display: swap)。こちらを選ぶ - サブセット化
- 使う文字だけを抜き出して軽くする。和文では必須
- バリアブルフォント
- 1ファイルでウェイトを連続的に変えられる形式
- フォントスタック
- 候補の並び。読み込みに失敗しても文字は出る
使い分け#
| こういうとき | やること |
|---|---|
| 本文、UI、管理画面 | Webフォントを使わない(system-ui) |
| 書体がブランドの核 | 見出しだけ Webフォント |
| 和文を配信する | サブセット化。または unicode-range で分けて配信 |
| ウェイトを3種類以上使う | バリアブルフォント |
| ウェイトが2種類以下 | 静的な2ファイルのほうが軽い |
| 差し替えのずれを抑えたい | size-adjust と ascent-override |
図の中身を文字で読む
- 配信するかどうかを先に決める 配信するなら、ファイル構成
- 本文・UI・管理画面に使う文字? はい 配信しない ウェイトを3種類以上使う
- 量が多く、速さが最優先 system-ui で組む バリアブルフォント1ファイル
- いいえ ウェイトが2種類以下
- 静的な2ファイルのほうが軽い
- その書体はブランドの核? はい 見出しだけ配信する
- 声そのものが売りになっている 本文は端末の書体のまま 和文を配信する
- サブセット化が必須
- いいえ
- どの構成でも font-display: swap と
- 配信しない 迷ったら足さない。転送は戻らない 総称ファミリーまでのスタックを書く。
- 配信は「書体が要る」の証明から。先に system-ui で組んでみて、それでも失われる声だけを読み込む。
和文フォントを実際に軽くする手順は、和文フォントを軽くする に完成コマンドごとまとめました。
間違えやすいところ#
font-displayを指定しない既定では一定時間、文字が消える- 和文フォントをサブセット化せずに配信する数MBの転送になる
- 使わないウェイトまで読み込むウェイトごとにファイルが増える
- 総称ファミリー(
sans-serif)を省くすべて失敗したとき、ブラウザの既定になる - 和文書体を欧文書体より前に置く欧文が和文書体の字形で出て、品質が落ちる
- ライセンスを確認しないWeb埋め込み不可、サブセット化不可の書体がある

直す例#
架空の案件を1つ例にとります。どこを見て、何をどう直すかを書きます。
和菓子店のサイトで、見出し用に明朝の Web フォントを入れた現場です。指定を確認すると、4ウェイトを全ページで読み込み、本文にまで当てていました。回線が細いと本文が2回描き直され、その揺れが CLS として計測に出ます。
読み込みは見出しに使う Regular と Bold の2ファイルへ絞り、font-display: swap で先に代替書体を出します。本文は端末のゴシックに戻します。和文フォント自体を軽くする手順は 和文フォントを軽くする にまとめました。
確認する#
- 低速回線の再現でも、本文が最初から読める(文字が消える時間がない)
- 転送されるフォントのファイル数が、実際に使うウェイト2〜3個ぶんに収まっている
- 差し替えの前後で、行の折り返し位置が大きく動かない
この話が要る場面#
このページが答えになる、現場の困り事です。困り事の側から探すと、同じ場所に着きます。
1書体に絞る。preload と font-display: swap を付け、数百KBを超えるならサブセット化する。
このコードで動いている見本です
font-display が block になっている。swap にすると代替書体で先に出る。
このコードで動いている見本です
size-adjust と ascent-override で代替書体の見た目を本番に寄せる。
このコードで動いている見本です
この場面のほかの困り事と、そのまま貼れる部品は文字を読ませるにまとめてある。逆引きには全188件。
Webフォントを試す#
Google Fonts の日本語書体を68件すべて並べています。一覧を上下キーで送ると、送るたびに下の見本がその書体になります(確定を待ちません)。読ませ方(font-display)と配信方法を選ぶと、貼り付けるコードにそのまま反映されます。
- Aoboshi One
- BIZ UDGothic
- BIZ UDMincho
- BIZ UDPGothic
- BIZ UDPMincho
- Cherry Bomb One
- Chokokutai
- Darumadrop One
- Dela Gothic One
- DotGothic16
- Hachi Maru Pop
- Hina Mincho
- IBM Plex Sans JP
- Kaisei Decol
- Kaisei HarunoUmi
- Kaisei Opti
- Kaisei Tokumin
- Kapakana
- Kiwi Maru
- Klee One
- Kosugi
- Kosugi Maru
- LINE Seed JP
- M PLUS 1
- M PLUS 1 Code
- M PLUS 1p
- M PLUS 2
- M PLUS Rounded 1c
- M PLUS U
- Mochiy Pop One
- Mochiy Pop P One
- Monomaniac One
- Murecho
- New Tegomin
- Noto Sans JP
- Noto Serif JP
- Palette Mosaic
- Potta One
- Rampart One
- Reggae One
- Rock 3D
- RocknRoll One
- Sawarabi Gothic
- Sawarabi Mincho
- Shippori Antique
- Shippori Antique B1
- Shippori Mincho
- Shippori Mincho B1
- Shizuru
- Slackside One
- Stick
- Train One
- Tsukimi Rounded
- WDXL Lubrifont JP N
- Yomogi
- Yuji Boku
- Yuji Hentaigana Akari
- Yuji Hentaigana Akebono
- Yuji Mai
- Yuji Syuku
- Yusei Magic
- Zen Antique
- Zen Antique Soft
- Zen Kaku Gothic Antique
- Zen Kaku Gothic New
- Zen Kurenaido
- Zen Maru Gothic
- Zen Old Mincho
文字が届くまでの数秒 Loading 0123
代替書体で先に読ませるか、揃うまで待たせるか。切り替わりの一瞬を、ここで何度でも再現できます。
切り替えの経過がここに出ます。
この道具は JavaScript で動きます。無効の場合は、上の表と既定値のコードを使ってください。