模拟打鼓

676 阅读1分钟

功能描述和最终效果

通过监听键盘的某些按键,实现按下对应键盘时,播放音频、DIV做出样式响应。

最终效果:(动次打次动次打次

打鼓.gif

大体的布局样式(html+css)

页面上有一排按钮,如图。

3E33F90D-6100-466a-BC26-A313050DD916.png

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}]`);

最后再调用dealwithDomdealwithAudio就行了

代码

具体的图片、音频素材可以在github上搜javascript30下载。

这里会传去掉图片和素材的代码,仅供参考哈。