active 伪类
CSS 提供了专门针对鼠标不同状态的伪类,active 就是用来定义元素被激活(即鼠标按下并释放)时的样式。

(图片来源网络,侵删)
hover:鼠标悬停在元素上时的样式。active:鼠标在元素上按下时的样式。focus:元素获得焦点(例如点击后或用 Tab 键选中)时的样式。
对于“点击后变色”这个需求,active 是最直接的选择。
基础实现(使用 active)
这是最简单、最核心的方法,我们为按钮添加一个 active 伪类,并改变其背景颜色。
代码示例
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">按钮点击变色</title>
<style>
/* 基础按钮样式 */
.my-button {
padding: 10px 20px;
font-size: 16px;
font-family: sans-serif;
color: white;
background-color: #007bff; /* 初始颜色 */
border: none;
border-radius: 5px;
cursor: pointer;
transition: background-color 0.2s ease; /* 添加过渡效果,让变化更平滑 */
}
/* 鼠标悬停时的样式 */
.my-button:hover {
background-color: #0056b3;
}
/* 鼠标点击并按住时的样式 */
.my-button:active {
background-color: #004085; /* 点击时的颜色 */
}
</style>
</head>
<body>
<button class="my-button">点击我</button>
</body>
</html>
代码解析:
.my-button定义了按钮的默认样式。.my-button:hover定义了当鼠标移到按钮上时,背景色变为#0056b3,提供视觉反馈。.my-button:active定义了当鼠标在按钮上点击时,背景色变为#004085,这就是你想要的“点击后变色”效果。transition属性(可选但推荐)可以让颜色变化有一个平滑的过渡动画,而不是瞬间切换,体验更好。
点击后保持变色(使用 checked 和 input)
我们希望按钮被点击后,颜色能够保持住,直到再次点击,这需要一点技巧,因为 <button> 元素本身没有“选中/未选中”的状态,我们可以利用 <input type="checkbox"> 的 checked 伪类来实现。

(图片来源网络,侵删)
原理
将一个 checkbox 隐藏,然后用 label 标签来模拟按钮,点击 label 会同时触发 checkbox 的选中/取消,我们可以通过 checked 状态来改变 label 的样式。
代码示例
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">按钮点击后保持变色</title>
<style>
/* 隐藏原始的 checkbox */
#toggle-button {
display: none;
}
/* 模拟按钮的 label 样式 */
.toggle-button-label {
display: inline-block;
padding: 10px 20px;
font-size: 16px;
font-family: sans-serif;
color: white;
background-color: #28a745; /* 初始颜色(绿色) */
border: none;
border-radius: 5px;
cursor: pointer;
transition: background-color 0.3s ease;
}
/* 当 checkbox 被选中时,改变 label 的样式 */
#toggle-button:checked + .toggle-button-label {
background-color: #dc3545; /* 点击后保持的颜色(红色) */
}
/* 添加悬停效果 */
.toggle-button-label:hover {
opacity: 0.9;
}
</style>
</head>
<body>
<!-- 隐藏的 checkbox 和与之关联的 label -->
<input type="checkbox" id="toggle-button">
<label for="toggle-button" class="toggle-button-label">切换状态</label>
</body>
</html>
代码解析:
<input type="checkbox" id="toggle-button">是一个隐藏的复选框。<label for="toggle-button" ...>的for属性让它与上面的input关联起来,点击label就相当于点击input。#toggle-button:checked + .toggle-button-label是关键,这个选择器表示:当id为toggle-button的input被选中时(checked),选择它后面紧邻的()兄弟元素class为toggle-button-label的label,并应用其样式。- 这样,每次点击
label,checkbox的状态就会切换,从而触发样式的改变,实现了“切换”效果。
使用 JavaScript(更灵活的控制)
CSS 无法满足你的需求(点击后变色,但几秒后自动恢复),或者你需要更复杂的交互逻辑,JavaScript 是最佳选择。
原理
通过 JavaScript 监听按钮的 click 事件,在事件处理函数中动态地修改按钮的 CSS 类或 style 属性。

(图片来源网络,侵删)
代码示例
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">JS 实现点击变色</title>
<style>
.js-button {
padding: 10px 20px;
font-size: 16px;
font-family: sans-serif;
color: white;
background-color: #6f42c1; /* 初始紫色 */
border: none;
border-radius: 5px;
cursor: pointer;
transition: background-color 0.2s ease;
}
/* 定义一个“点击后”的样式类 */
.clicked {
background-color: #fd7e14; /* 点击后的橙色 */
}
</style>
</head>
<body>
<button id="my-js-button" class="js-button">JS 点击变色</button>
<script>
// 1. 获取按钮元素
const myButton = document.getElementById('my-js-button');
// 2. 为按钮添加点击事件监听器
myButton.addEventListener('click', function() {
// 3. 在点击时,切换 'clicked' 类
// 如果有这个类就移除,没有就添加
this.classList.toggle('clicked');
// 或者,你也可以直接操作 style
// this.style.backgroundColor = '#fd7e14';
// setTimeout(() => {
// this.style.backgroundColor = '#6f42c1';
// }, 300); // 300毫秒后恢复
});
</script>
</body>
</html>
代码解析:
- 我们在 CSS 中定义了一个
.clicked类,它包含点击后的颜色。 - JavaScript 通过
document.getElementById获取按钮。 - 使用
addEventListener监听click事件。 - 在事件处理函数中,
this.classList.toggle('clicked')会检查按钮是否已经有clicked类。- 如果没有,就添加它(按钮变色)。
- 如果有,就移除它(按钮恢复原色)。
- 这种方法非常灵活,可以轻松实现“点击后变色,再次点击恢复”的切换效果,或者结合
setTimeout实现点击后变色一段时间再恢复的效果。
总结与对比
| 方法 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
active 伪类 |
简单的点击反馈(如按钮按下效果) | 纯CSS,性能好,代码简单 | 点击效果只在鼠标按住时存在,松开后即消失 |
checked 伪类 |
需要点击后保持状态(如开关、选中状态) | 纯CSS,状态切换清晰 | 需要HTML结构配合(input + label),不适用于所有场景 |
| JavaScript | 复杂交互逻辑、动态控制、需要状态保持或超时恢复 | 功能最强大,逻辑灵活,控制精确 | 需要编写JS代码,可能增加复杂度,有轻微性能开销 |
推荐选择:
- 仅需要点击时的瞬时反馈:使用
active,这是最标准和高效的方式。 - 需要一个类似开关的、点击后保持的切换效果:使用
checked伪类,巧妙且优雅。 - 有更复杂的业务逻辑:使用 JavaScript,它提供了最强大的控制能力。
