Tailwind 默认不支持 hover:focus:active 等多伪类链式组合,因其伪类前缀为单层叠加而非嵌套逻辑;需通过插件自定义变体(如 focus-hover)或 JS 控制状态,且三重组合实际极少必要。
hover:focus:active 这类多伪类组合在 Tailwind 里不能直接写
Tailwind 默认不支持
这种链式伪类写法——它会直接忽略中间的
和
,只保留最后一个(比如
实际被解析为
)。根本原因是 Tailwind 的伪类前缀是“单层叠加”,不是 CSS 原生选择器的嵌套逻辑。
常见错误现象:
看似覆盖了所有状态,但鼠标悬停+点击瞬间,
样式不会生效,因为
被
覆盖了(浏览器实际匹配的是
,而 Tailwind 没生成这个变体)。
必须显式启用复合伪类变体,通过
配置
(v2)或
(v3+)
v3.3+ 推荐用
+
自定义,例如添加
或
原生不支持三重组合(如
),得拆成两两组合 + JS 控制 class 切换
如何让 hover:focus 同时生效(比如表单输入框获得焦点又悬停)
这是典型需求:用户鼠标移到已聚焦的
上,既要保持焦点态样式,又要叠加悬停反馈。Tailwind 默认的
是互斥的,必须生成
选择器。
实操建议:
立即学习
“
前端免费学习笔记(深入)
”;
使用HTML,CSS,JavaScript开发Android应用程序 英文文字pdf版附源文件
如果你了解HTML,CSS和JavaScript,您已经拥有所需的工具开发Android应用程序。本动手本书展示了如何使用这些开源web标准设计和建造,可适应任何Android设备的应用程序 - 无需使用Java。您将学习如何创建一个在您选择的平台的Android友好的网络应用程序,然后转换与自由PhoneGap框架到一个原生的Android应用程序。了解为什么设备无关的移动应用是未来的潮流,并开始构建应用程序,提供更
下载
v3.3+ 在
中添加插件:
然后可用
,它会生成
注意顺序:
表示“先 focus 再 hover”,反过来写
就得自己定义
(语义等价,但习惯上按事件流写)
不要试图用
模拟——
不合法,Tailwind 不解析这种嵌套
active 状态在按钮点击时“闪一下就消失”的真实原因
不是 Tailwind 的 bug,而是浏览器行为:移动端点击会触发
,但桌面端鼠标按下时,如果鼠标移出再松开,
会提前结束;更关键的是,
默认只作用于“正在被激活的元素”,一旦焦点转移或交互结束,样式立即回退。
单纯加
很难稳定看到效果,尤其在快速点击时
想延长反馈,得配合
:比如
让颜色变化可感知
真正需要“按下态持续”的场景(如开关按钮),应该用 JS 控制
类,而不是依赖
伪类
移动端要注意
默认被禁用(iOS Safari),需加
并确保元素可点击(
或
)
为什么别硬凑 hover:focus:active,而要分场景处理
三重伪类组合在真实项目中极少有不可替代的视觉需求。强行实现不仅配置复杂、生成冗余 CSS,还容易和可访问性冲突(比如键盘用户无法触发
)。
表单控件优先用
替代
,避免鼠标用户看到多余焦点环
按钮交互建议分层:默认态 →
(悬停提示)→
(键盘导航)→
(瞬时反馈),各自独立生效
如果设计稿真要求“悬停时点击才变色”,说明交互逻辑已超出 CSS 能力边界,该用
或
控制 class
所有自定义变体都会增加构建体积,v3 的
扫描机制也无法自动提取
这类字符串,必须手动声明
最常被忽略的一点:伪类顺序影响层叠优先级。哪怕你成功生成了
,它也可能被后面写的
覆盖——因为 Tailwind 按配置顺序生成 CSS 规则,不是按 HTML class 顺序。
hover:focus:active:focus:activeactive:hover:hoverclass="hover:bg-blue-500 focus:bg-yellow-400 active:bg-red-500"active:active:hover:hover:activetailwind.config.jsvariantspluginsplugin({})addVarianthover:focushover:activehover:focus:activefocus:xxx hover:xxx:focus:hovertailwind.config.jsplugins: [require('@tailwindcss/forms'), function({ addVariant }) { addVariant('focus-hover', '&:focus:hover'); }]focus-hover:bg-indigo-100.focus-hover\:bg-indigo-100:focus:hover { ... }focus-hoverhover-focus&:hover:focusgroupgroup-hover:group-focus::active:active:activeactive:bg-blacktransitiontransition-colors duration-150is-active:active:active* { -webkit-tap-highlight-color: transparent; }cursor: pointerrole="button":hoverfocus-visiblefocushoverfocusactiveuseStatedata-statecontenthover:focus:active:bg-xhover:focus:activedisabled:bg-gray-300