JS怎样检测字体加载完成 4个回调函数确保字体加载后渲染

处理字体加载失败的方法包括:1. 设置超时时间,通过 fontfaceobserver 的超时参数确保长时间未加载时触发失败回调;2. 使用 css 设置备用字体以保证内容可读性;3. 在失败回调中加入重试机制,并限制最大重试次数防止无限循环;4. 提示用户刷新页面或检查网络连接。此外,优化字体加载性能可通过使用 woff2 格式、字体子集化、cdn 托管、预加载字体文件以及合理设置 font-display 属性避免 foit 和 fout 问题。浏览器对 fontface api 支持良好,现代浏览器均可使用,而老浏览器需降级处理。综合运用 fontfaceobserver 及相关策略可有效提升字体加载的稳定性和用户体验。

JS怎样检测字体加载完成 4个回调函数确保字体加载后渲染

JS检测字体加载完成,核心在于利用浏览器的字体加载API,并结合回调函数,确保在字体可用后才进行渲染,避免出现“闪烁”或排版错乱。关键点在于FontFaceObserver或类似库的使用,以及对不同浏览器兼容性的处理。

JS怎样检测字体加载完成 4个回调函数确保字体加载后渲染

// 假设你已经引入了 FontFaceObserver 库function detectFontLoad(fontFamily, successCallback, loadingCallback, activeCallback, inactiveCallback) {  const font = new FontFaceObserver(fontFamily);  font.load().then(function () {    console.log(fontFamily + ' 加载成功');    if (successCallback) successCallback();    if (activeCallback) activeCallback(); // 触发 active 回调,表示字体已成功加载并激活  }, function () {    console.log(fontFamily + ' 加载失败');    if (inactiveCallback) inactiveCallback(); // 触发 inactive 回调,表示字体加载失败  });  if (loadingCallback) loadingCallback(); // 立即触发 loading 回调,表示字体开始加载}// 使用示例detectFontLoad('MyCustomFont',  function() {    // 字体加载成功后的处理    document.body.classList.add('fonts-loaded'); // 添加一个 class,通过 CSS 控制渲染  },  function() {    // 字体开始加载    console.log('字体开始加载...');  },  function() {    // 字体已激活(成功加载并应用)    console.log('字体已激活!');  },  function() {    // 字体加载失败    console.error('字体加载失败!');  });// CSS 示例 (配合 JS)/*body {  font-family: sans-serif; // 默认字体}body.fonts-loaded {  font-family: 'MyCustomFont', sans-serif; // 替换为自定义字体}*/

如何处理字体加载失败的情况?

字体加载失败是真实存在的,网络不稳定、字体文件损坏都可能导致失败。不能仅仅依赖于成功加载的回调。

JS怎样检测字体加载完成 4个回调函数确保字体加载后渲染设置超时: FontFaceObserver 允许设置超时时间。超过这个时间,即使字体没有加载完成,也会触发失败回调。回退字体: 在 CSS 中,始终设置一个备用字体。如果自定义字体加载失败,浏览器会自动使用备用字体,保证内容的可读性。重试机制: 可以尝试在失败回调中重新加载字体。但要注意避免无限循环,可以设置最大重试次数。用户提示: 如果字体加载持续失败,可以向用户显示一个提示信息,告知他们可能需要刷新页面或检查网络连接。

// 改进后的 detectFontLoad 函数,增加超时和重试机制function detectFontLoadWithRetry(fontFamily, successCallback, loadingCallback, activeCallback, inactiveCallback, maxRetries = 3, retryDelay = 1000) {  let retries = 0;  function loadFont() {    const font = new FontFaceObserver(fontFamily);    font.load(null, 5000).then(function () { // 设置超时时间为 5 秒      console.log(fontFamily + ' 加载成功');      if (successCallback) successCallback();      if (activeCallback) activeCallback();    }, function () {      console.warn(fontFamily + ' 加载失败,重试中... (第 ' + (retries + 1) + ' 次)');      if (retries < maxRetries) {        retries++;        setTimeout(loadFont, retryDelay); // 延迟后重试      } else {        console.error(fontFamily + ' 加载失败,已达到最大重试次数');        if (inactiveCallback) inactiveCallback();      }    });    if (loadingCallback && retries === 0) loadingCallback(); // 只在第一次加载时触发 loading 回调  }  loadFont();}// 使用示例detectFontLoadWithRetry('MyCustomFont',  function() { document.body.classList.add('fonts-loaded'); },  function() { console.log('字体开始加载...'); },  function() { console.log('字体已激活!'); },  function() { console.error('字体加载失败!'); });

如何优化字体加载性能?

字体加载对网站性能有显著影响,特别是对于移动设备。

JS怎样检测字体加载完成 4个回调函数确保字体加载后渲染使用 Web Font Loader (或类似库): 如 FontFaceObserver,提供更精细的控制和事件监听。字体格式优化: 使用 WOFF2 格式,压缩率更高,兼容性更好。字体子集化: 只包含页面实际使用的字符,减少字体文件大小。可以使用工具fontminCDN 加速: 将字体文件托管在 CDN 上,利用 CDN 的缓存和加速能力。预加载 (preload): 使用 标签,提前加载字体文件。


