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

使用Vanilla JS制作架子鼓,如何用CSS data-*属性实现按键对应边框变色

实现按键盘切换架子鼓元素边框颜色(基于data-*属性)

核心实现方案

通过HTML的data-*属性绑定按键与对应颜色,配合CSS属性选择器和原生JS键盘事件监听,实现按键触发边框颜色切换的效果。


HTML 结构

每个鼓元素通过data-key绑定键盘按键(小写),data-color定义对应的边框颜色:

<div class="drum-set">
  <div class="drum-key" data-key="a" data-color="#ff6b6b">
    <span>A</span>
    <p>军鼓</p>
  </div>
  <div class="drum-key" data-key="s" data-color="#4ecdc4">
    <span>S</span>
    <p>底鼓</p>
  </div>
  <div class="drum-key" data-key="d" data-color="#45b7d1">
    <span>D</span>
    <p>踩镲</p>
  </div>
  <!-- 可添加更多鼓元素 -->
</div>

CSS 样式

利用属性选择器匹配激活状态的鼓元素,通过attr()直接读取data-color的值设置边框颜色:

.drum-set {
  display: flex;
  gap: 1rem;
  padding: 2rem;
  justify-content: center;
}

.drum-key {
  width: 100px;
  height: 100px;
  border: 3px solid #333;
  border-radius: 8px;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  cursor: pointer;
  transition: border-color 0.2s ease;
}

/* 激活状态下读取data-color设置边框 */
.drum-key[data-active="true"] {
  border-color: attr(data-color color);
  transform: scale(1.05);
}

.drum-key span {
  font-size: 1.5rem;
  font-weight: bold;
}

.drum-key p {
  margin: 0.5rem 0 0;
  font-size: 0.9rem;
}

JavaScript 逻辑

监听键盘的keydown和keyup事件,切换对应鼓元素的data-active属性:

// 监听键盘按下事件
document.addEventListener('keydown', (e) => {
  const key = e.key.toLowerCase();
  const drumKey = document.querySelector(`.drum-key[data-key="${key}"]`);
  
  if (!drumKey || drumKey.dataset.active === 'true') return;
  
  drumKey.dataset.active = 'true';
  // 可在此添加音效播放逻辑
});

// 监听键盘抬起事件
document.addEventListener('keyup', (e) => {
  const key = e.key.toLowerCase();
  const drumKey = document.querySelector(`.drum-key[data-key="${key}"]`);
  
  if (!drumKey) return;
  
  drumKey.dataset.active = 'false';
});

关键细节说明

  1. data- 属性的作用*:
    • data-key建立键盘按键与鼓元素的关联,确保按下对应按键能精准定位元素
    • data-color直接存储颜色值,避免JS中硬编码颜色,实现样式与逻辑分离
  2. CSS 中的 attr() 用法:
    • attr(data-color color)将data-color的属性值解析为颜色类型,直接应用到border-color上
    • 配合过渡动画transition,让颜色切换更平滑
  3. 键盘事件处理:
    • 转换按键为小写,避免大小写不匹配的问题
    • 添加重复按键判断,防止按住按键时重复触发状态切换

内容的提问来源于stack exchange,提问作者user20958287

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 06:15:38