83

Font-Awesome を使用していますが、フォント ファイルが読み込まれていない間、アイコンが  で表示されます。

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) については話していません。

4

10 に答える 10

44

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 */
}

編集: FontAwesome の互換性は、適切に動作せず、異なるバージョンで問題が発生したため削除されました。ハック修正はこちらにあります: https://github.com/patrickmarabeas/jQuery-FontFaceSpy.js/issues/1

于 2012-09-07T10:31:03.870 に答える
21

Google と Typekit によって開発されたWebFont Loader ( github repo ) を試してください。

この例では、最初にデフォルトのセリフ フォントでテキストを表示します。フォントがロードされた後、指定されたフォントでテキストを表示します。(このコードは、他のすべての最新ブラウザーで Firefox のデフォルトの動作を再現しています。)

于 2012-09-07T05:55:47.053 に答える
3

タイマーをまったく使用せずに @font-face が既にロードされているかどうかを知る別の方法を次に示します。慎重に作成された要素のサイズが変更されたときに、「スクロール」イベントを使用して瞬間的なイベントを受け取ります。

それがどのように行われたかについてのブログ投稿を書き、Github でライブラリを公開しました。

于 2013-04-08T15:42:24.897 に答える
1

次のようなものを試してください

$(window).bind("load", function() {
       $('#text').addClass('shown');
});

そして、する

#text {visibility: hidden;}
#text.shown {visibility: visible;}

load イベントは、フォントが読み込まれた後に発生する必要があります。

于 2012-09-07T05:50:42.337 に答える
1

font-display: blockまたは、 @font-face 宣言に追加することもできます。

これにより、ブラウザは、フォントがロードされるまでフォールバック フォントを非表示としてレンダリングするように指示されますdisplay: none。JavaScript ロード フォントの検出は必要ありません。

于 2021-04-13T23:49:06.517 に答える
-3

以下のコードを使用します。

<!DOCTYPE HTML>
<html>
    <head>
    </head>

<body>
<canvas id="canvasFont" width="40px" height="40px" style="position: absolute; display: none;"></canvas>

<script>
function IsLoadedFonts()
    {
        var Args = arguments;
        var obj = document.getElementById('canvasFont');
        var ctx = obj.getContext("2d");
        var baseFont = (/chrome/i.test(navigator.userAgent))?'tims new roman':'arial';
         //................
          function getImg(fon)
          { 
            ctx.clearRect(0, 0, (obj).width, (obj).height);
            ctx.fillStyle = 'rgba(0,0,0,1.0)';
            ctx.fillRect( 0, 0, 40, 40 );
            ctx.font = '20px '+ fon;
            ctx.textBaseline = "top";
            ctx.fillStyle = 'rgba(255,255,255,1.0)';
            ctx.fillText( '\u0630', 18, 5 );
            return ctx.getImageData( 0, 0, 40, 40 );
          };
        //..............
          for(var i1=0; i1<Args.length; i1++)
          {
            data1 = getImg(Args[i1]);
            data2 = getImg(baseFont);
            var isLoaded = false;
            //...........
            for (var i=0; i<data1.data.length; i++)
            {
                if(data1.data[i] != data2.data[i])
                    {isLoaded = true; break;}
            }
            //..........
            if(!isLoaded)
                    return false;
         }
         return true;
    };

     setTimeout(function(){alert(IsLoadedFonts('myfont'));},100);
   </script>
   </body>

多くのフォントをチェックできます:

setTimeout(function(){alert(IsLoadedFonts('font1','font2','font3'));},100);

以下のコードは Opera でのみ機能しますが、簡単です。

if(!document.defaultView.getComputedStyle(document.getElementById('mydiv'))['fontFamily'].match(/myfont/i))
          alert("font do not loaded ");
于 2015-05-21T09:35:17.297 に答える