是否可以在页面加载之前预加载或以其他方式缓存@ font-face字体(最有可能使用javascript),以便在页面最终加载时不会出现难看的跳转?
是否可以在页面加载之前预加载或以其他方式缓存@ font-face字体(最有可能使用javascript),以便在页面最终加载时不会出现难看的跳转?
Answers:
我目前尚无任何避免字体加载时出现闪烁的技术,但是您可以通过为字体发送适当的缓存头并确保该请求尽快通过来最大程度地减少闪烁。
由于2017年你有预紧
MDN:元素的rel属性的preload值允许您在HTML中编写声明性的获取请求,从而指定页面在加载后不久将需要的资源,因此,您希望在页面加载的生命周期中尽早开始预加载,然后浏览器的主要渲染机制就会启动。这确保了它们较早可用,并且不太可能阻塞页面的第一个渲染,从而提高了性能。
<link rel="preload" href="/fonts/myfont.eot" as="font" crossorigin="anonymous" />
始终检查浏览器的兼容性。
这对于字体预加载(不等待浏览器在某些CSS中找到字体)最有用。您还可以预加载一些徽标,图标和脚本。
crossorigin
即使字体是从相同的原点加载的,也是必需的。提供类型提示也很好。
一种简单的方法是将其放在索引中:
<div class="font_preload" style="opacity: 0">
<span style="font-family: 'myfontface#1font-family', Arial, sans-serif;"></span>
<span style="font-family: 'myfontface#2font-family', Arial, sans-serif;"></span>
...
</div>
已在Chrome 34,Safari 7和FF 29和IE 11上进行测试
这里有一些“预加载”的技术:http : //paulirish.com/2009/fighting-the-font-face-fout/
主要是诱使浏览器尽可能快地下载文件。
您也可以将其作为数据URI交付,这很有帮助。并且您还可以隐藏页面内容并在页面准备就绪时显示它。
您的头部应包括如下的预紧力:
<head>
...
<link rel="preload" as="font" href="/somefolder/font-one.woff2">
<link rel="preload" as="font" href="/somefolder/font-two.woff2">
</head>
这样,woff2将由支持预加载的浏览器预加载,并且所有后备格式将按通常的方式加载。
而且您的CSS字体外观应与此相似
@font-face {
font-family: FontOne;
src: url(../somefolder/font-one.eot);
src: url(../somefolder/font-one.eot?#iefix) format('embedded-opentype'),
url(../somefolder/font-one.woff2) format('woff2'), //Will be preloaded
url(../somefolder/font-one.woff) format('woff'),
url(../somefolder/font-one.ttf) format('truetype'),
url(../somefolder/font-one.svg#svgFontName) format('svg');
}
@font-face {
font-family: FontTwo;
src: url(../somefolder/font-two.eot);
src: url(../somefolder/font-two.eot?#iefix) format('embedded-opentype'),
url(../somefolder/font-two.woff2) format('woff2'), //Will be preloaded
url(../somefolder/font-two.woff) format('woff'),
url(../somefolder/font-two.ttf) format('truetype'),
url(../somefolder/font-two.svg#svgFontName) format('svg');
}
正确的字体预加载是HTML5规范中的一个大漏洞。我已经仔细研究了所有这些内容,发现的最可靠的解决方案是使用Font.js:
http://pomax.nihongoresources.com/pages/Font.js/
您可以使用与加载图片相同的API来加载字体
var anyFont = new Font();
anyFont.src = "fonts/fileName.otf";
anyFont.onload = function () {
console.log("font loaded");
}
比Google笨拙的Webfont Loader更加简单,轻巧
这是Font.js的github存储库:
通过Google的webfontloader
var fontDownloadCount = 0;
WebFont.load({
custom: {
families: ['fontfamily1', 'fontfamily2']
},
fontinactive: function() {
fontDownloadCount++;
if (fontDownloadCount == 2) {
// all fonts have been loaded and now you can do what you want
}
}
});
这应该可以解决您的问题。
回答您的第一个问题:是的,您可以。虽然目前仅Gecko和WebKit浏览器支持它。
您只需要在头部添加链接标签:
<link rel="prefetch" href="pathto/font">
<link rel="prerender" href="pathto/page">
prerender
和不preload
?它是一种字体,而不是HTML文件,没有任何可渲染的内容
使用标准的CSS字体加载API。
等待(全部)字体加载,然后显示您的内容:
document.fonts.ready.then((fontFaceSet) => {
console.log(fontFaceSet.size, 'FontFaces loaded.');
document.getElementById('waitScreen').style.display = 'none';
});
我发现最好的方法是预加载包含字体的样式表,然后让浏览器自动加载它。我在其他位置(在html页面中)使用了字体,但是随后我可以短暂观察到字体更改的效果。
<link href="fonts.css?family=Open+Sans" rel="preload stylesheet" as="style">
然后在font.css文件中,指定以下内容。
@font-face {
font-family: 'Open Sans';
font-style: normal;
font-weight: 400;
src: local('Open Sans Regular'), local('OpenSans-Regular'),
url('open-sans-v16-latin-regular.woff2') format('woff2'); /* Super Modern Browsers */
}
通过链接标记预加载字体时,无法为字体分配名称(如果我错了,请纠正我,我仍然无法找到方法),因此,您必须使用font-face将名称分配给字体。即使可以通过链接标记加载字体,也不建议您这样做,因为您无法为其指定名称。没有像字体一样的名称,您将无法在网页的任何地方使用它。根据gtmetrix的说法,样式表首先加载,然后按顺序加载其余脚本/样式,然后加载dom之前的字体,因此看不到字体更改效果。
最近,我正在开发与CocoonJS兼容的游戏,但DOM限于canvas元素-这是我的方法:
将fillText与尚未加载的字体一起使用将可以正常执行,但没有视觉反馈-因此画布平面将保持不变-您要做的就是定期检查画布是否有任何更改(例如,遍历getImageData搜索任何非透明像素),当字体正确加载时会发生这种情况。
我在最近的文章http://rezoner.net/preloading-font-face-using-canvas,686中对这种技术进行了更多解释
Google为此提供了一个不错的库:https : //developers.google.com/webfonts/docs/webfont_loader 您几乎可以使用任何字体,而lib会将类添加到html标记中。
它甚至为您提供有关何时加载并激活certrain字体的javascript事件!
不要忘记为您的字体文件提供压缩文件!它肯定会加快速度!