gpt4 book ai didi

javascript - 下一个JS : Loading Font from Database

转载 作者:行者123 更新时间:2023-12-02 01:43:18 24 4
gpt4 key购买 nike

我正在使用 NextJS 和 Tailwind CSS。

在我的应用中,用户可以选择一个包含不同配色方案的主题以及一个预选的字体列表。他们可以为应用选择他们喜欢的字体。

这些只是 Google 字体。

我不确定根据从数据库收到的字体名称加载字体的最佳方法是什么。我可以从 serverSideProps 中的 database 加载数据,但是我怎样才能在渲染之前加载字体,这样就不会出现屏幕闪烁。你能帮忙吗?

更新

到目前为止,我已经完成了以下工作:

  1. tailwind.config.js 中,我用可用的不同字体扩展了主题。

    主题:{字体系列: {inter: ['Inter', 'sans-serif'],cal: ["Cal Sans", "Inter", "sans-serif"],arima:['Arima Madurai','草书'],opensans:['Open Sans', 'sans-serif'],}

  2. 我为每种字体创建了一个样式表,它存储在这个位置的公共(public)文件夹中:

    /fonts/opensans/stylesheet.css

    /fonts/cal/stylesheet.css

    /fonts/inter/stylesheet.css

    /fonts/arima/stylesheet.css

这些样式表包含字体。下面是一个例子:

@font-face {
font-family: "Cal Sans";
src: url("CalSans-SemiBold.woff2") format("woff2"),
url("CalSans-SemiBold.woff") format("woff");
font-weight: 600;
font-style: normal;
font-display: swap;
}
  1. 在页面上(例如 pages/index.js),我使用 serverSideProps 加载用户的首选项并将其传递给 Layout 组件.此布局组件具有通过 next/head 创建的 head。我们将从服务器接收到的字体属性称为 themeFont

假设用户的偏好是 Cal Sans,并且用户的偏好作为值 cal 存储在数据库中。因此,themeFont 值将为 cal

在头部,我按如下方式加载相关样式表:

<Head>
<link rel="stylesheet" href={`/fonts/${themeFont}/stylesheet.css`}></link>
</Head>
  1. 这将加载 /fonts/cal/stylesheet.css 和所需的字体。没有加载其他字体。然后我可以在我的组件中使用 font-cal 因为它已在 tailwind.config.css
  2. 中定义

它工作正常。我仍然看到闪烁,可能是因为 font-display:swap,也可能是其他原因。但我仍然觉得这不是最佳解决方案,可以通过更好的方式完成。

寻求这方面的帮助。

最佳答案

🎯解决方案1

你的方向是正确的,你应该使用getServerSideProps<link> 中设置所需的字体标签。但是你应该添加 rel="preload"属性以首先加载字体,然后您可以为您的 css 放置链接。

<link rel="preload" href="/fonts/theme-font.woff2" as="font" type="font/woff2" ></link>

元素的 rel 属性的预加载值允许您在 HTML 中声明获取请求,指定您的页面很快需要的资源,您希望在页面生命周期的早期开始加载,在浏览器的主要渲染机制启动之前.

然后为了避免闪烁使用fallback font-display 的值属性,它将隐藏文本约 100 毫秒,如果字体尚未下载,将使用后备文本。

@font-face {
font-family: "Cal Sans";
font-display: fallback;
src: url("CalSans-SemiBold.woff2") format("woff2"),
}

您可以为 font-display 使用以下值对于不同的策略:

  • auto(默认):允许浏览器使用其默认加载方法,这通常类似于 block 值。
  • block:指示浏览器在字体完全下载之前暂时隐藏文本。更准确地说,浏览器使用不可见的占位符绘制文本,然后在加载后立即将其与自定义字体交换。这也称为“隐形文本闪现”或 FOIT。
  • swap:指示浏览器使用回退字体显示文本,直到自定义字体完全下载。这也称为“无样式文本的闪现”或 FOUT。
  • fallback:作为 auto 和 swap 值之间的折衷。浏览器将隐藏文本约 100 毫秒,如果尚未下载字体,将使用后备文本。它会在下载后切换到新字体,但只会在很短的切换时间内(大概 3 秒)。
  • 可选:与回退一样,此值告诉浏览器最初隐藏文本,然后转换为回退字体,直到自定义字体可用为止。但是,此值还允许浏览器确定是否使用了自定义字体,使用用户的连接速度作为决定因素,较慢的连接速度不太可能接收自定义字体。

🎯方案二

作为替代解决方案,您可以将字体嵌入到 css 样式中:

@font-face {
font-family: "Cal Sans";
font-display: fallback;
src: url(PASTE-BASE64-HERE) format('woff2')
}

检查这个demo作为引用,您可以在那里将 woff2 文件转换为 base64。

关于javascript - 下一个JS : Loading Font from Database,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71266063/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com