Next.js14从入门到实战007:NextJS基础篇之next.js中如何使用CSS样式

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 是一个库,可让您轻松切换类名。我们建议查看文档以获取更多详细信息,但以下是基本用法:

  • 假设你要创建一个接受 statusInvoiceStatus 组件。状态可以是 '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。
相关推荐
掘金者阿豪1 小时前
把业务数据变成共享仪表盘:Metabase可视化与远程访问实践
前端·后端
kyriewen1 小时前
折腾了半年 AI 编程工作流,最后发现效率瓶颈是桌上那块屏幕
前端·javascript·ai编程
蜗牛前端2 小时前
codex 全流程开发上线的高颜值礼簿小程序
前端·微信小程序
大龄秃头程序员2 小时前
我在图文流 App 里落地双层缓存、弱网降级与 OOM 治理
前端
老王以为2 小时前
React Renderer 分离的多平台架构
前端·react native·react.js
hunterandroid2 小时前
Kotlin Coroutines 与 Flow:让异步任务更清晰
前端
Bigger3 小时前
从零搭建 AI 代码审查服务:一份前端也能看懂的 Python 学习笔记
前端·ci/cd·ai编程
lichenyang4533 小时前
JSAPI、NAPI、Biz、Imp:ASCF Demo 如何真正调用系统能力和 C++ 能力
前端
lichenyang4534 小时前
IPC、JSVM、UIThread、libuv:ASCF 架构图里最容易混的几个词
前端
用户059540174464 小时前
Redis记忆存储故障恢复测试踩坑实录:手动测试让我漏掉了2个一致性Bug
前端·css