Web开发离不开CSS,那Next.js的CSS设置有什么不同吗?
全局样式
查看 /app/ui
文件夹内部,会看到一个名为 global.css
的文件,你可以使用该文件为应用程序中的所有路由添加 CSS 规则,例如 CSS 重置规则、链接等 HTML 元素的全站样式等。

您可以在应用程序的任何组件中导入 global.css
,但通常好的做法是将其添加到顶层组件中。在 Next.js 中,这就是根布局(稍后将详细介绍)。
打开 /app/layout.tsx 并导入 global.css 文件,为应用程序添加全局样式:
JSX
import '@/app/ui/global.css';
export default function RootLayout({
children,
}: {
children: React.ReactNode;
}) {
return (
<html lang="en">
<body>{children}</body>
</html>
);
}
保存后,你会发现,页面面在带有样式了

你如果查看global.css
后, 你会发现你并没有添加任何CSS代码,那样式是怎么来的?
是的,global.css
里面有个@tailwind
less
@tailwind base;
@tailwind components;
@tailwind utilities;
Tailwind
Tailwind 是一个 CSS 框架,它允许您直接在 TSX 标记中快速编写实用程序类,从而加快开发过程。
在 Tailwind 中,您可以通过添加类名来设置元素样式。例如,添加类 "text-blue-500"
会使 <h1>
文本变为蓝色:
css
<h1 className="text-blue-500">I'm blue!</h1>
尽管 CSS 样式是全局共享的,但每个类都单独应用于每个元素。这意味着,如果添加或删除元素,则不必担心维护单独的样式表、样式冲突或随着应用程序的扩展而增长的 CSS 包的大小。
当你用来 create-next-app
开始一个新项目时,Next.js会问你是否要使用 Tailwind。如果选择 yes
,Next.js将自动安装必要的软件包并在应用程序中配置 Tailwind。
如果你看一下 /app/page.tsx
,你会看到我们在示例中使用了 Tailwind 类。
JSX
import AcmeLogo from '@/app/ui/acme-logo';
import { ArrowRightIcon } from '@heroicons/react/24/outline';
import Link from 'next/link';
export default function Page() {
return (
// These are Tailwind classes:
<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,请不要担心。为了节省时间,我们已经设置了你将使用的所有组件的样式。
现在打开文件/app/page.tsx
,并复制下面的代码并将其粘贴到元素<p>
上方
JSX
<div
className="h-0 w-0 border-b-[30px] border-l-[20px] border-r-[20px] border-b-black border-l-transparent border-r-transparent"
/>
这时,你可以看到一个黑色三角形

Tailwind是一个很方便的CSS库,集成了很多方便的方法。
当然,如果你喜欢编写传统的 CSS 规则或将样式,CSS 模块是一个不错的选择。
CSS模块
CSS 模块允许您通过自动创建唯一的类名来将 CSS 范围限定为组件,因此你也不必担心样式冲突。
在本课程中,我们将继续使用 Tailwind,但让我们花点时间看看如何使用 CSS 模块获得与上述测验相同的结果。
在里面 /app/ui
,创建一个名为 home.module.css
的新文件,并添加以下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
:
JSX
import styles from '@/app/ui/home.module.css';
<div className={styles.shape} />;
保存更改并在浏览器中预览。你应该看到与以前相同的形状。

Tailwind 和 CSS 模块是设置 Next.js 应用程序样式的两种最常见方式。无论使用一个还是另一个都只是一个偏好问题 - 您甚至可以在同一应用程序中同时使用两者!
使用 clsx
库切换类名
在某些情况下,您可能需要根据状态或其他条件设置元素的样式。
clsx
是一个库,可让您轻松切换类名。我们建议查看文档以获取更多详细信息,但以下是基本用法:
- 假设你要创建一个接受
status
的InvoiceStatus
组件。状态可以是'pending'
或'paid'
。 - 如果是
'paid'
,则希望颜色为绿色,如果是'pending'
,则希望颜色为灰色。
你可以使用 clsx
有条件地应用类,如下所示:
JSX
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。