成品連結:Drum Kit
當按下指定按鍵時,播放音效以及渲染畫面(新增/移除 class 'playing')
首先我們先監聽瀏覽器按鍵事件,這裡我們選擇keydown
事件。查詢各按鍵 keyCode 可以到這裡
這裡使用
keypress
也可以,但與keydown
的差異是keypress
的 keyCode 大小寫分別是不同數字,而且只對文字、符號按鍵有用(例如 Esc 或是 Ctrl 就無效)
window.addEventListener('keydown', function(e) {
// 分別綁定key(畫面)與sound(音效檔案)
const key = document.querySelector(`.keys > div[data-key="${e.keyCode}"]`);
const sound = document.querySelector(`audio[data-key="${e.keyCode}"]`);
}
但由於我們只希望鍵盤 A ~ L 之間的按鍵有效果,為避免 key 與 sound 是null
所以加一行 if statement 判斷,若是null
則 return
// 確保在按到非指定按鍵時不會有反應
if (key === null) {return}
接著就可以開始渲染畫面和產生音效了!這裡分成畫面和聲音兩部分:
transition
結束時,移除 class playing。這裡我們使用 transitionend
這個事件來觸發動作,也就是當設定的transition: all .07s ease;
結束時觸發
border-color
、transform
以及box-shadow
,所以我們只選擇一項當代表來當被監聽的元素(transform
)play()
來播放即可currentTime
(當前時間)設定為 0 再播放已達到預期效果以下是完成後的程式碼
window.addEventListener('keydown', function(e) {
const key = document.querySelector(`.keys > div[data-key="${e.keyCode}"]`);
const sound = document.querySelector(`audio[data-key="${e.keyCode}"]`);
// 確保在按到非指定按鍵時不會有反應
if (key === null) {return}
// 渲染畫面,新增 class 'playing'
key.classList.add('playing');
// 當 transition 動畫結束後觸發事件
key.addEventListener('transitionend', function(e) {
// 更改的 css 很多,選一個當代表(transform)
if(e.propertyName !== "transform") {return}
// 移除 class 'playing'
key.classList.remove('playing');
});
// 每次按鍵時重置開始時間至 0
sound.currentTime = 0;
sound.play();
});
大功告成!如此我們就完成了第一天的作品了!
除了複習如何操作 DOM 元素,也學到了如何在 DOM 操做 html audio
tag 以及 transitionend
的監聽事件。