点击图标边框变色
实现点击图标添加红色边框,点击空白处重置的交互效果
问题
实现以下效果:
- 点击容器内的图标,图标边框变成
border: 1px solid red - 点击空白处重置边框
解答
HTML 结构
<div class="container" id="container">
<span class="icon">🏠</span>
<span class="icon">⭐</span>
<span class="icon">❤️</span>
<span class="icon">🔔</span>
</div>
CSS 样式
.container {
display: flex;
gap: 20px;
padding: 40px;
background: #f5f5f5;
min-height: 200px;
}
.icon {
font-size: 32px;
padding: 10px;
cursor: pointer;
border: 1px solid transparent; /* 预留边框位置,避免点击时布局抖动 */
}
.icon.active {
border: 1px solid red;
}
JavaScript 实现
const container = document.getElementById('container');
container.addEventListener('click', function(e) {
// 获取所有图标
const icons = container.querySelectorAll('.icon');
// 先清除所有图标的选中状态
icons.forEach(icon => icon.classList.remove('active'));
// 判断点击的是否是图标
if (e.target.classList.contains('icon')) {
// 给点击的图标添加选中状态
e.target.classList.add('active');
}
// 如果点击的是空白处(container 本身),不做额外处理,边框已被重置
});
完整示例
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>点击图标边框变色</title>
<style>
.container {
display: flex;
gap: 20px;
padding: 40px;
background: #f5f5f5;
min-height: 200px;
}
.icon {
font-size: 32px;
padding: 10px;
cursor: pointer;
border: 1px solid transparent;
}
.icon.active {
border: 1px solid red;
}
</style>
</head>
<body>
<div class="container" id="container">
<span class="icon">🏠</span>
<span class="icon">⭐</span>
<span class="icon">❤️</span>
<span class="icon">🔔</span>
</div>
<script>
const container = document.getElementById('container');
container.addEventListener('click', function(e) {
const icons = container.querySelectorAll('.icon');
icons.forEach(icon => icon.classList.remove('active'));
if (e.target.classList.contains('icon')) {
e.target.classList.add('active');
}
});
</script>
</body>
</html>
关键点
- 事件委托:将事件监听器绑定在父容器上,通过
e.target判断实际点击的元素 - 预留边框空间:使用
border: 1px solid transparent避免添加边框时产生布局抖动 - 统一重置逻辑:每次点击先清除所有选中状态,再根据条件添加,逻辑更清晰
- classList API:使用
add/remove操作类名,比直接修改 style 更易维护
目录