避免 FOIT 和 FOUT: FOIT (Flash of Invisible Text) 指字体加载完成前显示空白,FOUT (Flash of Unstyled Text) 指字体加载完成后替换默认字体导致闪烁。通过 CSS 和 JS 的配合,可以尽量避免这两种情况。

不同浏览器对字体加载 API 的支持程度如何?

虽然 FontFaceObserver 这样的库已经做了很好的兼容性处理,但了解底层 API 的支持情况仍然很重要。

FontFace API: 现代浏览器都支持 FontFace API,允许通过 JS 加载和控制字体。font-display: CSS font-display 属性控制字体加载期间的行为。swap 值表示先显示备用字体,字体加载完成后再替换。optional 值表示如果字体加载时间过长,则不使用自定义字体。老的浏览器: 对于不支持 FontFace API 的老浏览器,需要使用一些 hack 的方法,或者直接降级到使用系统字体。但这种情况现在已经很少见了。

总的来说,使用 FontFaceObserver 结合 CSS font-display 属性,可以很好地处理字体加载的各种情况,并提供良好的用户体验。不过,始终要记住,字体加载是性能优化的一个重要方面,需要综合考虑各种因素。

以上就是JS怎样检测字体加载完成 4个回调函数确保字体加载后渲染的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1506556.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月20日 04:11:39
下一篇 2025年12月20日 04:11:59

