我不确定每种浏览器是否有所不同,主要是为Webkit开发。

加载供画布元素使用的字体很容易,使用@ font-face ...,除非看起来实际的字体文件直到第一次使用才加载。

如果我根本不使用HTML中的字体,这会在画布元素中造成问题,第一次调用自定义字体时,它将以默认字体生成文本...。但是,以后尝试使用该字体都很好并使用引用的自定义字体,就好像它是由于原始调用而加载的一样。

问题1,此标准是否适用于所有浏览器?如果在CSS中声明了字体,该怎么下载?还是第一次使用?

是否有将字体加载到DOM的“最佳实践”?这是一个图形项目,我宁愿不要在CSS中声明所有可能的字体。我也只想加载将要使用的字体。有没有更好的方法来使用JavaScript加载字体?

最佳答案

问题1,此标准是否适用于所有浏览器?是下载的字体
  是否在CSS中声明?还是第一次使用?


字体加载是异步的,这意味着在使用画布时,字体可能仍会在后台加载。对于画布,这个问题在您第一次绘制时就立即显现出来。

对于DOM,尽管会导致臭名昭著的FOUT和FOIT,或未样式化文本的闪烁和不可见文本的闪烁,但可以在以后更新内容。但是对于画布,当准备使用字体时,需要手动重绘内容(或搁置内容,这会导致客户端的不便延迟)。

话虽这么说-特定的浏览器可能会实施不同的加载策略-而且我们不一定总是知道何时何地加载,并且在任何情况下都必须考虑画布,因此供应商必须遵循类似的策略。

通常,它是"old" problem,并且要根据您要支持的浏览器的年代而改变并不容易。而且情况并不理想。

有一些库可以帮助您解决加载/就绪问题(请记住,这些库本身会增加延迟),例如Google提到的Font Loader库。您可以通过使用CDN作为字体并将字体存储在localStorage中来进一步提高速度。

这些库针对的是更多需要路径和度量信息的人,如果它们被证明对动态加载字体很有用,我将包括它们:Font.jsOpenType.js

另请参阅这些文章,以获取有关改善字体加载的提示和技巧以及解决方法:


Font Loading Revisited with Font Events(2015-02-16)
Non-blocking web fonts using LocalStorage(2014-12-31)


关于可用于画布的字体-我确实在this answer之前提供了一个替代选项,尽管这是一种蛮力的方法,但是专门用于画布。

07-24 09:50
查看更多