效果
先看下最终实现效果,点击键盘相应的键,发出相应的声音,相应的DOM进行样式变化,
image.png
image.png
实现流程
监听键盘上的按键的keydown事件,并执行三个操作:
1、发出声音
// 声音 ,注意设置currentTime时间为0
const audio = document.querySelector(`audio[data-key = "${e.keyCode}"]`)
if(audio) {
audio.currentTime = 0;
audio.play();
}
2、改变样式
// 添加样式
const dom = document.querySelector(`div[data-key = "${e.keyCode}"]`)
if(dom) dom.classList.add("playing")
3、完成后,删除样式
// 移去样式
document.querySelectorAll(".key").forEach(key => {
key.addEventListener("transitionend",transitionendHandler)
function transitionendHandler(e) {
if (e.propertyName === 'transform') {
e.currentTarget.classList.remove("playing")
}
}
})
完整代码如下
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Drum Kit</title>
<style>
html{
font-size: 10px;
background: url("./background.jpg");
}
body,html {
margin: 0;
padding: 0;
font-family: sans-serif;
}
.keys{
display: flex;
flex: 1;
min-height: 100vh;
align-items: center;
justify-content: center;
}
.key{
border: .4rem solid black;
border-radius: .5rem;
margin: 1rem;
font-size: 1.5rem;
padding: 1rem .5rem;
transition: all .07s ease;
width: 10rem;
text-align: center;
color: white;
background: rgba(0,0,0,0.4);
text-shadow: 0 0 .5rem black;
}
kbd {
display: block;
font-size: 4rem;
}
.sound {
font-size: 1.2rem;
text-transform: uppercase;
letter-spacing: .1rem;
color: #ffc600;
}
.playing{
transform: scale(1.1);
border-color: #ffc600;
box-shadow: 0 0 1rem #ffc600;
}
</style>
</head>
<body>
<div class="keys">
<div data-key="65" class="key">
<kbd>A</kbd>
<span class="sound">clap</span>
</div>
<div data-key="83" class="key">
<kbd>S</kbd>
<span class="sound">hihat</span>
</div>
<div data-key="68" class="key">
<kbd>D</kbd>
<span class="sound">kick</span>
</div>
<div data-key="70" class="key">
<kbd>F</kbd>
<span class="sound">openhat</span>
</div>
<div data-key="71" class="key">
<kbd>G</kbd>
<span class="sound">boom</span>
</div>
<div data-key="72" class="key">
<kbd>H</kbd>
<span class="sound">ride</span>
</div>
<div data-key="74" class="key">
<kbd>J</kbd>
<span class="sound">snare</span>
</div>
<div data-key="75" class="key">
<kbd>K</kbd>
<span class="sound">tom</span>
</div>
<div data-key="76" class="key">
<kbd>L</kbd>
<span class="sound">tink</span>
</div>
</div>
<audio data-key="65" src="./sounds/clap.wav"></audio>
<audio data-key="83" src="sounds/hihat.wav"></audio>
<audio data-key="68" src="sounds/kick.wav"></audio>
<audio data-key="70" src="sounds/openhat.wav"></audio>
<audio data-key="71" src="sounds/boom.wav"></audio>
<audio data-key="72" src="sounds/ride.wav"></audio>
<audio data-key="74" src="sounds/snare.wav"></audio>
<audio data-key="75" src="sounds/tom.wav"></audio>
<audio data-key="76" src="sounds/tink.wav"></audio>
<script>
(function () {
window.addEventListener("keydown", playHandler)
function playHandler(e) {
// 声音
/* querySelector(静态)getElementsByTagName(动态)
* */
const audio = document.querySelector(`audio[data-key = "${e.keyCode}"]`)
if(audio) {
audio.currentTime = 0;
audio.play();
}
// 添加样式
const dom = document.querySelector(`div[data-key = "${e.keyCode}"]`)
if(dom) dom.classList.add("playing")
}
// 移去样式
document.querySelectorAll(".key").forEach(key => {
key.addEventListener("transitionend",transitionendHandler)
function transitionendHandler(e) {
if (e.propertyName === 'transform') {
e.currentTarget.classList.remove("playing")
}
}
})
})()
</script>
</body>
</html>