Tailwind CSS自定义用法

文章目录

  • 前言
    • ✅ 一、集成 Tailwind CSS 到 React 项目
      • 1. 安装依赖
      • 2. 配置 `tailwind.config.js`
      • 3. 创建全局样式文件(如 `src/index.css`)
        • @tailwind base;
        • @tailwind components;
        • @tailwind utilities;
      • 4. 在 `main.tsx` 或 `main.jsx` 中引入样式
    • ✅ 二、自定义样式方式汇总
      • 1. `theme.extend` 自定义主题(推荐)
      • 2. 添加自定义组件类(@layer)
      • 3. 插件方式自定义(如 `typography`、`forms`)
        • 扩展:
    • ✅ 一、什么是 Tailwind CSS 插件?
    • ✅ 二、创建自定义插件的步骤
      • 🧱 插件结构示意:
    • ✅ 三、React 项目中使用该插件
    • ✅ 四、高阶用法:插件封装为 NPM 包(组件库开发)
    • ✅ 五、自定义插件使用场景总结
    • ✅ 是否支持 TypeScript?
      • 4. 创建响应式自定义类
      • 5. 使用 `cva`(class-variance-authority)封装组件样式(推荐大项目)
    • ✅ 三、Tailwind CSS 常见优化建议


前言

在 React 项目中使用 Tailwind CSS 并进行自定义样式配置,主要包括以下几种方式和步骤:


✅ 一、集成 Tailwind CSS 到 React 项目

以 Vite 项目为例,集成步骤如下:

1. 安装依赖

npm install -D tailwindcss postcss autoprefixer
npx tailwindcss init -p

这会生成:

  • tailwind.config.js
  • postcss.config.js

2. 配置 tailwind.config.js

添加你的源码路径以启用 JIT 模式下的 tree-shaking

