:active伪类仅在按下瞬间生效,无法持久高亮;持久高亮必须用javascript切换class实现,因css无法维持状态,且需兼顾可访问性(如支持键盘操作)和移动端兼容性(如touchstart处理)。

:active 伪类只在按下瞬间生效,不能“按完还亮着”;要持久高亮,必须用 JavaScript 控制 class 切换。
为什么 :active 看起来没反应?
常见现象是鼠标一按就闪一下、松开立刻还原,甚至完全没变化。根本原因通常是:
- 漏写了
transition:没有过渡动画,颜色或缩放变化就是硬切,人眼难捕捉 - 没加
cursor: pointer:用户看不出这是可点元素,尤其在移动端 - 误以为
:active是“选中态”:它只是“正在按”的瞬时状态,不是状态保持机制 - 移动端未处理
touchstart:部分安卓浏览器对:active支持弱,需额外监听并加touch-action: manipulation
如何让按钮“点下去就保持高亮”?
本质是状态管理,CSS 无法维持,必须靠 JS 切换 class。典型适用场景包括:单选按钮标签、多步骤表单当前项、模态框中根据数据自动激活的按钮。
如果你了解HTML,CSS和JavaScript,您已经拥有所需的工具开发Android应用程序。本动手本书展示了如何使用这些开源web标准设计和建造,可适应任何Android设备的应用程序 - 无需使用Java。您将学习如何创建一个在您选择的平台的Android友好的网络应用程序,然后转换与自由PhoneGap框架到一个原生的Android应用程序。了解为什么设备无关的移动应用是未来的潮流,并开始构建应用程序,提供更
- HTML 结构里,
<input type="radio">必须放在<label></label>前面,才能用:checked + label实现纯 CSS 持久高亮 - 否则统一用 JS:
element.classList.toggle("is-active")或.add()/.remove() - 动态渲染的模板,别反复
addEventListener,改用事件委托(如监听父容器的click,再判断event.target.matches(".btn-option")) - 移动端需同时监听
touchstart并调用event.preventDefault(),防止触发页面滚动
用 box-shadow 而不是 outline 或 border 高亮
在 Bootstrap 等框架中,焦点高亮默认用 box-shadow,因为它不改变盒模型尺寸、不影响布局,且风格可控。直接改 outline 会破坏可访问性焦点指示;改 border 则可能让按钮“跳动”。
- 定义一个类如
.btn-is-active,里面只写box-shadow,例如:box-shadow: 0 0 0 3px rgba(13, 110, 253, 0.25); - 这个值要和框架默认焦点阴影一致(Bootstrap 5 是
0 0 0 0.25rem rgba(13, 110, 253, 0.25)) - 如果按钮本身有
border-radius,box-shadow会自然圆角,无需额外处理 - 避免在
:focus和 JS 激活逻辑里混用同一套样式,否则键盘 tab 和鼠标点击行为会互相覆盖
真正容易被忽略的是:高亮是否与键盘导航一致。如果 JS 只响应 click,但用户用 Tab 进入按钮后按空格,:active 不触发、class 也不加——这就断开了可访问性链路。所以,持久高亮逻辑最好绑定在 click 和 change(对 input[type=radio])上,并确保 focus 状态有独立的视觉反馈。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










