NextJS延迟加载字体

在定义 @font-face 的 CSS 中,如果浏览器解析到该规则,它会立即尝试加载指定的字体文件,而不等待 JavaScript 的执行。这意味着在没有调用 JavaScript(如 Font Face Observer)之前,浏览器会自动加载 @font-face 中定义的字体。

为了确保字体在 JavaScript 控制下延迟加载,可以采取以下措施:

  1. @font-face 定义移动到 JavaScript 执行之后
  2. 使用 Font Face API 动态加载字体

方法 1:将 @font-face 定义移动到 JavaScript 执行之后

可以在 JavaScript 执行后动态插入 @font-face 定义。以下是示例代码:

步骤 1:移除全局CSS中的 @font-face 定义

styles/global.css 中移除 @font-face 定义。

步骤 2:在 JavaScript 中动态插入 @font-face

_app.js 中使用 JavaScript 动态插入 @font-face 规则:

// pages/_app.js
import { useEffect } from 'react';
import '../styles/global.css';
import FontFaceObserver from 'fontfaceobserver';

function MyApp({ Component, pageProps }) {
  useEffect(() => {
    const robotoFont = new FontFaceObserver('Roboto');

    robotoFont.load().then(() => {
      const style = document.createElement('style');
      style.innerHTML = `
        @font-face {
          font-family: 'Roboto';
          src: url('/fonts/Roboto-Regular.woff2') format('woff2'),
               url('/fonts/Roboto-Regular.woff') format('woff');
          font-weight: 400;
          font-style: normal;
        }
        html.roboto-loaded body {
          font-family: 'Roboto', sans-serif;
        }
      `;
      document.head.appendChild(style);
      document.documentElement.classList.add('roboto-loaded');
    }).catch((error) => {
      console.error('Roboto font failed to load:', error);
    });
  }, []);

  return <Component {...pageProps} />;
}

export default MyApp;

方法 2:使用 Font Face API 动态加载字体

使用 Font Face API 直接在 JavaScript 中加载字体:

// pages/_app.js
import { useEffect } from 'react';
import '../styles/global.css';

function MyApp({ Component, pageProps }) {
  useEffect(() => {
    const font = new FontFace('Roboto', 'url(/fonts/Roboto-Regular.woff2)', {
      weight: '400',
      style: 'normal',
    });

    font.load().then((loadedFont) => {
      document.fonts.add(loadedFont);
      document.documentElement.classList.add('roboto-loaded');
    }).catch((error) => {
      console.error('Roboto font failed to load:', error);
    });
  }, []);

  return <Component {...pageProps} />;
}

export default MyApp;

在这种方法中,浏览器在 JavaScript 执行后才会尝试加载字体。

全局 CSS

无论使用哪种方法,全局 CSS 都可以定义字体回退和加载后的字体应用:

/* styles/global.css */
body {
  font-family: sans-serif; /* Fallback font */
}

html.roboto-loaded body {
  font-family: 'Roboto', sans-serif;
}

综述

通过将 @font-face 定义动态插入或使用 Font Face API,你可以控制字体的加载时机,从而避免浏览器在 JavaScript 执行之前自动加载字体文件。选择合适的方法可以根据项目需求来决定。

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ArslanRobot

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值