:focus 在元素获得键盘焦点时生效,:active 仅在鼠标/触控按下到松开的瞬间触发;二者触发时机不同、可共存,且需结合 JS 和 :focus-visible 等方案应对多端兼容性问题。

:focus 和 :active 的触发时机完全不同
很多人以为 :focus 和 :active 是“按下去就同时生效”的,其实不是::focus 表示元素获得键盘焦点(比如 Tab 切入、input 被点击或调用 .focus()),而 :active 仅在鼠标/触控按下(mousedown / touchstart)到松开(mouseup / touchend)的瞬间生效,持续时间极短,且不依赖焦点状态。
这意味着:
-
button:active 在点击时亮一下,哪怕它没 tabindex 或没被聚焦过
-
button:focus 在键盘导航抵达时保持高亮,但点击时不一定触发 :active(比如鼠标点太快、系统延迟、或被 preventDefault 干扰)
- 两者可以共存:例如用键盘 Tab 到按钮后,再用鼠标点击——此时同时匹配
:focus:active
如何让按钮点击时既有 :active 反馈又保持 :focus 高亮
默认情况下,点击按钮会触发 :active,但松开后焦点可能丢失(尤其在 `