我不是码客而是钢琴师?用HTML5打造一台“敲击乐”钢琴,HTML背后的两个“男人”:CSS和jS.!!前端三剑客的第一次合作

113 阅读5分钟

🎼 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)

💡 使用 divspan 构建页面“盒子模型”,是前端布局的基础。


🎨 三、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 文档
HTMLdivspan布局与文本容器
CSSflex 布局实现居中与弹性排列
CSSbackground-size: cover背景图全屏适配
CSStransition实现平滑动画
CSSbackdrop-filter: blur()毛玻璃特效
JSaddEventListener('keydown')监听键盘输入
JSquerySelector()选择 DOM 元素
JSclassList.add/remove()控制类名实现交互
JSaudio.play()播放音频
JStransitionend动画结束后回调

✅ 七、开发效率技巧

技巧说明
! + TabVS Code 快速生成 HTML5 结构
Emmet 语法如 .key*8 生成 8 个琴键
Live Server 插件保存后自动刷新浏览器,实时预览
console.log(e)调试时查看事件对象,获取 keyCode

🚀 八、扩展建议(进阶方向)

  1. 触摸支持:在手机上点击琴键也能发声(touchstart 事件)
  2. 音量控制:添加音量滑块
  3. 录音功能:记录用户演奏并回放
  4. 主题切换:白天/黑夜模式
  5. MIDI 支持:连接真实电子乐器

📌 九、一句话总结

HTML 是骨架,CSS 是外衣,JavaScript 是灵魂
你的“敲击乐”项目,正是前端三剑客协同工作的完美体现!

通过这个项目,你不仅学会了基础语法,更掌握了:

  • 如何构建交互式 UI
  • 如何控制音频
  • 如何实现视觉反馈
  • 如何组织项目结构

🎉 结语
这不仅仅是一个网页,更是一台数字乐器
每一次键盘的敲击,都是你与代码的对话,也是你迈向全栈开发的第一步。

继续加油,下一个作品已经在路上!🎹💻🎶 一天一个大厂小知识,早日进入大厂!!!