不支持。tailwind css 明确禁止手写嵌套选择器(如 .card .header h2),因其 jit 引擎仅扫描 html 中原子类名,忽略所有手动编写的嵌套 css 规则,且 v4 已彻底移除嵌套 @apply 支持。

不能。Tailwind CSS 明确禁止手写嵌套选择器(如 .card .header h2),这不是功能缺失,而是 JIT 引擎设计契约的硬性限制——它只扫描 HTML 中出现的原子类名,完全忽略你在 CSS 文件里写的任何嵌套规则。
为什么 .card .header h2 这类写法必然失效
这类选择器在构建时不会生成任何 CSS,热更新后样式消失不是缓存问题,是 PostCSS 根本没把它当 Tailwind 代码处理:
-
@apply text-xl在嵌套块中直接报错:Cannot apply unknown utility class - 加了
md:前缀也不会生效,因为该选择器不在content配置路径里,JIT 跳过扫描 - 即使启用
postcss-nested,也不能在嵌套块里写@apply——插件不进入嵌套作用域解析 - SCSS 或 Vue
<style scoped></style>中的嵌套会被预处理器转成带属性选择器的扁平 CSS(如.card[data-v-abc] .card__title[data-v-abc]),而@apply只认原始类名
替代方案只有 @layer components + group 组合
想实现“嵌套效果”,必须放弃选择器思维,改用语义化组件声明和上下文触发机制:
- 用
@layer components定义独立、可复用的块级样式,例如:@layer components { .card-header { @apply px-6 py-4 border-b border-gray-200; } } -
group必须显式加在父容器上(hover:group是无效写法),且仅对后代生效;三层及以上 DOM 嵌套只能再套一层group,但别超过两层——否则结构臃肿、调试困难 - 所有
group-hover:类必须显式配transition,否则无动画效果,这个细节极易漏掉 - Tailwind v4 已彻底移除对嵌套
@apply的实验性支持;旧项目“能跑”大概率靠 v3.3 的 patch 或自定义插件撑着,升级后必崩
什么时候必须退回原生 CSS 选择器
Tailwind 不是替代选择器的工具,而是与之共存的样式层。三类场景绕不开原生选择器:
- 需要基于 DOM 结构动态响应,比如
:has(> .error)判断子元素状态 - 要穿透 scoped / shadow DOM(Vue 的
:deep()或 React 的::part()) - 实现复杂伪类组合,如
input:not([type="hidden"]):focus + label - 给 Tailwind 类留钩子:用语义化 class(如
form-group js-validate)做定位锚点,而非混用大量工具类+选择器目标
最常被忽略的一点:所谓“嵌套样式控制”,本质是分清边界——Tailwind 管单节点视觉声明,CSS 选择器管关系逻辑。强行用 @apply 覆盖或用 !important 硬顶,只会让样式失控更快。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











