CSS 样式
目前您的主页没有任何样式。让我们看看为 Next.js 应用添加样式的不同方式。
全局样式
查看 /app/ui
文件夹时,您会看到一个名为 global.css
的文件。您可以使用此文件为应用中的所有路由添加 CSS 规则——例如 CSS 重置规则、链接等 HTML 元素的全局样式等。
您可以在应用的任何组件中导入 global.css
,但通常建议将其添加到顶级组件中。在 Next.js 中,这是根布局 (root layout)(稍后会详细介绍)。
通过导航到 /app/layout.tsx
并导入 global.css
文件,为应用添加全局样式:
import '@/app/ui/global.css';
export default function RootLayout({
children,
}: {
children: React.ReactNode;
}) {
return (
<html lang="en">
<body>{children}</body>
</html>
);
}
在开发服务器仍在运行时,保存更改并在浏览器中预览。您的主页现在应该如下所示:

但等一下,您并未添加任何 CSS 规则,这些样式是从哪里来的?
如果查看 global.css
,您会注意到一些 @tailwind
指令:
@tailwind base;
@tailwind components;
@tailwind utilities;
Tailwind
Tailwind 是一个 CSS 框架,通过允许您直接在 React 代码中快速编写实用类 (utility classes) 来加速开发过程。
在 Tailwind 中,您通过添加类名来为元素添加样式。例如,添加 "text-blue-500"
会将 <h1>
文本变为蓝色:
<h1 className="text-blue-500">I'm blue!</h1>
尽管 CSS 样式是全局共享的,但每个类仅应用于单个元素。这意味着如果您添加或删除元素,您无需担心维护单独的样式表、样式冲突或 CSS 包大小随应用规模增长的问题。
当您使用 create-next-app
启动新项目时,Next.js 会询问您是否要使用 Tailwind。如果选择 是
,Next.js 会自动安装必要的包并在应用中配置 Tailwind。
查看 /app/page.tsx
时,您会看到我们在示例中使用了 Tailwind 类。
import AcmeLogo from '@/app/ui/acme-logo';
import { ArrowRightIcon } from '@heroicons/react/24/outline';
import Link from 'next/link';
export default function Page() {
return (
// 这些是 Tailwind 类:
<main className="flex min-h-screen flex-col p-6">
<div className="flex h-20 shrink-0 items-end rounded-lg bg-blue-500 p-4 md:h-52">
// ...
)
}
如果您是第一次使用 Tailwind,不必担心。为了节省时间,我们已经为您将使用的所有组件添加了样式。
让我们试试 Tailwind!复制以下代码并将其粘贴到 /app/page.tsx
中的 <p>
元素上方:
<div
className="relative w-0 h-0 border-l-[15px] border-r-[15px] border-b-[26px] border-l-transparent border-r-transparent border-b-black"
/>
如果您更喜欢编写传统的 CSS 规则或将样式与 JSX 分开——CSS 模块是一个很好的替代方案。
CSS 模块
CSS 模块 允许您通过自动创建唯一的类名将 CSS 限定在组件范围内,因此您也不必担心样式冲突。
在本课程中,我们将继续使用 Tailwind,但让我们花点时间看看如何使用 CSS 模块实现与上述测验相同的结果。
在 /app/ui
中创建一个名为 home.module.css
的新文件,并添加以下 CSS 规则:
.shape {
height: 0;
width: 0;
border-bottom: 30px solid black;
border-left: 20px solid transparent;
border-right: 20px solid transparent;
}
然后,在 /app/page.tsx
文件中导入样式,并将您添加的 <div>
中的 Tailwind 类名替换为 styles.shape
:
import AcmeLogo from '@/app/ui/acme-logo';
import { ArrowRightIcon } from '@heroicons/react/24/outline';
import Link from 'next/link';
import styles from '@/app/ui/home.module.css';
export default function Page() {
return (
<main className="flex min-h-screen flex-col p-6">
<div className={styles.shape} />
// ...
)
}
保存更改并在浏览器中预览。您应该会看到与之前相同的形状。
Tailwind 和 CSS 模块是 Next.js 应用中最常用的两种样式方法。使用哪一种取决于个人偏好——您甚至可以在同一个应用中同时使用两者!
使用 clsx
库切换类名
在某些情况下,您可能需要根据状态或其他条件有条件地为元素添加样式。
clsx
是一个可以轻松切换类名的库。我们建议查看文档 了解更多详情,但以下是基本用法:
- 假设您想创建一个接受
status
的InvoiceStatus
组件。状态可以是'pending'
或'paid'
。 - 如果是
'paid'
,您希望颜色为绿色。如果是'pending'
,您希望颜色为灰色。
您可以使用 clsx
有条件地应用类,如下所示:
import clsx from 'clsx';
export default function InvoiceStatus({ status }: { status: string }) {
return (
<span
className={clsx(
'inline-flex items-center rounded-full px-2 py-1 text-sm',
{
'bg-gray-100 text-gray-500': status === 'pending',
'bg-green-500 text-white': status === 'paid',
},
)}
>
// ...
)}
其他样式解决方案
除了我们讨论的方法外,您还可以使用以下方式为 Next.js 应用添加样式:
- Sass,允许您导入
.css
和.scss
文件。 - CSS-in-JS 库,例如 styled-jsx、styled-components 和 emotion。
查看 CSS 文档 了解更多信息。