/** @type {import('tailwindcss').Config} */
export default {content: ["./index.html","./src/**/*.{js,ts,jsx,tsx}",],theme: {extend: {}, // 用于扩展自定义样式},plugins: [],
}

3. 创建全局样式文件(如 src/index.css

@tailwind base;
@tailwind components;
@tailwind utilities;

这是 Tailwind CSS 的核心指令,用于在你的 CSS 文件中引入 Tailwind 的三大层级样式:

@tailwind base;

引入 Tailwind 的基础样式(reset/normalize、全局样式、字体、表单等)。
作用类似于 CSS Reset,保证不同浏览器下的样式一致性,并设置一些全局的基础样式。

@tailwind components;

引入 Tailwind 的组件类(如 container、按钮等可复用的组件样式)。
你也可以在这里通过 @layer components { … } 自定义自己的组件样式。

@tailwind utilities;

引入 Tailwind 的工具类(如 p-4、text-center、bg-blue-500 等)。
这些是你在 JSX/HTML 里最常用的 Tailwind 类名。

4. 在 main.tsxmain.jsx 中引入样式

import './index.css'

✅ 二、自定义样式方式汇总

1. theme.extend 自定义主题(推荐)

位置tailwind.config.js

theme: {extend: {colors: {primary: '#1e40af',danger: '#e11d48',},spacing: {'72': '18rem','84': '21rem',},fontFamily: {inter: ['Inter', 'sans-serif'],}},
}

然后你可以在组件中使用:

<div className="bg-primary text-white p-4">Hello</div>

2. 添加自定义组件类(@layer)

位置index.cssglobal.css

@layer components {.btn-primary {@apply bg-blue-600 text-white px-4 py-2 rounded;}.card {@apply shadow-md rounded-lg p-6 bg-white;}
}

使用方式:

<button className="btn-primary">Click</button>

3. 插件方式自定义(如 typographyforms

npm install @tailwindcss/forms @tailwindcss/typography
plugins: [require('@tailwindcss/forms'),require('@tailwindcss/typography'),
],
扩展:

Tailwind CSS 支持通过自定义插件(Plugin)来扩展样式系统,这是构建 组件库设计系统复用工具类 的关键手段之一。下面将从 原理、语法、示例和在 React 项目中的集成步骤,手把手讲清楚 Tailwind CSS 自定义插件的用法。


✅ 一、什么是 Tailwind CSS 插件?

Tailwind 插件允许你通过 API 注册新的:

  • 工具类(utilities)
  • 组件类(components)
  • 自定义变体(variants)
  • 基础样式(base)

✅ 二、创建自定义插件的步骤

🧱 插件结构示意:

// tailwind.config.js
const plugin = require('tailwindcss/plugin')module.exports = {content: [...],theme: {extend: {},},plugins: [plugin(function({ addUtilities, addComponents, addBase, matchUtilities, theme }) {// 1. 添加基础样式addBase({'h1': { fontSize: theme('fontSize.2xl') },'h2': { fontSize: theme('fontSize.xl') },})// 2. 添加组件类addComponents({'.btn': {padding: '0.5rem 1rem',borderRadius: '0.25rem',fontWeight: '600',},'.btn-primary': {backgroundColor: theme('colors.blue.500'),color: theme('colors.white'),},})// 3. 添加工具类addUtilities({'.text-shadow': {textShadow: '2px 2px #000000',},'.text-shadow-md': {textShadow: '4px 4px #000000',},})// 4. 响应式匹配工具类matchUtilities({'rotate-y': (value) => ({transform: `rotateY(${value})`,}),},{ values: theme('rotate') })})],
}

✅ 三、React 项目中使用该插件

只需将上面的 tailwind.config.js 插件注册完成后,像平常一样使用样式类:

<button className="btn btn-primary text-shadow-md">Click Me</button>

无需其他导入!Tailwind 会自动根据你 content 中匹配到的类,生成 CSS。


✅ 四、高阶用法:插件封装为 NPM 包(组件库开发)

你可以将插件封装成独立模块:

// my-button-plugin.js
const plugin = require('tailwindcss/plugin')module.exports = plugin(({ addComponents, theme }) => {addComponents({'.btn-danger': {backgroundColor: theme('colors.red.500'),color: '#fff',padding: '0.5rem 1rem',borderRadius: '9999px',},})
})

然后在主配置中使用:

const myButtonPlugin = require('./my-button-plugin')module.exports = {plugins: [myButtonPlugin],
}

✅ 五、自定义插件使用场景总结

场景使用方式
提供通用按钮/卡片/警告样式addComponents
增强工具类(如旋转、投影)addUtilities
改变基础标签默认样式addBase
动态类支持(如 .rotate-y-45matchUtilities

✅ 是否支持 TypeScript?

Tailwind 插件本质是 JS 函数,也可以使用 .ts 文件编写,只要你在 tailwind.config.ts 中用 defineConfig() 包裹即可:

import plugin from 'tailwindcss/plugin'
import { defineConfig } from 'tailwindcss/helpers'export default defineConfig({plugins: [plugin(({ addUtilities }) => {addUtilities({'.skew-10deg': {transform: 'skewY(-10deg)'}})})]
})

4. 创建响应式自定义类

extend: {screens: {'xs': '480px',},maxWidth: {'8xl': '90rem',},
}

5. 使用 cva(class-variance-authority)封装组件样式(推荐大项目)

import { cva } from 'class-variance-authority'const button = cva('px-4 py-2 rounded', {variants: {intent: {primary: 'bg-blue-600 text-white',secondary: 'bg-gray-600 text-white',},size: {sm: 'text-sm',lg: 'text-lg',},},defaultVariants: {intent: 'primary',size: 'sm',},
})

✅ 三、Tailwind CSS 常见优化建议

  • ✅ 启用 JIT 模式(默认)
  • ✅ 用 @apply 抽离公共类
  • ✅ 使用 cva 管理组件变体
  • ✅ 移除未使用的类:purge(旧)→ content(新)
  • ✅ 使用 Tailwind plugin 编写通用组件或设计系统

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/86651.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/86651.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux面试常考

常用指令 常见题

Spring Boot 2.2.6调用DeepSeek API并通过SSE将流式响应推送给前端的完整实现

1. 添加依赖 (pom.xml) <dependencies><!-- Spring Boot Web --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- SSE 支持 --><depe…

LM1117-ADJ 简单介绍

LM1117-ADJ是一款可调输出电压的低压差线性稳压器&#xff08;LDO&#xff09;&#xff0c;具有以下关键特性和应用要点&#xff1a; 核心特性 可调输出电压 通过外部分压电阻&#xff08;R1和R2&#xff09;调节输出电压&#xff0c;范围为1.25V至13.8V。输出电压公式&#…

知名流体控制解决方案供应商“永盛科技”与商派ShopeX达成B2B商城项目合作

2025年6月&#xff0c;全球知名的工业流体控制解决方案服务商——永盛科技&#xff08;股票&#xff1a;874497&#xff09;&#xff0c;与商派ShopeX正式达成B2B商城项目合作。 此次合作将共同推动永盛科技B2B业务的数字化变革&#xff0c;提高B2B业务运营效率&#xff0c;同…

jvm简单八股

1、jvm中内存分为那几个区域&#xff0c;1.7和1.8 jvm 中主要有 程序计数器、虚拟机栈、本地方法栈、堆、方法区、直接内存。 线程私有的有&#xff1a;程序计数器、虚拟机栈、本地方法栈 线程共有的有&#xff1a;堆、方法区、直接内存 堆空间又可以分为&#xff1a;新时代、…

contOS7安装docker命令及yum源更换为国内源

docker介绍 Docker是一个开源的容器化平台,通过将应用程序及其依赖打包成轻量级、可移植的容器,确保开发、测试和部署环境的一致性。Docker的核心概念包括容器、镜像、Dockerfile和镜像仓库。容器是轻量级的虚拟化技术,共享宿主机内核但保持独立运行环境,启动快且资源占用少…

SpringBoot集成Redis-6.x版本流程

SpringBoot集成Redis是我们常见的功能&#xff0c;今天我们分享一下&#xff1a; 前言&#xff1a; 1、pom包引用 <!-- Redis Starter (默认使用 Lettuce) --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boo…

zookeeper Curator(3):Watch事件监听

文章目录 Curator API 常用操作 Watch事件监听NodeCachePathChildrenCacheTreeCache 本章代码已分享至Gitee: https://gitee.com/lengcz/curator01 Curator API 常用操作 Watch事件监听 zookeeper 允许用户在指定节点上注册一些Watcher &#xff0c;并且在一些特定事件触发的时…

多模态融合相机L3CAM

多模态融合相机L3CAM L3CAM是Beamagine公司推出的多模态传感器融合技术&#xff0c;结合了激光雷达&#xff08;LiDAR&#xff09;和可见光摄像头&#xff0c;旨在为自动驾驶、工业机器人和其他需要精确环境感知的应用场景提供高效、安全的解决方案。 L3CAM技术参数 L3CAM结合…

结构化思维

前言 洞悉分析方法论 系统解决管理问题 1 构建问题分析框架 1.1 摘要 &#xff08;1&#xff09;何谓问题分析和解决&#xff1f; &#xff08;2&#xff09;问题分析和解决的基本原则 1.2 什么是问题分析与决策&#xff1f; 1.3 问题解决者需要具备的四种能力 &#xf…

什么是数字签名(ECDSA)?

数字签名是区块链、数字身份认证和安全通信的核心技术之一&#xff0c;ECDSA&#xff08;椭圆曲线数字签名算法&#xff09;是目前最常见、最主流的数字签名算法之一&#xff0c;尤其在区块链系统&#xff08;如比特币、以太坊、EOS&#xff09;中广泛应用。 一、什么是数字签名…

深入剖析AI大模型:Dify的介绍

今天介绍的内容&#xff0c;跟大模型开发还是息息相关的。俗话说&#xff1a;有人的地方就是江湖&#xff01;对于我们技术其实也一样&#xff0c;一个新技术的出现&#xff0c;自然会衍生出相应的生态圈。今天的文字只是介绍&#xff0c;以后会有专门的实操篇&#xff0c;主要…

Open VSX Registry关键漏洞使攻击者可完全控制Visual Studio Code扩展市场

网络安全研究人员近日披露了 Open VSX Registry&#xff08;"open-vsx[.]org"&#xff09;中存在的一个关键漏洞。若被成功利用&#xff0c;攻击者可能完全控制整个 Visual Studio Code 扩展市场&#xff0c;造成严重的供应链风险。 漏洞详情与潜在影响 Koi Securi…

Python从入门到高手9.1节-Python中的字典类型

目录 9.1.1 理解字典类型 9.1.2 字典的类型名 9.1.3 字典的定义 9.1.4 字典的主要性质 9.1.5 好好学习&#xff0c;天天向上 9.1.1 理解字典类型 在日常生活中&#xff0c;我们常常会接触到“字典”这种数据类型&#xff0c;例如一本书籍的目录结构&#xff0c;在目录结构…

封禁UDP端口提高防御能力分析

封禁不必要的 UDP 端口 确实可以在一定程度上提高系统的防御力&#xff0c;但这并不是一个绝对的“好”或“坏”的问题&#xff0c;需要根据具体情况来判断。以下是详细分析&#xff1a; ✅ 封禁 UDP 端口能提高防御力的原因 (优点) 减少攻击面&#xff1a; 服务暴露&#xff…

阿里云-arms监控

监控java应用 若是容器集群环境&#xff0c;则选择容器服务环境 手动安装方式&#xff0c;是手动把 agent的jar包放到 ecs服务器&#xff0c;然后运行个人的spring boot服务时&#xff0c;加上一些参数&#xff0c;将agent也启动运行 手动集成-添加agent 监控的是ecs中的java应…

c语言 char *str = ““ 和 char *str = NULL 以及 char str[] = {} 区别

目录 前言char *str "" 和 char *str NULL 区别char *str NULL 和 char str[] {} 区别char *str "" 和 char str[] {} 区别char *str "" 和 const char *str "" 区别 前言 C语言指针的使用非常常见且易出错&#xff0c;这里对…

小程序入门: tab bar 实现多页面快速切换效果

在小程序开发中&#xff0c;tab bar 是实现多页面快速切换的关键组件&#xff0c;能极大提升用户体验。上一篇我们完成了基础配置&#xff0c;今天深入探索&#xff0c;打造更丰富实用的 tab bar 效果。 实现目标 这次要在小程序底部创建包含 “首页”“消息”“联系我们” 三…

Python 数据分析:numpy,抽提,多维切片索引

目录 1 示例代码2 欢迎纠错3 免费爬虫------以下关于 Markdown 编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个…

【向上教育】结构化面试概述.pdf

目 录 第一章 面试须知—面试形式 .......................................................................................................... 1 一、结构化面试 .................................................................................................…