使用jQuery知道何时加载@ font-face字体?

Nic*_*ard 41 javascript css jquery font-face

我正在使用@ font-face而且我讨厌Firefox显示默认字体,等待加载@ font-face字体,然后替换它.所以整个页面都闪烁着新的字体.

Webkit浏览器在加载字体之前不会显示文本,而且外观更清晰.

所以,我想知道jQuery是否可以帮助我知道何时加载页面上的所有数据,包括@ font-face文件,以便我可以显示我的文本?是否有一个jQuery方法告诉我什么时候加载?

Tho*_*hem 52

我使用此功能 - 在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 + ', 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]);
    }
};
Run Code Online (Sandbox Code Playgroud)

使用它像:

waitForWebfonts(['MyFont1', 'MyFont2'], function() {
    // Will be called as soon as ALL specified fonts are available
});
Run Code Online (Sandbox Code Playgroud)

  • 优秀的非浮动解决方案.有没有人遇到过不会导致大小改变的字体(因此锁定!也许max_time_to_wait会谨慎......)? (3认同)
  • 看起来有点不幸的是你为每种字体创建了一个`setInterval()`.宁可有一个`setInterval()`来检查仍然需要检查的所有字体. (3认同)
  • 在Chrome 39中不起作用.调用回调时,会加载字体,但我的页面上有许多元素仍然以后备字体(Arial)呈现. (2认同)

Nic*_*ard 25

好的,这很简单.基本上我只是将我的文字设置为:

a.main {visibility: hidden;}
Run Code Online (Sandbox Code Playgroud)

然后添加:

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

然后确保以下内容也在我的css文件中:

a.main.shown {visibility: visible;}
Run Code Online (Sandbox Code Playgroud)

  • load事件等待Firefox中的字体文件,但不是WebKit.所以这不可靠. (40认同)
  • 不吝啬需要,只需使用:<NOSCRIPT> <STYLE> a.主{能见度:可见;} </样式> </ NOSCRIPT> (24认同)
  • 对那些关闭JavaScript的愚蠢用户表示遗憾. (16认同)
  • 如果这是一个问题,也许可以使用这个<noscript> <font color ='Red'> <h1>请启用JavaScript失败者!</ h1> </ font> </ noscript> ;-) (10认同)
  • 在我自己的网站上,我不关心是否关闭了JavaScript的用户会丢失很多功能,但如果你有这个功能导致页面的关键部分消失,没有任何理由 - 这在我看来引起关注. (3认同)

小智 17

你不应该使用$(window).bind('load')- 等待整个页面加载(这可能是你想要的),而不仅仅是字体.如果你想控制@ font-faces的加载过程,请使用由Google和Typekit开发的WebFont Loader.

您可以将它与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/