字体模块
本 API 参考将帮助您理解如何使用 next/font/google 和 next/font/local。有关功能和使用方法,请参阅 优化字体 页面。
字体函数参数
| 参数 | font/google | font/local | 类型 | 是否必填 |
|---|---|---|---|---|
src | 字符串或对象数组 | 是 | ||
weight | 字符串或数组 | 条件必填 | ||
style | 字符串或数组 | - | ||
subsets | 字符串数组 | - | ||
axes | 字符串数组 | - | ||
display | 字符串 | - | ||
preload | 布尔值 | - | ||
fallback | 字符串数组 | - | ||
adjustFontFallback | 布尔值或字符串 | - | ||
variable | 字符串 | - | ||
declarations | 对象数组 | - |
src
字体文件的路径,可以是字符串或对象数组(类型为 Array<{path: string, weight?: string, style?: string}>),相对于调用字体加载器函数的目录。
用于 next/font/local
- 必填
示例:
src:'./fonts/my-font.woff2':其中my-font.woff2放在app目录下的fonts文件夹中src:[{path: './inter/Inter-Thin.ttf', weight: '100',},{path: './inter/Inter-Regular.ttf',weight: '400',},{path: './inter/Inter-Bold-Italic.ttf', weight: '700',style: 'italic',},]- 如果在
app/page.tsx中调用字体加载器函数并使用src:'../styles/fonts/my-font.ttf',则my-font.ttf应放在项目根目录的styles/fonts文件夹中
weight
字体的 weight,有以下几种可能:
- 字符串,值为特定字体可用的权重值,如果是 可变字体 也可以是范围值
- 如果不是 Google 可变字体,可以是权重值数组。仅适用于
next/font/google
用于 next/font/google 和 next/font/local
- 如果使用的字体 不是 可变字体 则为必填
示例:
weight: '400':单个权重值的字符串 - 对于Inter字体,可能的值是'100'、'200'、'300'、'400'、'500'、'600'、'700'、'800'、'900'或'variable'(默认值为'variable')weight: '100 900':可变字体范围在100到900之间的字符串weight: ['100','400','900']:非可变字体的 3 个可能值的数组
style
字体的 style,有以下几种可能:
- 字符串 值,默认值为
'normal' - 如果不是 Google 可变字体,可以是样式值数组。仅适用于
next/font/google
用于 next/font/google 和 next/font/local
- 可选
示例:
style: 'italic':字符串 - 对于next/font/google可以是normal或italicstyle: 'oblique':字符串 - 对于next/font/local可以接受任何值,但通常来自 标准字体样式style: ['italic','normal']:next/font/google的 2 个值数组 - 值来自normal和italic
subsets
字体的 subsets,定义为字符串值数组,包含您希望 预加载 的每个子集名称。当 preload 选项为 true(默认值)时,通过 subsets 指定的字体将在头部注入链接预加载标签。
用于 next/font/google
- 可选
示例:
subsets: ['latin']:包含子集latin的数组
您可以在 Google Fonts 页面上找到字体的所有子集列表。
axes
某些可变字体具有额外的 axes 可以包含。默认情况下,仅包含字体权重以保持文件大小较小。axes 的可能值取决于特定字体。
用于 next/font/google
- 可选
示例:
axes: ['slnt']:值为slnt的数组,适用于Inter可变字体,该字体具有slnt作为额外的axes,如 此处 所示。您可以通过在 Google 可变字体页面 上使用过滤器并查找除wght之外的axes来找到字体的可能axes值
display
字体的 display,可能的字符串 值 为 'auto'、'block'、'swap'、'fallback' 或 'optional',默认值为 'swap'。
用于 next/font/google 和 next/font/local
- 可选
示例:
display: 'optional':分配给optional值的字符串
preload
布尔值,指定是否应 预加载 字体。默认值为 true。
用于 next/font/google 和 next/font/local
- 可选
示例:
preload: false
fallback
如果无法加载字体,则使用的回退字体。字符串数组,无默认值。
- 可选
用于 next/font/google 和 next/font/local
示例:
fallback: ['system-ui', 'arial']:将回退字体设置为system-ui或arial的数组
adjustFontFallback
- 对于
next/font/google:布尔值,设置是否应使用自动回退字体以减少 累积布局偏移 (CLS)。默认值为true。 - 对于
next/font/local:字符串或布尔值false,设置是否应使用自动回退字体以减少 累积布局偏移 (CLS)。可能值为'Arial'、'Times New Roman'或false。默认值为'Arial'。
用于 next/font/google 和 next/font/local
- 可选
示例:
adjustFontFallback: false:适用于next/font/googleadjustFontFallback: 'Times New Roman':适用于next/font/local
variable
字符串值,定义如果样式通过 CSS 变量方法 应用时要使用的 CSS 变量名称。
用于 next/font/google 和 next/font/local
- 可选
示例:
variable: '--my-font':声明 CSS 变量--my-font
declarations
字体 描述符 键值对数组,用于进一步定义生成的 @font-face。
用于 next/font/local
- 可选
示例:
declarations: [{ prop: 'ascent-override', value: '90%' }]
应用样式
您可以通过三种方式应用字体样式:
className
返回加载字体的只读 CSS className,传递给 HTML 元素。
<p className={inter.className}>Hello, Next.js!</p>style
返回加载字体的只读 CSS style 对象,传递给 HTML 元素,包括 style.fontFamily 以访问字体系列名称和回退字体。
<p style={inter.style}>Hello World</p>CSS 变量
如果您希望在外部样式表中设置样式并在其中指定其他选项,请使用 CSS 变量方法。
除了导入字体外,还需导入定义 CSS 变量的 CSS 文件,并按如下方式设置字体加载器对象的 variable 选项:
import { Inter } from 'next/font/google'
import styles from '../styles/component.module.css'
const inter = Inter({
variable: '--font-inter',
})import { Inter } from 'next/font/google'
import styles from '../styles/component.module.css'
const inter = Inter({
variable: '--font-inter',
})要使用该字体,请将要设置样式的文本的父容器的 className 设置为字体加载器的 variable 值,并将文本的 className 设置为外部 CSS 文件中的 styles 属性。
<main className={inter.variable}>
<p className={styles.text}>Hello World</p>
</main><main className={inter.variable}>
<p className={styles.text}>Hello World</p>
</main>在 component.module.css CSS 文件中定义 text 选择器类如下:
.text {
font-family: var(--font-inter);
font-weight: 200;
font-style: italic;
}在上面的示例中,文本 Hello World 使用 Inter 字体和生成的字体回退进行样式设置,其中 font-weight: 200 和 font-style: italic。
使用字体定义文件
每次调用 localFont 或 Google 字体函数时,该字体将作为应用程序中的一个实例托管。因此,如果需要在多个位置使用相同的字体,应在一个位置加载它并在需要的地方导入相关的字体对象。这可以通过字体定义文件实现。
例如,在应用程序根目录的 styles 文件夹中创建一个 fonts.ts 文件。
然后,按如下方式指定字体定义:
import { Inter, Lora, Source_Sans_3 } from 'next/font/google'
import localFont from 'next/font/local'
// 定义可变字体
const inter = Inter()
const lora = Lora()
// 定义非可变字体的 2 个权重
const sourceCodePro400 = Source_Sans_3({ weight: '400' })
const sourceCodePro700 = Source_Sans_3({ weight: '700' })
// 定义自定义本地字体,GreatVibes-Regular.ttf 存储在 styles 文件夹中
const greatVibes = localFont({ src: './GreatVibes-Regular.ttf' })
export { inter, lora, sourceCodePro400, sourceCodePro700, greatVibes }import { Inter, Lora, Source_Sans_3 } from 'next/font/google'
import localFont from 'next/font/local'
// 定义可变字体
const inter = Inter()
const lora = Lora()
// 定义非可变字体的 2 个权重
const sourceCodePro400 = Source_Sans_3({ weight: '400' })
const sourceCodePro700 = Source_Sans_3({ weight: '700' })
// 定义自定义本地字体,GreatVibes-Regular.ttf 存储在 styles 文件夹中
const greatVibes = localFont({ src: './GreatVibes-Regular.ttf' })
export { inter, lora, sourceCodePro400, sourceCodePro700, greatVibes }现在可以在代码中使用这些定义,如下所示:
import { inter, lora, sourceCodePro700, greatVibes } from '../styles/fonts'
export default function Page() {
return (
<div>
<p className={inter.className}>使用 Inter 字体的 Hello world</p>
<p style={lora.style}>使用 Lora 字体的 Hello world</p>
<p className={sourceCodePro700.className}>
使用 Source_Sans_3 字体且权重为 700 的 Hello world
</p>
<p className={greatVibes.className}>Great Vibes 字体中的标题</p>
</div>
)
}import { inter, lora, sourceCodePro700, greatVibes } from '../styles/fonts'
export default function Page() {
return (
<div>
<p className={inter.className}>使用 Inter 字体的 Hello world</p>
<p style={lora.style}>使用 Lora 字体的 Hello world</p>
<p className={sourceCodePro700.className}>
使用 Source_Sans_3 字体且权重为 700 的 Hello world
</p>
<p className={greatVibes.className}>Great Vibes 字体中的标题</p>
</div>
)
}为了更轻松地在代码中访问字体定义,可以在 tsconfig.json 或 jsconfig.json 文件中定义路径别名,如下所示:
{
"compilerOptions": {
"paths": {
"@/fonts": ["./styles/fonts"]
}
}
}现在可以按如下方式导入任何字体定义:
import { greatVibes, sourceCodePro400 } from '@/fonts'import { greatVibes, sourceCodePro400 } from '@/fonts'版本变更
| 版本 | 变更内容 |
|---|---|
v13.2.0 | @next/font 重命名为 next/font。不再需要安装。 |
v13.0.0 | 新增 @next/font。 |