html5 Drumpkit鼓类乐器音频弹奏器的实现

376 阅读3分钟

Html5有着许多强大的功能实现,这里我们实现一个Drumpkit (电子鼓乐器)的音频弹奏器

image.png

当我们按下相对应的键时便会发出对应的音频,从而实现电子乐的弹奏,特此我特意加上了一点小样式作为装饰。

image.png

样式我们就不过多赘述,将在文章最后奉上。我们主要聊一聊怎么通过JS的方法实现这个功能,主要实现与用户的交互效果。

首先

我们将需要的音频和背景图片准备好打包放置好位置。

这里我多点了一个sound文件夹,大家可以少弄一个,后续文件查找就少一次打开,节约运行时间。 image.png

接下来进行HTML的创建

一般对于较少的数据导入,我们可以直接使用多个div标签直接进行渲染。这里我使用的vue中的v-for进行页面的渲染,div的个数取决于数据数组中的个数。
<div class="keys" >
    <div class="key" v-for="(item,index) in list">
      <div class="title">{{item.title}}</div>
      <span class="sound">{{item.sound}}</span>
</div>


//在JS中创建一个vue实例对象,并将数据写入
//id是用来后续查找用户按下的键值
const app=new Vue({
  el:'.keys',
  data:{
    list:[{title:'A',sound:'clap',id:'a'},{title:'S',sound:'hihat',id:'s'},{title:'D',sound:'kick',id:'d'},{title:'F',sound:'openhat',id:'f'},
    {title:'G',sound:'boom',id:'g'},{title:'H',sound:'ride',id:'h'},{title:'J',sound:'snare',id:'j'},{title:'K',sound:'tom',id:'k'},{title:'L',sound:'tink',id:'l'}]
  },
  methods:{
},
})

对页面的div添加上对应的id

id是不同key标签的唯一标识,这里用按键小写字母作为id的键值。
const keys =document.querySelectorAll('.key')
for(let i=0;i<keys.length;i++){
  keys[i].id=`${app.list[i].id}`
}

最后开始监听整个页面

对键盘事件进行监听

window.addEventListener('keydown',e=>{

//获取id与e.key相等的div标签
  let key=document.querySelector(`.key[id='${e.key}']`)
  
  //如果不存在e.key相等的id,则key值将为空。
  //判断key是否为空
  if(key){
  
  //增加被按按键的样式
    key.classList.add('palyMusic')
    
  //##############################################################
  //###在forEach外部创建变量带出循环体,目的是借用list中的sound数据###
  //###          不用对每一个key标签内加入radio地址             ###
  //###########################################################
  let index
  app.list.forEach(element => {
  //获取与key对应的list内的sound数据
    if(element.id===key.id){
        index=element
  }
  });
    // 直接创建一个音频对象,使用相对定位,使用list.sound节约代码量,不用每一个再添加音频地址
  let audio = new Audio(`./sounds/sounds/${index.sound}.wav`)
  //播放
    audio.play()
  setTimeout(()=>{
      key.classList.remove('palyMusic')
    },450)
  }
}
)

这就是html5 Drumpkit鼓类乐器音频弹奏器大致的内容实现

这里给大家在附上CSS代码

html{
font-size: 10px; /* css inhert */
background: url(./background.jpg) bottom center no-repeat;
background-size: cover;
}
html,body{
  height: 100vh;
}
.keys{
  display: flex;
  min-height: 100%;
  align-items: center;
  justify-content:center;
}
.key{
  border: 4px solid black;
  border-radius: 5px;
  margin: 10px;
  font-size: 15px;
  padding: 10px 5px;
  /* 过度动画 */
  transform:all 0.4s ease;

  width: 100px;
  text-align: center;
  color: white;
  background: rgb(0,0,0,0.4);
  /* text-shadow带来文字立体感 */
  text-shadow: 0 0 0.5rem black;
}

.key .title{
  font-size: 40px;

}
.sound{
  font-size: 12px;
  text-transform: uppercase;
  letter-spacing: 1px;
  color: #ffc600;
}
.palyMusic{
  transform: scale(1.1);
  border: 4px solid rgb(227, 200, 21);
  background-color: blueviolet;
}
从项目中也可以看出,一个项目中没有说纯使用vue的,一般将vue与is进行结合使用更多事半功倍的效果。

视频上传太麻烦了,给大家弹奏一首 shape of you