Next.js Tailwind CSS #

一、Tailwind CSS基础 #

1.1 什么是Tailwind CSS #

Tailwind CSS是一个功能类优先的CSS框架,提供原子化的CSS类:

tsx
export default function Card() {
    return (
        <div className="bg-white rounded-lg shadow-md p-6">
            <h2 className="text-xl font-bold text-gray-900">标题</h2>
            <p className="text-gray-600 mt-2">描述内容</p>
        </div>
    )
}

1.2 安装配置 #

Next.js默认集成Tailwind CSS:

bash
npx create-next-app@latest my-app --tailwind

1.3 配置文件 #

tailwind.config.ts

typescript
import type { Config } from 'tailwindcss'

const config: Config = {
    content: [
        './src/pages/**/*.{js,ts,jsx,tsx,mdx}',
        './src/components/**/*.{js,ts,jsx,tsx,mdx}',
        './src/app/**/*.{js,ts,jsx,tsx,mdx}',
    ],
    theme: {
        extend: {},
    },
    plugins: [],
}

export default config

二、布局 #

2.1 容器 #

tsx
export default function Page() {
    return (
        <div className="container mx-auto px-4">
            内容
        </div>
    )
}

2.2 Flexbox #

tsx
export default function FlexLayout() {
    return (
        <div className="flex items-center justify-between">
            <div className="flex-1">左侧</div>
            <div>右侧</div>
        </div>
    )
}

2.3 Grid #

tsx
export default function GridLayout() {
    return (
        <div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4">
            <div className="bg-gray-100 p-4">卡片1</div>
            <div className="bg-gray-100 p-4">卡片2</div>
            <div className="bg-gray-100 p-4">卡片3</div>
        </div>
    )
}

三、排版 #

3.1 字体大小 #

tsx
export default function Typography() {
    return (
        <div>
            <p className="text-xs">超小文字</p>
            <p className="text-sm">小文字</p>
            <p className="text-base">正常文字</p>
            <p className="text-lg">大文字</p>
            <p className="text-xl">超大文字</p>
            <p className="text-2xl">标题2</p>
            <p className="text-3xl">标题1</p>
        </div>
    )
}

3.2 字体粗细 #

tsx
export default function FontWeight() {
    return (
        <div>
            <p className="font-light">轻字重</p>
            <p className="font-normal">正常字重</p>
            <p className="font-medium">中等字重</p>
            <p className="font-semibold">半粗字重</p>
            <p className="font-bold">粗字重</p>
        </div>
    )
}

3.3 文本颜色 #

tsx
export default function TextColor() {
    return (
        <div>
            <p className="text-gray-900">深灰色</p>
            <p className="text-gray-600">中灰色</p>
            <p className="text-gray-400">浅灰色</p>
            <p className="text-blue-500">蓝色</p>
            <p className="text-red-500">红色</p>
        </div>
    )
}

四、间距 #

4.1 内边距 #

tsx
export default function Padding() {
    return (
        <div>
            <div className="p-4">四周内边距</div>
            <div className="px-4 py-2">水平垂直内边距</div>
            <div className="pt-4 pb-2 pl-6 pr-8">各方向内边距</div>
        </div>
    )
}

4.2 外边距 #

tsx
export default function Margin() {
    return (
        <div>
            <div className="m-4">四周外边距</div>
            <div className="mx-auto my-4">水平居中</div>
            <div className="mt-4 mb-2 ml-6 mr-8">各方向外边距</div>
        </div>
    )
}

4.3 间距值 #

类名
p-0 0
p-1 0.25rem
p-2 0.5rem
p-4 1rem
p-6 1.5rem
p-8 2rem

五、背景与边框 #

5.1 背景色 #

tsx
export default function Background() {
    return (
        <div>
            <div className="bg-white">白色背景</div>
            <div className="bg-gray-100">浅灰背景</div>
            <div className="bg-blue-500">蓝色背景</div>
            <div className="bg-gradient-to-r from-blue-500 to-purple-500">
                渐变背景
            </div>
        </div>
    )
}

5.2 边框 #

tsx
export default function Border() {
    return (
        <div>
            <div className="border">默认边框</div>
            <div className="border-2">粗边框</div>
            <div className="border border-blue-500">蓝色边框</div>
            <div className="border-l-4 border-l-blue-500">左边框</div>
        </div>
    )
}

5.3 圆角 #

tsx
export default function BorderRadius() {
    return (
        <div>
            <div className="rounded">小圆角</div>
            <div className="rounded-md">中圆角</div>
            <div className="rounded-lg">大圆角</div>
            <div className="rounded-full">圆形</div>
        </div>
    )
}

5.4 阴影 #

tsx
export default function Shadow() {
    return (
        <div>
            <div className="shadow-sm">小阴影</div>
            <div className="shadow">默认阴影</div>
            <div className="shadow-md">中阴影</div>
            <div className="shadow-lg">大阴影</div>
            <div className="shadow-xl">超大阴影</div>
        </div>
    )
}

六、响应式设计 #

6.1 断点 #

断点 前缀 最小宽度
sm sm: 640px
md md: 768px
lg lg: 1024px
xl xl: 1280px
2xl 2xl: 1536px

6.2 响应式布局 #

