@font-face是CSS3的一个规则,允许开发者定义自定义字体并在网页中使用。当使用@font-face加载字体时,浏览器需要下载字体文件,这可能导致字体加载延迟(FOIT - Flash of Invisible Text)。
现代浏览器提供了FontFace API,可以通过document.fonts来检测字体是否加载完成:
// 定义字体
const font = new FontFace('MyFont', 'url(MyFont.woff2)');
// 加载字体并检测
document.fonts.add(font);
font.load().then(() => {
console.log('字体已加载');
// 在这里执行字体加载后的操作
}).catch((error) => {
console.error('字体加载失败:', error);
});
对于不支持FontFace API的旧浏览器,可以使用定时检测元素宽度的方法:
(function($) {
$.fn.fontLoaded = function(fontFamily, callback) {
var $test = $('<span style="visibility:hidden;position:absolute;top:-9999px;left:-9999px;">Hg</span>')
.css('font-family', 'sans-serif')
.appendTo('body');
var originalWidth = $test.width();
$test.css('font-family', fontFamily + ', sans-serif');
var checkFont = function() {
if ($test.width() !== originalWidth) {
$test.remove();
callback();
} else {
setTimeout(checkFont, 50);
}
};
checkFont();
};
})(jQuery);
// 使用方法
$(document).fontLoaded('MyCustomFont', function() {
console.log('自定义字体已加载');
// 执行相关操作
});
这是一个专门用于检测字体加载的轻量级库:
// 首先引入FontFaceObserver库
// <script src="https://cdnjs.cloudflare.com/ajax/libs/fontfaceobserver/2.1.0/fontfaceobserver.js"></script>
var font = new FontFaceObserver('MyFont', {
weight: 400
});
font.load().then(function () {
console.log('字体已加载');
$('body').addClass('fonts-loaded');
}).catch(function () {
console.log('字体加载失败');
});
原因:浏览器缓存可能导致检测失效 解决:确保每次检测都使用新的测试元素
原因:某些浏览器限制跨域字体检测 解决:确保字体文件有正确的CORS头
原因:频繁检测可能影响性能 解决:合理设置检测间隔,或使用现代API替代
/* 字体加载前的样式 */
body {
font-family: fallback-font, sans-serif;
visibility: hidden;
}
/* 字体加载后的样式 */
body.fonts-loaded {
font-family: MyCustomFont, sans-serif;
visibility: visible;
}
通过以上方法,你可以有效地检测@font-face字体的加载状态,并在加载完成后执行相应的操作。
没有搜到相关的沙龙