Подтвердить что ты не робот

С помощью jQuery узнать, когда загружаются шрифты шрифта @font-face?

Я использую @font-face, и я ненавижу, что Firefox показывает шрифт по умолчанию, ждет загрузки шрифта @font-face, а затем заменяет его. Таким образом, вся страница мигает с новым шрифтом.

Браузеры Webkit просто не отображают текст до тех пор, пока шрифт не будет загружен, и он будет выглядеть более чистым.

Итак, мне интересно, может ли jQuery помочь мне узнать, когда загружаются все данные на странице, в том числе файл @font-face, чтобы я мог показывать свой текст? Есть ли способ jQuery, который сообщает мне, когда все загружено?

4b9b3361

Ответ 1

Хорошо, это было довольно легко. В основном я просто установил свой текст:

a.main {visibility: hidden;}

а затем добавьте:

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

Затем убедитесь, что в моем файле css указано следующее:

a.main.shown {visibility: visible;}

Ответ 2

Я использую эту функцию, протестированную в 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 = '[email protected]!-/#';
            // 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 + ', sans-serif';

            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
});

Ответ 3

Вы не должны использовать $(window).bind('load') - это будет ждать загрузки всей страницы (что может быть и того, чего вы хотите), а не только шрифта. Если вы хотите контролировать процесс загрузки @font-faces, используйте WebFont Loader, разработанный Google и Typekit.

Вы можете использовать его с Google Font API, typekit и вашим собственным поставщиком webfont - вы (хотя я никогда не пробовал это сам, поскольку я являюсь пользователем Typekit.

Читайте об этом здесь: http://code.google.com/apis/webfonts/docs/webfont_loader.html и здесь: http://blog.typekit.com/2010/05/19/typekit-and-google/

Ответ 4

Я использую веб-шрифты Google (Crete Round Regular и Open Sans Regular с жирным шрифтом)

Вы можете использовать либо это:

var fonts = $.Deferred();
WebFontConfig = { google: { families: [ 'Crete+Round::latin', 'Open+Sans:400,700:latin' ] } , active : function() { fonts.resolve(); } };
(function() {
    var wf = document.createElement('script');
    wf.src = ('https:' == document.location.protocol ? 'https' : 'http') + '://ajax.googleapis.com/ajax/libs/webfont/1/webfont.js';
    wf.type = 'text/javascript';
    wf.async = 'true';
    var s = document.getElementsByTagName('script')[0];
    s.parentNode.insertBefore(wf, s);
})();
fonts.done(function(){ alert('fonts'); });

или это:

WebFontConfig = { google: { families: [ 'Crete+Round::latin', 'Open+Sans:400,700:latin' ] } , active : function() { alert('fonts'); } };
(function() {
    var wf = document.createElement('script');
    wf.src = ('https:' == document.location.protocol ? 'https' : 'http') + '://ajax.googleapis.com/ajax/libs/webfont/1/webfont.js';
    wf.type = 'text/javascript';
    wf.async = 'true';
    var s = document.getElementsByTagName('script')[0];
    s.parentNode.insertBefore(wf, s);
})();

Обратите внимание, что в первом варианте я использовал jQuery отложенный объект.

Ответ 5

Может..

Создайте z-index: -10 div и заполните его большим количеством текста (с "нормальным" шрифтом). На document.ready() или другом событии:

var originalnumber = $( div ).width() + $( div ).height() + $( div ).offset().top + $( div ).offset().left;

$( div ).css( 'font-family', 'MyPrettyWebfont' );

var interval = setInterval( function() {
    var number = $( div ).width() + $( div ).height() + $( div ).offset().top + $( div ).offset().left;

    if ( number !== originalnumber ) {
        // webfont is loaded and applied!
        clearInterval( interval );
    }
}, 10 );

Ответ 6

У меня такая же проблема. И почему-то я не могу заставить загрузчик Google Webfont работать с шрифтом ttf (особенно с китайскими шрифтами) или отправлять ответ jquery при загрузке шрифта.

Поэтому я придумал это более базовое решение, которое полезно при динамическом изменении шрифта после загрузки страницы. он показывает, когда шрифт правильно загружен.

Сначала я создаю фиктивный div и затем заполняю его "abcd", а затем даю ему размер шрифта 40, записывая ширину div. Когда событие "изменить шрифт" вызывается с помощью кнопки или чего-то еще, оно должно отслеживать изменения размера фиктивной div. Изменение ширины будет означать, что шрифт изменился.

HTML-код

<style>
    @font-face {
     font-family: 'font1';
     src:url('somefont.ttf')  format('truetype');
     }
</style>
<div id="dummy" style="border:1px solid #000; display:inline-block">abdc</div>

<!--simple button to invoke the fontchange-->
<input type="button" onclick="javascript:changefont('font1')" value="change the font"/>

JQuery

//create a variable to track initial width of default font
var trackwidth

//when change font is invoke
function changefont(newfont)
{
   //reset dummy font style
    $('#dummy').css('font-family','initial !important;');
    $('#dummy').css({'font-size':'40px'});
    $('#dummy').html('abcd');

    //ensure that trackwidth is only recorded once of the default font
    if(trackwidth==null)
    {
       trackwidth=( $('#dummy').width());
    }

    //apply new font
    $('#dummy').css('font-family',newfont);
    checkwidth()
}

function checkwidth()
{
   //check if div width changed
   if($('#dummy').width() == trackwidth)
    {
        //if div never change, detect again every 500 milisecs
        setTimeout(checkwidth, 500);
    }
    else
    {
      //do something, font is loaded!
    }
}

Ответ 7

У меня такая же проблема, и я пытаюсь использовать функцию readyfunction(), функцию bind() и некоторые другие, которые я нашел, но никто из них не работает. Наконец, я нашел одно решение, просто приложив одну задержку до загрузки анимации... вот так:

$(document).ready(function() {

setTimeout(function (){
   // The animation
},150);

}); // end ready

Я знаю, что это не лучшее решение, так может кто-то сказать мне лучше?

Спасибо!