Как получить уведомление после загрузки веб-шрифта - PullRequest
46 голосов
/ 15 апреля 2011

Google Web Fonts API предлагает способ определения функций обратного вызова, которые будут выполняться, если шрифт завершил загрузку или не мог быть загружен и т. Д. Есть ли способ добиться чего-то подобного с помощью веб-шрифтов CSS3 (@ font-face)

Ответы [ 5 ]

78 голосов
/ 30 августа 2015

2015 Обновление

Chrome 35+ и Firefox 41+ реализуют API загрузки шрифтов CSS ( MDN , W3C ). Вызовите document.fonts, чтобы получить FontFaceSet объект, который имеет несколько полезных API для определения состояния загрузки шрифтов:

  • check(fontSpec) - возвращает все ли шрифты в данном списке шрифтов были загружены и доступны. fontSpec использует сокращенный синтаксис CSS для шрифтов .
    Пример: document.fonts.check('bold 16px Roboto'); // true or false
  • document.fonts.ready - возвращает Обещание , указывающее, что загрузка шрифта и операции макета выполнены.
    Пример: 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:

16 голосов
/ 27 июля 2012

Протестировано в 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
});
12 голосов
/ 15 апреля 2011

Библиотека JS, используемая Google Web Fonts API (и Typekit), может использоваться без службы: WebFont Loader .

Он определяет обратные вызовы для того, что вы спрашиваете, и еще много .

4 голосов
/ 29 июня 2017

2017 Обновление

Библиотека JS FontFaceObserver определенно является лучшим, наиболее легким кросс-браузерным решением по состоянию на 2017 год. Кроме того, в нем реализована поддержка Promise..load() интерфейс.

0 голосов
/ 15 апреля 2011

Событие window.load сработает, когда все загрузится - это должно включать шрифты, так что вы можете использовать это как обратный вызов.Однако я не думаю, что вам нужно, если вы решите использовать загрузчик веб-шрифтов как

В дополнение к опциям google, typekit, ascender и monotype, есть также пользовательский модуль, который может загружатьтаблица стилей от любого поставщика веб-шрифтов.

WebFontConfig = {custom: {family: ['OneFont', 'AnotherFont'], URL: ['http://myotherwebfontprovider.com/stylesheet1.css',' http://yetanotherwebfontprovider.com/stylesheet2.css']}};

Библиотека отправляет одинаковые события независимо от того, какого провайдера вы указали.

...