我正在使用NextJS和Tailwind CSS。
在我的应用中,用户可以选择包括不同颜色方案和预先选定字体列表的主题。他们可以选择喜欢的应用程序字体。这些仅限于Google字体。
我不确定基于从数据库接收到的字体名称加载字体的最佳方法是什么。我可以在serverSideProps中从数据库中加载数据,但是如何在渲染之前加载字体,以便没有屏幕闪烁呢? 请帮忙一下?
更新:
目前为止,我已经完成了以下工作:
1. 在tailwind.config.js中,我扩展了可用的不同字体主题。 ``` theme: { fontFamily: { inter: ['Inter', 'sans-serif'], cal: ["Cal Sans", "Inter", "sans-serif"], arima:['Arima Madurai','cursive'], opensans:['Open Sans', 'sans-serif'], } } ```
2. 我为每种字体创建了一个样式表,存储在公共文件夹中的以下位置: - /fonts/opensans/stylesheet.css - /fonts/cal/stylesheet.css - /fonts/inter/stylesheet.css - /fonts/arima/stylesheet.css
这些样式表包含字体。以下是一个样例:
在页面上(例如
假设用户的偏好是
在头部,我按以下方式加载相关样式表:
在我的应用中,用户可以选择包括不同颜色方案和预先选定字体列表的主题。他们可以选择喜欢的应用程序字体。这些仅限于Google字体。
我不确定基于从数据库接收到的字体名称加载字体的最佳方法是什么。我可以在serverSideProps中从数据库中加载数据,但是如何在渲染之前加载字体,以便没有屏幕闪烁呢? 请帮忙一下?
更新:
目前为止,我已经完成了以下工作:
1. 在tailwind.config.js中,我扩展了可用的不同字体主题。 ``` theme: { fontFamily: { inter: ['Inter', 'sans-serif'], cal: ["Cal Sans", "Inter", "sans-serif"], arima:['Arima Madurai','cursive'], opensans:['Open Sans', 'sans-serif'], } } ```
2. 我为每种字体创建了一个样式表,存储在公共文件夹中的以下位置: - /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;
}
在页面上(例如
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>
- 这将加载
/fonts/cal/stylesheet.css
和所需的字体,不会加载其他字体。然后我可以在我的组件中使用font-cal
,因为它已经在tailwind.config.css
中定义。
这个方法可行,但仍然会出现闪烁,可能是因为font-display:swap
,也可能是由于其他原因。但我仍然觉得这不是最优解,可能有更好的方法。
寻求帮助。
_app.page.js
的头部即可。我认为您无法获得比getServerSideProps更根本的解决方案。 - Berci