You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

探究:active与:focus伪类的关联及显示优先级问题

关于:active被:focus覆盖的现象解析

嘿,我完全懂你说的这个情况——这其实是浏览器处理交互状态的顺序,加上CSS规则优先级共同导致的结果!

先还原你遇到的场景代码,应该是类似这样的:

a {
  color: blueviolet; /* 默认蓝紫色 */
}
a:focus {
  color: green; /* 焦点状态:绿色 */
}
a:active {
  color: yellow; /* 激活状态:黄色 */
}

为什么看不到:active状态?

当你点击链接的时候,浏览器的交互流程是这样的:

  • 按下鼠标的瞬间,链接触发:active状态,理论上应该显示黄色
  • 但几乎在同一毫秒内,因为链接是可聚焦交互元素,浏览器会自动给它加上:focus焦点状态
  • 而CSS里的伪类(:focus、:active)优先级是完全相同的,这时候谁的规则写在后面,谁的样式就会覆盖前面的。你的代码里:focus规则应该是写在:active之后的,所以当元素同时处于两个状态时,:focus的绿色就会把:active的黄色覆盖掉,导致你只能看到颜色从蓝紫色跳转到绿色,完全看不到黄色的:active状态。

为什么移除:focus就能看到:active?

当你删掉a:focus规则后,点击链接时,元素只会触发:active这一个状态,没有其他同优先级的样式来覆盖它,所以就能正常看到黄色的激活状态了。

怎么让:active状态显示出来?

如果你想同时保留:focus样式,又能看到:active的效果,只需要调整CSS规则的顺序,把:active放在:focus后面就行:

a {
  color: blueviolet;
}
a:focus {
  color: green;
}
a:active {
  color: yellow; /* 移到:focus后面,同优先级下后定义的生效 */
}

这样操作时:按下鼠标会显示黄色(:active生效),松开鼠标后如果链接还保持焦点(比如没跳转页面),就会变回绿色(:focus生效),完美兼顾两种状态~

内容的提问来源于stack exchange,提问作者john c. j.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 03:41:07