はじめに:この記事のゴールと読者像
本記事は、フロントエンドを勉強中の方から実務でコードを書いているエンジニアまでを対象に、「Google Fonts」と「Google Symbols Icons(Material Symbols)」を正しく・速く・安全に導入するための完全ガイドです。
HTML/CSSへの実装、可変フォント(Variable Fonts)の指定方法、表示速度の最適化、WordPress(ブロックテーマ/クラシックテーマ)のベストプラクティス、GDPR観点のローカルホスト案、Material SymbolsのFILL / wght / GRAD / opsz軸やアイコン部分サブセット化まで、実務で役立つ内容に絞って整理します。公式情報や最新仕様に沿って記述し、重要箇所は一次情報へも触れます(引用あり)。
1. Google Fonts の基本:CSS2 API と可変フォント
Google Fonts は CSS2 API(https://fonts.googleapis.com/css2)で提供され、可変フォントを第一級でサポートします。家族名と軸(wght など)を URL パラメータで指定するのがコアの考え方です。以下のように書きます。
<!-- 最小例:1ファミリー -->
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link
rel="stylesheet"
href="https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700&display=swap"
/>
- 複数ファミリーは &family= を繋げて指定(例:&family=Inter:wght@400;700&family=Noto+Sans+JP:wght@400;700)。
- 可変フォントはレンジで指定(例:wght@200..900)。
- font-display はクエリの display= で指定(例:display=swap)。
- text= パラメータで必要文字だけにサブセット化でき、最大で大幅な縮小効果が期待できます(ロゴや短い見出し向け)。
<!-- 可変フォント(重みレンジ) + text= で部分サブセット例 -->
<link
rel="stylesheet"
href="https://fonts.googleapis.com/css2?family=Crimson+Pro:wght@300..700&text=Hello%20World&display=swap"
/>
2. 実装ベストプラクティス:高速表示と安定描画
フォントはしばしば LCP/FCP・CLS に影響します。次の基本を押さえましょう。
- preconnect を張る fonts.googleapis.com と fonts.gstatic.com への接続を早めます。フォントは CORS が必要なため、gstatic 側は crossorigin を付与します。
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
- font-display を適切に 一般的な本文・UIでは display=swap が扱いやすい選択肢です。Google Fonts の CSS2 API は display= パラメータをサポートしています。
- 必要最小限のスタイルだけを要求 使わないウエイトやスタイルを読み込まないこと。レンジより個別の数値(例:wght@400;700)のほうが軽いケースもあります。
- 必要に応じて preload ファーストビューに必須のローカルホストフォントでは rel=”preload” を検討。ただし誤用すると逆効果にもなり得るため、対象は厳選します。
3. 可変フォント(Variable Fonts)の指定と CSS
可変フォントは wght(ウェイト)や ital(イタリック)などの軸を連続値で持ちます。API 側で範囲を読み込み、CSS 側で font-weight などで制御するのが基本です。必要なら font-variation-settings で直接指定も可能です。
/* 例:本文ベースは 400、見出しは 700 */
body { font-family: "Inter", system-ui, -apple-system, sans-serif; }
h2 { font-weight: 700; }
/* 中間の 550 を狙いたい場合は font-variation-settings でも */
.hint {
font-variation-settings: "wght" 550;
}
レガシーブラウザのフォールバックは API が自動で近傍の静的ウエイトに落とします(例:wght@440..560 は 400/500/600 など)。
4. WordPress での実装:ブロックテーマとクラシックテーマ
4-1. ブロックテーマ(WP 6.5+ Font Library)
WordPress 6.5 からフォントライブラリが搭載され、管理画面(外観 > エディター > スタイル)からローカルフォントや Google Fontsを簡単に追加・有効化できます。サイト全体のタイポグラフィ管理がしやすくなりました。
- 使い方の概要(6.5)
- 外観 > エディター > スタイル > タイポグラフィ > フォント管理
- 追加したいファミリーやバリアントを選択
- 保存するとサイト全体に反映(ブロックテーマ対象)
- 6.6 以降の注意点 エディターでフォントが即座に反映されない既知の問題があり、すべての font-face を theme.json で登録する、または**@font-face をカスタム CSS で注入**する回避策が案内されています。
- theme.json での管理 settings.typography.fontFamilies にカスタムファミリー、styles.typography.fontFamily で適用。WordPress 6.6 では theme.json v3 が導入されています。
4-2. クラシックテーマ
クラシックテーマでは functions.php から読み込むのが現実的です。
// functions.php
function mytheme_enqueue_fonts() {
// preconnect は resource hints フィルターで
wp_enqueue_style(
'google-fonts',
'https://fonts.googleapis.com/css2?family=Inter:wght@400;700&display=swap',
array(),
null
);
}
add_action('wp_enqueue_scripts', 'mytheme_enqueue_fonts');
function mytheme_resource_hints( $urls, $relation_type ) {
if ( 'preconnect' === $relation_type ) {
$urls[] = array(
'href' => 'https://fonts.googleapis.com',
);
$urls[] = array(
'href' => 'https://fonts.gstatic.com',
'crossorigin' => 'anonymous',
);
}
return $urls;
}
add_filter( 'wp_resource_hints', 'mytheme_resource_hints', 10, 2 );
GDPR などで外部配信を避けたい場合は、フォントをダウンロードしてローカルホストする運用も検討してください(テーマ同梱またはアップロード)。WordPress 公式でもローカルホスト化は遵守策として推奨されています。
5. Google Symbols Icons(Material Symbols):最新のアイコンフォント
Material Symbols は Google の最新アイコンセットで、1つの可変アイコンフォントにまとめられています。FILL / wght / GRAD / opsz の軸を持ち、Outlined / Rounded / Sharp のスタイルが選べます。
5-1. 最短導入(静的軸)
<!-- Outlined を読み込む最小例(デフォルト軸設定で 400/opsz=48/GRAD=0/FILL=0) -->
<link href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined" rel="stylesheet" />
<style>
.material-symbols-outlined {
font-family: 'Material Symbols Outlined';
font-weight: normal;
font-style: normal;
font-size: 24px; /* 基本サイズ */
display: inline-block;
line-height: 1;
letter-spacing: normal;
text-transform: none;
white-space: nowrap;
direction: ltr;
}
</style>
<!-- 使い方(リガチャで指定) -->
<span class="material-symbols-outlined">home</span>
リガチャで home と書くことで該当グリフに置き換わります。互換性の理由でコードポイント指定も可能です。
5-2. 可変フォントで軸を使い分ける
アイコンをアニメーションしたい、より緻密に見た目を制御したいなら可変フォントを読み込みます。読み込み時は軸レンジ(例:FILL@0..1)を API で指定し、CSS では font-variation-settings で制御するのが簡単です。
<!-- 可変軸を読み込む例(opsz, wght, FILL, GRAD をレンジ指定) -->
<link
href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@20..48,100..700,0..1,-50..200&display=block"
rel="stylesheet"
/>
/* 軸制御のサンプル */
.icon {
font-family: 'Material Symbols Outlined';
font-variation-settings:
"FILL" 0, /* 0:アウトライン〜1:塗り */
"wght" 400, /* 100..700 */
"GRAD" 0, /* -50..200 */
"opsz" 24; /* 20..48(サイズに応じて) */
font-size: 24px;
}
/* ホバーで塗りつぶしに遷移するアニメーション */
.icon:hover {
transition: font-variation-settings .2s ease;
font-variation-settings: "FILL" 1, "wght" 400, "GRAD" 0, "opsz" 24;
}
表示対策:リガチャ文字の「チラ見え」を避けるため、Material Symbols では &display=block を推奨。
5-3. アイコンを必要数だけに
サブセット
する
&icon_names= で使うアイコンだけを指定すると、数 KB 級まで軽量化できます(カンマ区切りのアイコン名、アルファベット順推奨)。
<link
href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:FILL@0..1&icon_names=home,palette,settings&display=block"
rel="stylesheet"
/>
公式ガイドで**ペイロードの差(数百 KB → 数 KB)**が例示されています。
5-4. ライセンスと自己ホスト
Material Symbols は Apache License 2.0。自前サーバーに WOFF2 を置く運用も可能ですが、複数フォーマット対応や CSS クラスの定義を手動で行う必要があります。
6. アクセシビリティと実装のコツ
- 意味を持つアイコン(操作や状態)の場合、aria-hidden=”true” を付けて視覚テキストを併記するか、aria-label 付きのボタン内にアイコンを置きます。
- アイコンはフォントサイズで拡大縮小します。Material Symbols は opsz 軸が視認性を維持する最適化を行います。サイズ変更時は opsz と font-size を揃えると読みやすくなります。
- 行揃えの乱れは line-height: 1 で抑制。周囲のテキストとベースラインがずれる場合は vertical-align: middle などで調整。
7. 実務に効くパフォーマンス最適化チェックリスト
- preconnect:fonts.googleapis.com と fonts.gstatic.com(crossorigin)を <head> 先頭付近に。
- 必要最小限のバリアント:本文は 400/700 程度、見出しだけ 700 などに限定。可変フォントのレンジ指定より個別数値で軽量化できる場合も検討。
- display=swap または optional:UX と CLS のバランスを見て選択。本文には swap が無難。
- text= でサブセット:ロゴや短い見出しなら有効。文字列はURL エンコード。
- Material Symbols は icon_names=:使うアイコンを列挙して極小化。display=block でリガチャの FOUC を阻止。
- ローカルホストの検討:ポリシーや法令対応、CDN ダウン依存回避に有効。WordPress ではフォントライブラリやプラグインも利用可。
8. WordPress:Material Symbols を綺麗に使う実装テンプレ
8-1. ブロックテーマ(推奨:theme.json と追加 CSS)
{
"$schema": "https://schemas.wp.org/trunk/theme.json",
"version": 3,
"settings": {
"typography": {
"fontFamilies": [
{
"fontFamily": "'Inter', system-ui, -apple-system, sans-serif",
"name": "Inter",
"slug": "inter"
}
]
}
},
"styles": {
"typography": {
"fontFamily": "var(--wp--preset--font-family--inter)"
}
}
}
theme.json では主に本文フォントを管理し、Material Symbols は追加 CSSでクラスを定義して運用するのがシンプルです。6.6 では v3 仕様の前提や読み込み挙動の注意があるため、検証環境で確認を。
8-2. クラシックテーマ(functions.php + CSS)
function mytheme_enqueue_material_symbols() {
wp_enqueue_style(
'material-symbols',
'https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@20..48,100..700,0..1,-50..200&display=block',
array(),
null
);
}
add_action('wp_enqueue_scripts', 'mytheme_enqueue_material_symbols');
.material-symbols-outlined {
font-family: 'Material Symbols Outlined';
font-weight: normal;
font-style: normal;
font-size: 24px;
line-height: 1;
letter-spacing: normal;
display: inline-block;
vertical-align: middle;
text-transform: none;
white-space: nowrap;
direction: ltr;
font-variation-settings: "FILL" 0, "wght" 400, "GRAD" 0, "opsz" 24;
}
9. 自己ホスト(ローカル配信)の基本
- フォントの設置:/assets/fonts/ などに WOFF2(必要に応じ WOFF)を配置。
- @font-face 定義:font-display: swap を設定し、CORS が絡む場合は適切にレスポンスヘッダーを整える。
- Material Symbols は公式 GitHub に WOFF2 と CSS がまとまっています(WOFF2 が前提)。
@font-face {
font-family: "Inter";
src: url("/assets/fonts/Inter-Variable.woff2") format("woff2");
font-weight: 100 900;
font-display: swap;
}
10. よくある落とし穴と対処
- アイコンの文字が一瞬表示される → Material Symbols は display=block を付ける。通常のフォントは display=swap。
- CORS でフォントがブロック → fonts.gstatic.com は CDN。preconnect の crossorigin、自己ホストなら適切な CORS 設定を。
- CLS が悪化 → swap で早期描画、ウエイトの揺れを抑えるため適切なフォールバックフォントと font-size-adjust の併用も検討。
- WordPress エディターでフォントが反映されない → 6.6 の既知事象。theme.json に全 font-face を登録、または CSS 注入で暫定対応。
- GDPR/ポリシー対応 → 可能ならローカルホストに切り替え。WordPress 公式も推奨しています。
11. 実務で使えるコードスニペット集
11-1. Sass ミックスイン(Material Symbols 軸指定)
@mixin ms($fill: 0, $wght: 400, $grad: 0, $opsz: 24) {
font-family: 'Material Symbols Outlined';
font-variation-settings: 'FILL' $fill, 'wght' $wght, 'GRAD' $grad, 'opsz' $opsz;
font-size: #{$opsz}px;
line-height: 1;
display: inline-block;
vertical-align: middle;
}
.icon { @include ms(); }
.icon--filled { @include ms(1, 400, 0, 24); }
.icon--bold { @include ms(0, 600, 0, 24); }
11-2. JS でアイコン名を差し替える(状態管理)
const btn = document.querySelector('.fav-btn');
const icon = btn.querySelector('.material-symbols-outlined');
btn.addEventListener('click', () => {
const isOn = btn.classList.toggle('is-on');
icon.textContent = isOn ? 'favorite' : 'favorite_border';
});
11-3. WP:ショートコードでアイコンを出す
// functions.php
function ms_icon_shortcode( $atts, $content = '' ) {
$a = shortcode_atts( array(
'fill' => 0, 'wght' => 400, 'grad' => 0, 'opsz' => 24, 'class' => ''
), $atts );
$style = sprintf(
'font-variation-settings:"FILL" %d,"wght" %d,"GRAD" %d,"opsz" %d;font-size:%dpx;',
intval($a['fill']), intval($a['wght']), intval($a['grad']), intval($a['opsz']), intval($a['opsz'])
);
return sprintf(
'<span class="material-symbols-outlined %s" style="%s" aria-hidden="true">%s</span>',
esc_attr($a['class']), esc_attr($style), esc_html($content)
);
}
add_shortcode('ms', 'ms_icon_shortcode');
// 例: [ms wght="600" opsz="20"]search[/ms]
12. 「Google Symbols Icons」と「旧 Material Icons」の違い(要点)
- Material Symbols は可変フォントベースで、FILL/GRAD/opsz など細やかな制御やアニメーションに強い。
- 旧 Material Icons は静的なウエイトが中心。新規採用は Symbols 推奨。公式でも最新セットとして案内されています。
13. さらに一歩進んだ最適化
- フレームワークのフォント最適化機能 Next.js や Angular はフォントのインライン化や最適化を提供。ビルドツールに任せるとネットワーク往復を削減できます。
- preconnect とリソース優先度 Google Fonts の CSS は googleapis.com、フォント実体は gstatic。両方に preconnect が効きます。
14. まとめ
- Google Fonts は CSS2 API で可変フォントを簡単に扱え、display=swap、text=、最小限のバリアント指定で高速化できます。
- Material Symbols は最新の可変アイコンフォント。FILL/wght/GRAD/opsz の軸を活用し、icon_names= で必要アイコンだけに絞れば軽くて美しい UI を作れます。
- WordPress 6.5+ のフォントライブラリで GUI から管理可能。ブロックテーマは theme.json を活用し、クラシックテーマは functions.php から読み込み。必要に応じてローカル配信も視野に。