tsx
export default function ResponsiveLayout() {
    return (
        <div className="grid grid-cols-1 sm:grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-4">
            <div className="bg-gray-100 p-4">卡片1</div>
            <div className="bg-gray-100 p-4">卡片2</div>
            <div className="bg-gray-100 p-4">卡片3</div>
            <div className="bg-gray-100 p-4">卡片4</div>
        </div>
    )
}

6.3 响应式隐藏 #

tsx
export default function ResponsiveHide() {
    return (
        <div>
            <div className="hidden md:block">中等屏幕及以上显示</div>
            <div className="md:hidden">中等屏幕以下显示</div>
            <div className="hidden lg:block">大屏幕及以上显示</div>
        </div>
    )
}

七、交互状态 #

7.1 悬停 #

tsx
export default function Hover() {
    return (
        <button className="bg-blue-500 hover:bg-blue-600 text-white px-4 py-2 rounded">
            悬停变色
        </button>
    )
}

7.2 焦点 #

tsx
export default function Focus() {
    return (
        <input
            className="border border-gray-300 focus:border-blue-500 focus:ring-2 focus:ring-blue-200 px-4 py-2 rounded"
            placeholder="输入内容"
        />
    )
}

7.3 激活 #

tsx
export default function Active() {
    return (
        <button className="bg-blue-500 active:bg-blue-700 text-white px-4 py-2 rounded">
            点击变色
        </button>
    )
}

7.4 禁用 #

tsx
export default function Disabled() {
    return (
        <button
            className="bg-blue-500 disabled:bg-gray-300 disabled:cursor-not-allowed text-white px-4 py-2 rounded"
            disabled
        >
            禁用按钮
        </button>
    )
}

八、暗色模式 #

8.1 配置 #

typescript
import type { Config } from 'tailwindcss'

const config: Config = {
    darkMode: 'class',
    content: ['./src/**/*.{js,ts,jsx,tsx}'],
    theme: {
        extend: {},
    },
    plugins: [],
}

export default config

8.2 使用暗色模式 #

tsx
export default function Card() {
    return (
        <div className="bg-white dark:bg-gray-800 text-gray-900 dark:text-white p-6 rounded-lg">
            <h2 className="text-xl font-bold">标题</h2>
            <p className="text-gray-600 dark:text-gray-300 mt-2">描述内容</p>
        </div>
    )
}

8.3 切换主题 #

tsx
'use client'

import { useState, useEffect } from 'react'

export default function ThemeToggle() {
    const [isDark, setIsDark] = useState(false)
    
    useEffect(() => {
        document.documentElement.classList.toggle('dark', isDark)
    }, [isDark])
    
    return (
        <button
            onClick={() => setIsDark(!isDark)}
            className="p-2 rounded-lg bg-gray-200 dark:bg-gray-700"
        >
            {isDark ? '🌙' : '☀️'}
        </button>
    )
}

九、自定义配置 #

9.1 扩展主题 #

typescript
import type { Config } from 'tailwindcss'

const config: Config = {
    content: ['./src/**/*.{js,ts,jsx,tsx}'],
    theme: {
        extend: {
            colors: {
                primary: {
                    50: '#eff6ff',
                    100: '#dbeafe',
                    500: '#3b82f6',
                    600: '#2563eb',
                    700: '#1d4ed8',
                },
            },
            fontFamily: {
                sans: ['Inter', 'sans-serif'],
            },
            spacing: {
                '128': '32rem',
            },
        },
    },
    plugins: [],
}

export default config

9.2 使用自定义颜色 #

tsx
export default function CustomColors() {
    return (
        <div className="bg-primary-500 text-white p-4">
            自定义主色
        </div>
    )
}

十、最佳实践 #

10.1 组件封装 #

tsx
interface ButtonProps {
    variant?: 'primary' | 'secondary'
    size?: 'sm' | 'md' | 'lg'
    children: React.ReactNode
}

export default function Button({
    variant = 'primary',
    size = 'md',
    children,
}: ButtonProps) {
    const baseStyles = 'rounded font-medium transition-colors'
    
    const variants = {
        primary: 'bg-blue-500 text-white hover:bg-blue-600',
        secondary: 'bg-gray-200 text-gray-900 hover:bg-gray-300',
    }
    
    const sizes = {
        sm: 'px-3 py-1.5 text-sm',
        md: 'px-4 py-2',
        lg: 'px-6 py-3 text-lg',
    }
    
    return (
        <button className={`${baseStyles} ${variants[variant]} ${sizes[size]}`}>
            {children}
        </button>
    )
}

10.2 使用@apply #

css
.btn {
    @apply px-4 py-2 rounded font-medium transition-colors;
}

.btn-primary {
    @apply bg-blue-500 text-white hover:bg-blue-600;
}

.btn-secondary {
    @apply bg-gray-200 text-gray-900 hover:bg-gray-300;
}

十一、总结 #

Tailwind CSS要点:

要点 说明
原子化类 直接使用工具类
响应式 sm/md/lg/xl前缀
状态 hover/focus/active
暗色模式 dark:前缀
自定义 tailwind.config.ts
组件封装 封装可复用组件

下一步,让我们学习CSS-in-JS!

最后更新:2026-03-28