GoogleのWeb Fonts APIは、フォントの読み込みが完了した場合や読み込みができなかった場合などに実行されるコールバック関数を定義する方法を提供します。CSS3Webフォント(@ font-face)を使用して同様のことを実現する方法はありますか?
Chrome 35+およびFirefox 41+は、CSSフォント読み込みAPI( [〜#〜] mdn [〜#〜] 、 W3C )。 _document.fonts
_を呼び出して、 FontFaceSet オブジェクトを取得します。このオブジェクトには、フォントのロードステータスを検出するための便利なAPIがいくつかあります。
check(fontSpec)
-指定されたフォントリスト内のすべてのフォントがロードされ、使用可能かどうかを返します。 fontSpec
は、 フォントのCSS省略表現 を使用します。document.fonts.check('bold 16px Roboto'); // true or false
document.fonts.ready
_ -フォントの読み込みとレイアウト操作が完了したことを示す Promise を返します。document.fonts.ready.then(function () { /*... all fonts loaded...*/ });
これらのAPIを示すスニペットと、フォントフェイスに関する追加情報を提供する_document.fonts.onloadingdone
_を次に示します。
_alert('Roboto loaded? ' + document.fonts.check('1em Roboto')); // false
document.fonts.ready.then(function () {
alert('All fonts in use by visible text have loaded.');
alert('Roboto loaded? ' + document.fonts.check('1em Roboto')); // true
});
document.fonts.onloadingdone = function (fontFaceSetEvent) {
alert('onloadingdone we have ' + fontFaceSetEvent.fontfaces.length + ' font faces loaded');
};
_
_<link href='https://fonts.googleapis.com/css?family=Roboto:400,700' rel='stylesheet' type='text/css'>
<p style="font-family: Roboto">
We need some text using the font, for the font to be loaded.
So far one font face was loaded.
Let's add some <strong>strong</strong> text to trigger loading the second one,
with weight: 700.
</p>
_
IE 11はAPIをサポートしていません。 IEをサポートする必要がある場合は、利用可能なポリフィルまたはサポートライブラリを確認してください。
Safari、Chrome、Firefox、Opera、IE7、IE8、IE9でテスト済み:
function waitForWebfonts(fonts, callback) {
var loadedFonts = 0;
for(var i = 0, l = fonts.length; i < l; ++i) {
(function(font) {
var node = document.createElement('span');
// Characters that vary significantly among different fonts
node.innerHTML = 'giItT1WQy@!-/#';
// Visible - so we can measure it - but not on the screen
node.style.position = 'absolute';
node.style.left = '-10000px';
node.style.top = '-10000px';
// Large font size makes even subtle changes obvious
node.style.fontSize = '300px';
// Reset any font properties
node.style.fontFamily = 'sans-serif';
node.style.fontVariant = 'normal';
node.style.fontStyle = 'normal';
node.style.fontWeight = 'normal';
node.style.letterSpacing = '0';
document.body.appendChild(node);
// Remember width with no applied web font
var width = node.offsetWidth;
node.style.fontFamily = font;
var interval;
function checkFont() {
// Compare current width with original width
if(node && node.offsetWidth != width) {
++loadedFonts;
node.parentNode.removeChild(node);
node = null;
}
// If all fonts have been loaded
if(loadedFonts >= fonts.length) {
if(interval) {
clearInterval(interval);
}
if(loadedFonts == fonts.length) {
callback();
return true;
}
}
};
if(!checkFont()) {
interval = setInterval(checkFont, 50);
}
})(fonts[i]);
}
};
次のように使用します。
waitForWebfonts(['MyFont1', 'MyFont2'], function() {
// Will be called as soon as ALL specified fonts are available
});
Google Web Fonts API(およびTypekit)で使用されるJSライブラリは、サービスなしで使用できます: WebFont Loader 。
それはあなたが求めるもののためのコールバックを定義し、 多くの 。
2017アップデート
JSライブラリ FontFaceObserver は、2017年の時点で間違いなく最高で最も軽量なクロスブラウザソリューションです。また、Promiseベースの.load()
インターフェイスも公開しています。