フォントはCSSから静的に読み込むのが普通
でも動的に読み込みたい場面もあります。
- フォントを自由に追加したかったり、
- フォントの重要度が低かったり、
- ページ読込に負荷をかけないためとか、
そういう時はJavaScriptから動的追加も可能。
ただ意外とその方法が複雑で忘れがち。
そこでJSからフォント読み込みする手順まとめます。
フォント読み込みにはFontFaceを使えばいい
JavaScriptでは標準で FontFace が利用可能
これは次の役割を担ってるものです。
- フォントファイル(.tff, etc)の読込
- フォントファミリー名の定義
- フォントフェースへのスタイル適用
別にライブラリとか探さなくてもOK。
これだけで動的にフォントを扱うには十分ですね。
例えば Cosmos Logic というフォントがあります。
▼ このFontFaceオブジェクトを作るコード例
1 2 3 4 5 |
var fontFace = new FontFace( 'Cosmos Logic', 'url(./Cosmos_Logic.ttf)', { style: 'normal', weight: 700} ); |
上コードの1つめの引数がフォントファミリー名です。CSSプロパティの font-family: ~ で指定するフォントの名前のこと。ここには空白を含めてもいいし、任意の名前でOKです。
そして2つ目引数の 'url(./Cosmos_Logic.ttf)' から Cosmos_logic.ttf というファイルを読み込んでます。このコードだと同じディレクトリにあるファイルを読み込み、これはローカルにあろうが全く問題なしです。
あと3番目の引数にはフォントの太さとかを指定。上コードだと太さ700で標準的なスタイルを指定してます。この引数については正直良く分かってません。
まあこういう感じでFontFaceは作成可能。
もちろん これだけではフォント適用できないです。
FontFaceによる動的フォント読み込みのコード例
では具体的なフォント読み込みのコード例を1つ
読み込みのコードはそんなに難しくありません。
実際に次のような手順で上手くいきました。
1.テキスト要素を作成
▼ なんでもいいけどHTML例
1 2 3 4 5 |
<p style="font-size: 50px;"> ABCDEFGHIJKLMN<br> OPQRSTUVWXYZ<br> 1234567890 </p> |
まあ何でもOKですけどね・・・
ここではアルファベットと数字の羅列だけ
2.フォントを動的読み込みするコード追加
こういうコードを追加してみました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
/// FontFaceオブジェクト生成 var fontFace = new FontFace( 'Cosmos Logic', 'url(./Cosmos_Logic.ttf)', { style: 'normal', weight: 700} ); fontFace.load().then(function(loadedFace){ /// フォント読み込み成功 /// body要素全体にそれを適用する document.fonts.add(loadedFace); document.body.style.fontFamily = '"Cosmos Logic"'; }).catch(function(e){ /// フォント読み込み失敗 console.error('読み込み失敗...'); }); |
説明すると fontFace.load() のあとにコールバックを渡しておき、読み込み後に ドキュメント全体にフォントを追加、そのあとbody要素のにフォントファミリー指定するといった感じ
実際の表示はこうなりました。
ちゃんとフォントが反映されてます。
動的フォント切り替えはそんな難しくありません。
動的フォント読み込みのまとめ
簡単にまとめると次の通り
- フォントはFontFaceで操作できる
JavaScriptではフォント(*.ttf, *.otf、*.ttc、*.eot)を扱うのに専用オブジェクトが用意されている。これを使えばローカルでもどこからでもフォント読み込みが可能
- 読み込み後にdocumentに追加する
例えば document.fonts.add(loadedFace); のようにすればドキュメントに追加可能。実際に適用するには document.body.style.fontFamily = '"Cosmos Logic"'; などとすればOK(もちろんjQueryでも可)
僕自身はFontFaceを今回初めて知りました。
こういった便利なものは活用していきたいですね。
以上、JSで動的フォント読み込みでした。ではまた。