当前位置: 首页 > 面试题库 >

如何知道字体(@ font-face)是否已经加载?

曹经业
2023-03-14
问题内容

我使用的是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),因为字体可以在整个页面之前加载。


问题答案:

现在在GitHub上:

本质上,该方法通过比较两种不同字体的字符串宽度来工作。我们使用Comic
Sans作为测试字体,因为它是网络安全字体中最不同的字体,希望与您将要使用的任何自定义字体都足够不同。此外,我们使用了非常大的字体,因此即使很小的差异也会很明显。计算出Comic
Sans字符串的宽度后,字体系列将更改为您的自定义字体,而回退到Comic Sans。选中该选项后,如果字符串元素的宽度相同,则仍将使用Comic
Sans的后备字体。如果没有,您的字体应该可以使用。


我将字体加载检测的方法重写为一个jQuery插件,该插件旨在使开发人员能够根据是否已加载字体来对元素进行样式设置。添加了故障安全计时器,因此,如果自定义字体无法加载,则不会为用户留下任何内容。那只是不好的可用性。

我还增加了对字体加载过程中发生的事情的控制,并通过添加和删除类来控制失败。现在,您可以对字体进行任何操作。我只建议修改字体大小,行距等,以使后备字体尽可能接近自定义字体,以使布局保持完整,并为用户带来预期的体验。

将以下内容放入.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兼容性被删除,因为它不能正常工作,并遇到了不同版本的问题。



 类似资料:
  • 问题内容: 我正在使用@ font-face,但我讨厌Firefox显示默认字体,等待加载@ font-face字体,然后替换它。因此,整个页面都会以新字体闪烁。 Webkit浏览器只是在加载字体后才显示文本,而且外观更加简洁。 因此,我想知道jQuery是否可以帮助我知道何时加载页面上的所有数据(包括@ font- face文件),以便随后显示文本?是否有一个jQuery方法告诉我何时加载了所有

  • 问题内容: 是否可以在页面加载之前预加载或以其他方式缓存@ font-face字体(最有可能使用javascript),以便在页面最终加载时不会出现难看的跳转? 问题答案: 我目前尚无任何避免字体加载时出现闪烁的技术,但是您可以通过为字体发送适当的缓存头并确保该请求尽快通过来最大程度地减少闪烁。

  • 问题内容: 我正在尝试使用CSS文件加载字体,但是字体从未加载。这是我的目录结构。 然后在我有加载程序来获取字体。 在我的CSS文件中,我有以下内容: 最后,我使用以下命令调用我的CSS文件: 一切正常,但字体永远不会加载。 问题答案: 在尝试了很多东西之后,下一个装载机完成了工作。我使用url-loader代替了文件加载器。您需要安装url-loader。

  • 问题内容: 什么是正确的使用方式,以便浏览器不会在用户已经拥有字体的情况下下载它? 我正在使用@ font-face定义DejaVu,它已经安装在我的系统(linux)上。Firefox不会下载字体,但是Chromium每次都会下载它! 我的CSS代码基于字体松鼠,该问题如下所示: 问题答案: 如果要先检查本地文件,请执行以下操作:

  • @font-face跟其在CSS中作用表现一样,在后面简单地添加个块状属性即可,类似下面: @font-face font-family Geo font-style normal src url(fonts/geo_sans_light/GensansLight.ttf) .ingeo font-family Geo 生成为: @font-face { font-famil

  • 问题内容: 我的应用程序的Web UI层中有一个JPA实体实例。我想随时知道此实体是否已经保存在数据库中或仅存在于用户会话中。 它将在业务层中,我将使用entitymanager.contains(Entity)方法,但是在我的UI层中,我认为我需要一个额外的属性来指示实体是否已保存。如何实施?我目前正在考虑以下选择: 由数据库设置默认值的JPA属性,但是每次更新后是否会强制进行新的读取? 在我的