相关推荐

  • 使用 jQuery 和 Select2 获取所选值

    第一段引用上面的摘要: 本文档介绍了如何使用 jQuery 和 Select2 插件获取多选下拉框中所选的值。我们将演示如何初始化 Select2,并提供代码示例,展示如何通过监听 change 事件来实时获取所选值的数组。掌握这些方法,你将能够轻松地在你的 Web 应用中集成 Select2 并获…

    2025年12月20日
    000
  • 如何在不刷新整个页面的情况下,将表单提交到特定 DIV 中

    本文旨在解决如何将表单提交到页面上的特定 元素中,而无需刷新整个页面。我们将探讨使用 一种方法是将目标 替换为 缺点: 方法二:使用 AJAX 拦截表单提交 更灵活的方法是使用 JavaScript 拦截表单提交,然后使用 AJAX 将表单数据发送到服务器,并将响应更新到目标 中。 步骤: 拦截表单…

    2025年12月20日
    000
  • 使用 useEffect 获取数据时,API 工具函数无法正确更新状态的解决方案

    第一段引用上面的摘要: 本文针对 React 初学者在使用 useEffect 钩子获取数据并使用工具函数进行 API 调用时,遇到的数据无法正确更新状态的问题,提供了详细的分析和解决方案。通过修改 API 工具函数,确保 fetch 调用返回 Promise,从而保证数据能够正确传递并更新组件状态…

    2025年12月20日
    000
  • JavaScript 猜拳游戏:完善计分与逻辑优化教程

    本文旨在帮助开发者构建一个基于浏览器的 JavaScript 猜拳游戏,并解决计分逻辑和简化游戏判断的问题。我们将逐步优化代码,提供更清晰的结构和更简洁的实现方式,确保游戏逻辑的正确性和可维护性。最终,你将拥有一个功能完善、易于理解的猜拳游戏。 游戏核心逻辑实现 首先,我们定义游戏选项,并初始化玩家…

    2025年12月20日
    000
  • JavaScript 猜拳游戏:完善计分与逻辑优化

    本文旨在帮助开发者构建一个基于浏览器的 JavaScript 猜拳游戏,并解决计分逻辑问题。我们将提供清晰的代码示例,并深入探讨如何使用数组索引和模运算来简化胜负判断。通过本文,你将掌握如何编写一个功能完善、逻辑清晰的猜拳游戏。 游戏结构与核心逻辑 一个简单的猜拳游戏通常包含以下几个核心部分: 获取…

    2025年12月20日
    000
  • 什么是二叉堆?二叉堆的插入和删除

    二叉堆是一种用数组实现的完全二叉树,满足堆属性,分为最小堆和最大堆,能高效插入、删除并获取最值,时间复杂度为O(log N);其核心操作为插入时的“上浮”和删除堆顶时的“下沉”;常见应用包括优先队列、堆排序、Dijkstra与Prim算法及Top K问题。 二叉堆本质上是一种特殊的完全二叉树,它满足…

    2025年12月20日
    000
  • 什么是虚拟DOM?虚拟DOM的Diff

    虚拟DOM是真实DOM的轻量级JavaScript副本,核心目的是优化频繁DOM操作的性能。它通过在内存中进行计算,利用Diff算法比较新旧虚拟DOM树,找出最小差异并生成补丁,最后批量更新真实DOM,减少重排和重绘。Diff算法基于同层比较、节点类型判断、属性对比和key机制,实现高效更新。同步时…

    2025年12月20日
    000
  • JavaScript实现凯撒密码:高效处理字符串与字符编码

    本文详细讲解如何在JavaScript中高效实现凯撒密码的加密与解密。文章将首先指出常见错误,如JavaScript字符串的不可变性及低效的查找方式,随后深入探讨利用字符编码(ASCII/Unicode)和模运算进行字母移位的优化策略,并结合String.prototype.replace()方法提…

    2025年12月20日
    000
  • JavaScript 实现凯撒密码转换:数组到字符编码的进阶指南

    本文详细介绍了如何使用 JavaScript 将字符串中的字母转换为凯撒密码。通过避免直接修改字符串和利用字符编码的特性,提供了一种高效且简洁的实现方法。文章重点讲解了 String.prototype.replace() 方法和字符编码在密码转换中的应用,并附带示例代码,帮助读者理解和掌握该技术。…

    2025年12月20日
    000
  • 将匹配锚链接中的链接转换为嵌入式视频

    Test linkTest linkTest link$(‘a[href*=”https://www.php.cn/link/6f467e9654331d7ad85ed630906ac10b”]’).each(function(index, item)…

    2025年12月20日
    000
  • 替换匹配锚链接中的嵌入链接:JavaScript/jQuery 教程

    本文档旨在指导开发者如何使用 JavaScript 和 jQuery 在 HTML 中动态地将特定模式的链接替换为嵌入式 iframe 代码。通过遍历匹配的锚链接,提取其 href 属性,并将其作为 iframe 的 src 属性,最终实现嵌入视频或其他内容的目的。此方法适用于无法直接编辑 HTML…

    2025年12月20日
    000
  • 使用 jQuery 和 Select2 获取选中的值

    摘要:本文介绍了如何使用 jQuery 和 Select2 插件获取多选下拉菜单中选中的值。通过简单的代码示例,演示了如何初始化 Select2 插件,并利用 .val() 方法获取选中的值数组,同时展示了如何监听 change 事件,在选项发生改变时动态获取选中的值。 Select2 是一个强大的…

    2025年12月20日
    000
  • 使用 jQuery 和 Select2 获取选中值

    本文旨在提供一个清晰简洁的指南,介绍如何使用 jQuery 和 Select2 插件来获取多选下拉列表中用户选中的值。我们将通过示例代码演示如何初始化 Select2 插件,并监听 change 事件来获取选中的值数组,以便在你的 Web 应用中使用。 初始化 Select2 首先,确保你已经正确引…

    2025年12月20日
    000
  • JS如何实现筛选功能

    JavaScript筛选功能的核心是根据条件过滤数据并更新页面展示。首先从数据源(如数组)出发,监听用户输入或选择操作,利用filter()方法按条件(如名称、分类)筛选数据,最后通过DOM操作渲染结果。支持多条件组合时,应基于原始数据依次应用各条件,确保逻辑清晰。为提升性能,可使用防抖减少高频触发…

    2025年12月20日
    000
  • js 怎么用partial实现函数部分应用

    javascript中实现函数部分应用的核心方法是使用function.prototype.bind或自定义partial函数。1. 使用bind可预设参数并固定this上下文,例如add.bind(null, 10)创建新函数addwithten;2. 自定义partial函数利用闭包和apply…

    2025年12月20日
    000
  • JS如何实现Diff算法?Diff的优化

    diff算法的核心思想是通过比较新旧虚拟dom树的差异,尽可能复用现有节点,仅更新变化部分以减少对真实dom的操作。它从根节点开始逐层遍历新旧树,比较同一位置的节点类型与属性,记录节点的增删改移等差异,并生成最小化更新指令应用于真实dom。使用key属性是关键优化手段,能准确识别节点身份,避免误判移…

    2025年12月20日
    000
  • js如何创建自定义事件

    创建自定义事件需使用new event()或new customevent()构造函数,2. 通过dispatchevent()方法触发事件,3. 使用addeventlistener()监听事件,4. customevent可通过detail属性传递数据,5. 设置bubbles为true使事件冒…

    2025年12月20日 好文分享
    000
  • 什么是状态机?有限状态机的实现

    有限状态机常见实现方式有:基于枚举和switch/case语句,适合简单场景但难以维护;状态模式通过封装状态类提升扩展性但类数量增多;状态转换表以表格形式清晰表达转换规则但规模大时复杂;基于框架或库如Spring Statemachine可支持高级功能。选择方式需根据复杂度和需求权衡。 状态机,简单…

    2025年12月20日
    000
  • JS如何替换字符串

    replace()默认只替换第一个匹配项,需用正则加g标志实现全局替换;replaceAll()则直接替换所有匹配项,语法更简洁,但不支持正则表达式,且兼容性较差。 在JavaScript中,替换字符串主要依赖于String对象的 replace() 方法,它能让你用新的内容替换掉字符串中匹配到的部…

    2025年12月20日
    000
  • JS如何实现高亮显示

    js实现高亮显示的核心是通过操作dom改变元素样式,常用方法包括直接修改样式、使用innerhtml或textcontent替换文本并包裹span标签、利用range和documentfragment精确控制高亮范围,或引入mark.js等第三方库;为避免影响性能,应减少dom操作、使用docume…

    2025年12月20日
    000

发表回复

登录后才能评论
关注微信