🎼 HTML5 敲击乐 —— 交互式音乐键盘 项目学习笔记
“用代码演奏音乐,让网页发出声音。”
这是一个融合 HTML 结构、CSS 美化、JavaScript 行为 的经典前端入门项目。
🧱 一、项目目标
开发一个可交互的网页音乐键盘,用户按下键盘上的 A-H 键时:
✅ 对应的“琴键”高亮发光
✅ 播放对应的音效(如鼓声、掌声等)
✅ 视觉反馈后自动恢复
🎯 核心技术:
HTML + CSS + JavaScript + 音频控制
🏗️ 二、HTML:搭建“键盘”结构(结构层)
1. 基础文档声明
html
预览
<!DOCTYPE html>
- 告诉浏览器:这是一个 HTML5 文档
- 类似于
.txt、.pdf,.html是一种文件格式,<!DOCTYPE html>是它的“身份证”
💬 面试题 Q1:
<!DOCTYPE html>有什么用?为什么必须写?
✅ 答:
<!DOCTYPE html>是 HTML5 的文档类型声明,作用是:
- 告诉浏览器使用 标准模式(Standards Mode) 渲染页面
- 避免进入“怪异模式(Quirks Mode)”,防止布局错乱
- 是现代网页开发的必备声明
📌 加分回答:
如果不写,浏览器可能使用旧版渲染规则,导致盒模型、box-sizing等行为异常,影响页面一致性。
2. 页面元信息设置
html
预览
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
charset="UTF-8":支持中文和特殊字符viewport:适配移动端,响应式设计基础
3. 引入资源
html
预览
<link rel="stylesheet" href="./style.css">
<script src="./script.js"></script>
- 外部 CSS 控制样式
- 外部 JS 实现交互行为
4. 键盘结构(模拟钢琴)
html
预览
<div class="keys">
<div class="key">
<h3>A</h3>
<span class="sounds">clap</span>
</div>
<!-- B 到 H ... -->
</div>
-
.keys:容器,存放所有琴键 -
.key:每个琴键,包含:h3:显示按键字母(如 A)span.sounds:显示音效名称(如 clap)
💡 使用
div和span构建页面“盒子模型”,是前端布局的基础。
🎨 三、CSS:美化界面(表现层)
1. 重置默认样式
css
编辑
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
- 清除浏览器默认边距
box-sizing: border-box:让padding和border包含在width内,布局更可控
💬 面试题 Q2:
box-sizing: border-box的作用是什么?为什么要用它?
✅ 答:
默认情况下,元素的width只包含内容区域,不包括 padding 和 border,容易导致实际宽度超出预期。使用
box-sizing: border-box后,width将包含 内容 + padding + border,更符合直觉。例如:
css 编辑 div { width: 100px; padding: 20px; border: 5px solid red; }
- 默认:实际宽度 = 100 + 40 + 10 = 150px
border-box:内容区域自动压缩为 50px,总宽仍为 100px📌 加分回答:
我们通常在全局使用* { box-sizing: border-box; },让所有元素遵循统一规则,提升布局可控性。
2. 全屏居中布局
css
编辑
body, html {
height: 100%;
}
html {
font-size: 10px;
background: url('./background.jpg') bottom center no-repeat;
background-size: cover;
display: flex;
justify-content: center;
align-items: center;
}
height: 100%:让页面占满视口flex布局实现水平 + 垂直居中background-size: cover:背景图覆盖全屏,自动缩放
⚠️ 注意:图片路径拼写错误 →
'backgrond.jpg'应为'background.jpg'
3. 键盘样式设计
css
编辑
.keys {
display: flex;
gap: 0.5rem;
flex-wrap: wrap;
max-width: 90vw;
justify-content: center;
padding: 2rem;
}
flex布局让琴键水平排列gap:设置琴键间距flex-wrap: wrap:小屏幕自动换行max-width:防止超出屏幕
4. 单个琴键样式
css
编辑
.key {
width: 8rem;
padding: 1rem 0.5rem;
border: 0.4rem solid #b7b7b7;
border-radius: 0.5rem;
background: rgba(0, 0, 0, 0.3);
backdrop-filter: blur(10px); /* 毛玻璃效果 */
color: white;
text-align: center;
box-shadow: 0 0.2rem 0.5rem rgba(0,0,0,0.2);
transition: all 0.1s ease;
}
rgba():半透明背景,透出背景图backdrop-filter: blur(10px):毛玻璃效果(现代浏览器支持)transition:为后续动画做准备
5. 字体与排版
css
编辑
.key h3 {
font-size: 3rem;
line-height: 1;
margin-bottom: 0.5rem;
}
.key .sounds {
font-size: 1.5rem;
text-transform: uppercase;
letter-spacing: 0.1rem;
color: #ccc;
}
- 大字体突出按键,小字体显示音效名
text-transform: uppercase:统一为大写
⚡ 四、JavaScript:实现“敲击”行为(行为层)
目标:按下键盘 → 播放音效 + 视觉反馈
1. 监听键盘事件
javascript
编辑
window.addEventListener('keydown', playSound);
- 监听全局
keydown事件,用户按下任意键时触发
2. 根据按键播放音频
javascript
编辑
function playSound(e) {
const audio = document.querySelector(`audio[data-key="${e.keyCode}"]`);
const key = document.querySelector(`.key[data-key="${e.keyCode}"]`);
if (!audio) return; // 如果没有对应音频,直接退出
key.classList.add('playing'); // 添加高亮类
audio.currentTime = 0; // 重置音频,支持快速连按
audio.play(); // 播放声音
}
e.keyCode:获取按键的数字编码(A=65, B=66, ..., H=72)data-key属性用于匹配按键与音频
3. 动画结束后移除类
javascript
编辑
function removeTransition(e) {
if (e.propertyName !== 'transform') return; // 只处理 transform 动画
this.classList.remove('playing');
}
const keys = document.querySelectorAll('.key');
keys.forEach(key => key.addEventListener('transitionend', removeTransition));
transitionend事件:CSS 动画结束后触发- 移除
.playing类,恢复琴键原状
🔊 五、音频资源准备(补充 HTML)
在 </body> 前添加音频标签:
html
预览
<audio data-key="65" src="sounds/clap.wav"></audio> <!-- A -->
<audio data-key="66" src="sounds/hihat.wav"></audio> <!-- B -->
<audio data-key="67" src="sounds/hihat.wav"></audio> <!-- C -->
<audio data-key="68" src="sounds/kick.wav"></audio> <!-- D -->
<audio data-key="69" src="sounds/boom.wav"></audio> <!-- E -->
<audio data-key="70" src="sounds/openhat.wav"></audio> <!-- F -->
<audio data-key="71" src="sounds/tom.wav"></audio> <!-- G -->
<audio data-key="72" src="sounds/tink.wav"></audio> <!-- H -->
📁 创建
sounds/文件夹,放入对应的.wav音频文件
🎯 六、关键知识点总结
| 技术 | 知识点 | 作用 |
|---|---|---|
| HTML | <!DOCTYPE html> | 声明 HTML5 文档 |
| HTML | div, span | 布局与文本容器 |
| CSS | flex 布局 | 实现居中与弹性排列 |
| CSS | background-size: cover | 背景图全屏适配 |
| CSS | transition | 实现平滑动画 |
| CSS | backdrop-filter: blur() | 毛玻璃特效 |
| JS | addEventListener('keydown') | 监听键盘输入 |
| JS | querySelector() | 选择 DOM 元素 |
| JS | classList.add/remove() | 控制类名实现交互 |
| JS | audio.play() | 播放音频 |
| JS | transitionend | 动画结束后回调 |
✅ 七、开发效率技巧
| 技巧 | 说明 |
|---|---|
! + Tab | VS Code 快速生成 HTML5 结构 |
| Emmet 语法 | 如 .key*8 生成 8 个琴键 |
| Live Server 插件 | 保存后自动刷新浏览器,实时预览 |
console.log(e) | 调试时查看事件对象,获取 keyCode |
🚀 八、扩展建议(进阶方向)
- 触摸支持:在手机上点击琴键也能发声(
touchstart事件) - 音量控制:添加音量滑块
- 录音功能:记录用户演奏并回放
- 主题切换:白天/黑夜模式
- MIDI 支持:连接真实电子乐器
📌 九、一句话总结
HTML 是骨架,CSS 是外衣,JavaScript 是灵魂
你的“敲击乐”项目,正是前端三剑客协同工作的完美体现!
通过这个项目,你不仅学会了基础语法,更掌握了:
- 如何构建交互式 UI
- 如何控制音频
- 如何实现视觉反馈
- 如何组织项目结构
🎉 结语:
这不仅仅是一个网页,更是一台数字乐器。
每一次键盘的敲击,都是你与代码的对话,也是你迈向全栈开发的第一步。
继续加油,下一个作品已经在路上!🎹💻🎶 一天一个大厂小知识,早日进入大厂!!!