功能描述和最终效果
通过监听键盘的某些按键,实现按下对应键盘时,播放音频、DIV做出样式响应。
最终效果:(动次打次动次打次)
大体的布局样式(html+css)
页面上有一排按钮,如图。
dom结构是这样的
<div class="container">
<div class="box-list">
<div class="box" data-key="A">A</div>
.....很多个Box
</div>
</div>
效果(js)
用一个对象来表示data-key和音频文件的关系
const musicBox = {
A: "boom.wav",
B: "clap.wav",
C: "hihat.wav",
D: "kick.wav",
E: "openhat.wav",
F: "ride.wav",
G: "snare.wav",
H: "tink.wav",
I: "tom.wav",
};
鼠标点击版
用事件委托监听鼠标点击,并通过event获取点击到的目标(以及目标的一些属性)
boxList.addEventListener("click", (event) => {
//判断是否点击了目标元素
if (event.target.className !== "box") return;
//获取目标元素
const target = event.target;
//获取key
const key = target.dataset.key;
//这里对被点击的dom做一些操作
dealwithDom(target);
//这里对音频做一些操作
dealwithAudio(key);
})
dealwithDom主要做:改变dom的样式
function dealwithDom(dom) {
const target = dom;
//改变目标元素的样式
target.className = "box active";
//过一会再把样式改回来
setTimeout(() => {
target.className = "box";
}, 300);
}
dealwithAudio主要做:根据key确定音频文件的路径,并播放音频
function dealwithAudio(key) {
//获取audio元素
const myaudio = document.getElementById("myaudio");
//根据key拼接出audio的src
myaudio.src = "./sounds/" + musicBox[key];
//播放audio
myaudio.play();
}
按键版
需要补充一个按键数组
const keybox = ["A", "B", "C", "D", "E", "F", "G", "H", "I"];
需要将监听事件的click改成keydown,监听的主题改成window
window.addEventListener("keydown", (event) => {...})
用判断按键代替之前判断目标元素的代码,记得转成大写
if(!keybox.includes(event.key.toUpperCase())) return
根据key,找到对应的dom target
const target = document.querySelector(`div[data-key=${key}]`);
最后再调用dealwithDom和dealwithAudio就行了
代码
具体的图片、音频素材可以在github上搜javascript30下载。
这里会传去掉图片和素材的代码,仅供参考哈。