如何知道字体已被应用
How to know when font-face has been applied
我目前正在为一个客户建立一个企业网站,该客户广泛使用自定义字体。
在jquery DOM-ready上,我正在做位置计算,以找出一些具有动态宽度和高度的弹出菜单应该根据其动态内容放置的位置。
这些计算失败,因为DOM-ready在应用font-face之前被触发,因此宽度和高度是不正确的。
现在(对于原型),我在DOM-ready后500毫秒进行计算,以缓解这个问题,但由于明显的原因,这不能投入生产。
这个问题已经在最新的Firefox和chrome中被观察到。IE 8似乎没有这个问题,但是DOM-ready很晚才启动,所以我猜延迟是内建的:)
等待加载事件不是一个选项,所以我的问题是:
是否有一种可靠的跨浏览器方式来检测何时应用了font-face ?
我想知道为什么IE没有这个问题,我找到了一个解决方案。
Firefox和Chrome/Safari在应用font-face之前触发DOMContentLoaded
事件,从而导致问题。
解决方案是不听DOMContentLoaded
,而是去老派,听onreadystatechange
,等到document.readyState === 'complete'
,这总是触发后font-face应用(据我所知,我的测试)-这当然是什么总是发生在IE,因为它不支持DOMContentLoaded
。
基本上你可以在jQuery中滚动你自己的事件称为fontfaceapplied
-也许它应该内置;)
document.onreadystatechange = function() {
if (document.readyState === 'complete')
$(document).trigger('fontfaceapplied');
};
有趣的事实:Opera在右,等待触发DOMContentLoaded
,直到font-face应用
ES6 update:
这个问题是许多年前的IEs版本8和更早的版本还活着,甚至Ecmascript版本6还没有发布,但是现在你可以在document.fonts
事件上写回调。如:
document.fonts.onloadingdone = () => {
// do something after all fonts are loaded
};
>
设置该函数在超时200ms后触发可以解决使用Google Fonts时的此问题。
有一个明显的跳跃,但通常有相等高度的东西,对于纯粹主义者来说,这可能不是完美的,但它可以跨浏览器工作。
- 如何保护节点webkit应用程序上的字体
- 更改移动web应用程序的字体大小选项
- 如何在不下载的情况下将谷歌字体加载到chrome打包的应用程序中
- 如何增加安卓应用程序的jqMath公式的字体大小
- iOS 应用程序(iPhone 和 iPad)中的阿拉伯字体
- 如何在应用程序中更改字体样式
- 为什么我的Cordova应用程序在Windows Phone 8.1设备上的字体非常小
- 如何在结构文本对象中应用自定义字体
- 正在寻找一个类似谷歌字体的服务器应用程序,为任何浏览器/设备提供正确的字体
- 如何在应用程序再次运行后使访问的链接字体正常
- 是kindle阅读器应用程序's在浏览器应用程序中可能更改字体大小后重新计算页面内容
- 在我的sencha-touch/phonegap应用程序中设置IOS和Android字体的最佳方法是什么?
- FontAwesome无法在本地和电子应用程序中加载字体
- CSS—根据字体大小选择元素,并动态地将样式应用于该文本
- 我怎样才能正确地创建一个可满足内容的字体测试器?类型编辑器与CSS类应用的JQuery
- 除了查看之外,还有什么方法可以知道当前在HTML元素上应用的是哪种字体吗?
- 无法从HTML页面中的css应用字体族
- 如何在":"之前的字符上应用字体正则表达式
- 名称中有空格的字体在CKEditor中没有正确应用
- 如何知道字体已被应用