[解決済み] フォント(@font-face)がすでに読み込まれているかどうかを知るには?
質問
Font-Awesomeを使っていますが、フォントファイルが読み込まれないのに、アイコンは.NETで表示されます。
そこで、これらのアイコンに
display:none
を表示させたいのです。
@font-face {
font-family: "FontAwesome";
src: url('../font/fontawesome-webfont.eot');
src: url('../font/fontawesome-webfont.eot?#iefix') format('eot'), url('../font/fontawesome-webfont.woff') format('woff'), url('../font/fontawesome-webfont.ttf') format('truetype'), url('../font/fontawesome-webfont.svg#FontAwesome') format('svg');
font-weight: normal;
font-style: normal;
}
これらのファイルが読み込まれ、ようやくアイコンを表示できるようになったことを知るにはどうしたらよいでしょうか。
編集してください。 ページがロードされた時(onload)の話ではないです。フォントはページ全体より先にロードされる可能性があるからです。
どのように解決するのですか?
GitHubで公開中です。 https://github.com/patrickmarabeas/jQuery-FontSpy.js
基本的に、このメソッドは 2 つの異なるフォントで文字列の幅を比較することで動作します。テストするフォントとして Comic Sans を使用します。これは、Web セーフ フォントの中で最も異なっており、また、使用するカスタム フォントと十分に異なることを期待しているからです。また、非常に大きなフォントサイズを使用しているため、わずかな違いも明らかになります。Comic Sans文字列の幅が計算されると、font-familyがカスタムフォントに変更され、Comic Sansにフォールバックされます。チェックしたとき、文字列要素の幅が同じであれば、フォールバックフォントのComic Sansがそのまま使用されます。そうでない場合は、あなたのフォントが動作するはずです。
フォントの読み込み検出方法を jQuery プラグインに書き直し、フォントが読み込まれたかどうかに基づいて要素をスタイル設定する能力を開発者に与えるように設計しました。フェールセーフ タイマーが追加され、カスタム フォントの読み込みに失敗しても、ユーザーがコンテンツなしで放置されることがなくなります。それは単に悪いユーザビリティです。
私はまた、クラスの追加と削除を含めることで、フォントの読み込み中と失敗時に何が起こるかについて、より大きな制御を追加しました。これで、フォントに好きなことを何でもできるようになりました。フォントのサイズ、行間などを変更して、フォールバック フォントをカスタム フォントにできるだけ近づけ、レイアウトをそのまま維持し、ユーザーが期待通りのエクスペリエンスを得られるようにすることだけをお勧めします。
以下はデモです。 http://patrickmarabeas.github.io/jQuery-FontSpy.js
以下を.jsファイルに放り込んで参照します。
(function($) {
$.fontSpy = function( element, conf ) {
var $element = $(element);
var defaults = {
font: $element.css("font-family"),
onLoad: '',
onFail: '',
testFont: 'Comic Sans MS',
testString: 'QW@HhsXJ',
delay: 50,
timeOut: 2500
};
var config = $.extend( defaults, conf );
var tester = document.createElement('span');
tester.style.position = 'absolute';
tester.style.top = '-9999px';
tester.style.left = '-9999px';
tester.style.visibility = 'hidden';
tester.style.fontFamily = config.testFont;
tester.style.fontSize = '250px';
tester.innerHTML = config.testString;
document.body.appendChild(tester);
var fallbackFontWidth = tester.offsetWidth;
tester.style.fontFamily = config.font + ',' + config.testFont;
function checkFont() {
var loadedFontWidth = tester.offsetWidth;
if (fallbackFontWidth === loadedFontWidth){
if(config.timeOut < 0) {
$element.removeClass(config.onLoad);
$element.addClass(config.onFail);
console.log('failure');
}
else {
$element.addClass(config.onLoad);
setTimeout(checkFont, config.delay);
config.timeOut = config.timeOut - config.delay;
}
}
else {
$element.removeClass(config.onLoad);
}
}
checkFont();
};
$.fn.fontSpy = function(config) {
return this.each(function() {
if (undefined == $(this).data('fontSpy')) {
var plugin = new $.fontSpy(this, config);
$(this).data('fontSpy', plugin);
}
});
};
})(jQuery);
プロジェクトに適用する
.bannerTextChecked {
font-family: "Lobster";
/* don't specify fallback font here, do this in onFail class */
}
$(document).ready(function() {
$('.bannerTextChecked').fontSpy({
onLoad: 'hideMe',
onFail: 'fontFail anotherClass'
});
});
そのFOUCを削除してください
.hideMe {
visibility: hidden !important;
}
.fontFail {
visibility: visible !important;
/* fall back font */
/* necessary styling so fallback font doesn't break your layout */
}
EDIT: FontAwesomeの互換性は、正しく動作せず、異なるバージョンで問題が発生したため、削除しました。修正方法はこちらです。 https://github.com/patrickmarabeas/jQuery-FontFaceSpy.js/issues/1
関連
-
[解決済み] どのラジオボタンが選択されているかをjQueryで知るにはどうしたらよいですか?
-
[解決済み] JavaScriptで、ある文字列が別の文字列の中に出現するすべてのインデックスを見つけるにはどうすればよいですか?
-
[解決済み] Javascript / jQueryでAndroid端末を検出する。
-
[解決済み] JavaScriptでの大文字小文字を区別しない正規表現
-
[解決済み] JavaScript のオブジェクトの配列を比較し、最小値/最大値を取得する
-
[解決済み] AJAX Mailchimp サインアップフォームの統合
-
[解決済み] Node.jsのES6クラスをrequireで作る
-
[解決済み] なぜjavascriptのES6 Promisesはresolve後も実行を継続するのですか?
-
[解決済み] JavaScript で css プロパティを使用して HTML 要素の背景色を設定する方法
-
[解決済み] querySelectorAllがない場合、ライブラリを使用せずに属性で要素を取得する?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] なぜJavaScriptでは!{}[true]がtrueに評価されるのですか?
-
[解決済み] javascriptで2つの数値を連結する方法は?
-
[解決済み] javascript の関数から `undefined` と `null` のどちらを返すのが良いのでしょうか?
-
[解決済み] JavaScriptで:hoverのCSSプロパティを変更する
-
[解決済み] Javascript / jQueryでAndroid端末を検出する。
-
[解決済み] moment.jsでミュータビリティを回避するには?
-
[解決済み] AngularJS - ngRepeatフィルタリングされた結果の参照を取得する方法
-
[解決済み] javascriptで文字列から関数を作成する方法はありますか?
-
[解決済み] なぜjavascriptのES6 Promisesはresolve後も実行を継続するのですか?
-
[解決済み] JavaScript で css プロパティを使用して HTML 要素の背景色を設定する方法