Day 1: JavaScript Drum Kit 透過 JavaScript 模擬一個打鼓的頁面,在按下按鍵的同時,頁面上對應的字母按鈕會變大並加上邊框,同時具有樂器的聲音。
播放、增加動態效果 Step1 : 偵測鍵盤按鍵Keycode 為了知道我們鍵盤按鍵所對應的 Keycode ,所以我們先建立一個 window 的監聽事件去監聽’按下鍵盤’這個動作 (keydown
),所然後再用 console.log(e.keyCode)
來看看所對應的 Keycode。
1 2 window .addEventListener('keydown' , e => console .log(e.keyCode));
透過 這個網站 可以快速的查看對應的鍵碼。
Step2 : 播放聲音及改變樣式 1 2 3 4 5 6 7 8 9 10 11 12 13 14 function playSound (e ) { let audio = document .querySelector(`audio[data-key='${e.keyCode} ']` ); let btn = document .querySelector(`.key[data-key='${e.keyCode} ']` ); if (!audio) return false ; if (!btn) return false ; if (btn.classList.contains('cut' ))return false ; btn.classList.add('playing' ); btn.classList.add('cut' ); audio.currentTime = 0 ; audio.play(); }
這時,當我們按下按鍵後,特效跟音效都出來了,但還有個問題,就是按下去後畫面上的按鍵不會回復成原本的樣子。
所以我們要用 transitionend
事件去做處理 :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 function reCut (e ) { let btn = document .querySelector(`.key[data-key='${e.keyCode} ']` ); if (!btn) return false ; btn.classList.remove('cut' ); } let keys=document .querySelectorAll('.key' );keys.forEach(function (key ) { key.addEventListener('transitionend' ,removetrasition) }); function removetrasition (e ) { if (e.propertyName !== 'transform' ) return false ; e.target.classList.remove('playing' ); };
這時,就大功告成啦!
完整 JS 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 function removetrasition (e ) { if (e.propertyName !== 'transform' ) return false ; e.target.classList.remove('playing' ); } function playSound (e ) { let btn = document .querySelector(`.key[data-key='${e.keyCode} ']` ); let audio = document .querySelector(`audio[data-key='${e.keyCode} ']` ); if (!audio) return false ; if (!btn) return false ; if (btn.classList.contains('cut' ))return false ; btn.classList.add('playing' ); btn.classList.add('cut' ); audio.currentTime = 0 ; audio.play(); } function reCut (e ) { let btn = document .querySelector(`.key[data-key='${e.keyCode} ']` ); if (!btn) return false ; btn.classList.remove('cut' ); } let keys=document .querySelectorAll('.key' );keys.forEach(function (key ) { key.addEventListener('transitionend' ,removetrasition) }); window .addEventListener('keydown' ,playSound);window .addEventListener('keyup' ,reCut);
相關連結