必须用 theme.extend.colors 扩展自定义色,直接赋值 theme.colors 会清空默认色;色阶需完整定义才支持 -500 后缀;jit 模式下须在模板中真实使用 class 才生成对应 css;fill/stroke/placeholder 等需手动扩展并推荐用 css 变量;深色模式需手动配置或使用变量。

tailwind.config.js 里加新颜色必须用 theme.extend.colors
直接写 theme.colors = { ... } 会清空所有默认色,bg-blue-500、text-gray-700 全部失效——这不是 bug,是 Tailwind v3+ 的设计逻辑。你只能扩展,不能覆盖。
正确姿势是把自定义色塞进 theme.extend.colors 对象里,键名用带引号的字符串(尤其含连字符时),值可以是单个 HEX,也可以是完整色阶对象:
-
'brand-red': '#e53e3e'→ 可用bg-brand-red、text-brand-red,但不支持-500后缀 -
'brand-red': { '50': '#fff5f5', '500': '#e53e3e', '900': '#742a2a' }→ 才能用bg-brand-red-500
为什么 bg-brand-red-500 没生效?大概率是色阶没写全或 JIT 没扫描到
Tailwind 3.0+ 默认启用 JIT 编译,它只生成你在模板中真实写过的 class。哪怕配置完全正确,只要 HTML 或 JSX 里没出现过 bg-brand-red-500,CSS 规则就不会被输出。
排查步骤:
- 在任意临时组件里加一句
<div class="bg-brand-red-500"></div>测试 - 检查
content配置是否覆盖你的源文件路径,比如src/**/*.{js,jsx,ts,tsx,html} - 开发时可临时注释掉
purge或设为空数组,排除编译遗漏 - 浏览器开发者工具里搜不到该 class 的 CSS 规则 → 基本确定是 JIT 未触发生成
自定义颜色要支持 fill、stroke、placeholder 等工具类,得手动扩展
Tailwind 默认只把 colors 映射到 background-color、color、border-color 和 ring-color 四类。SVG 的 fill 和 stroke、输入框的 placeholder 色,不会自动继承你新增的颜色。
必须显式在 theme.extend 中补全:
-
fill: { brandRed: 'var(--color-brand-red)' }(配合 CSS 变量更灵活) stroke: { brandRed: 'var(--color-brand-red)' }placeholderColor: { brandRed: 'var(--color-brand-red)' }
注意:这些扩展项的 key 名必须和你在 colors 里定义的一致,且推荐用 CSS 变量而非硬编码 HEX,方便后续深色模式切换。
深色模式下自定义色不会自动变体,必须手动配两套或用 CSS 变量
Tailwind 不会为 brand-red 自动推导 dark:fill-brand-red 或 dark:bg-brand-red-700。如果你希望深色模式下用不同色值,只有两个靠谱办法:
- 在
theme.extend.colors里为同一键定义两套值,比如'brand-red': { '50': '#fff5f5', '500': { DEFAULT: '#e53e3e', dark: '#b83280' } }(需 Tailwind v3.3+) - 更通用的做法:用 CSS 变量统一管理,
colors.brandRed设为var(--color-brand-red),然后在:root和.dark类里分别定义--color-brand-red
别指望 dark: 变体能自动适配你新加的颜色——它只对内置色开箱即用,自定义色得自己扛。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











