# JS30 - Drum kit - Ref : https://javascript30.com/ - demo : https://codepen.io/benben6515/full/XWKrmzg > By Benben --- ### html 結構 - 用 div 把每個按鍵都包住,並且加上 `data-key` 的屬性,對應到 keycode 的方式 - 把下面的 `audio` 標籤也對應到一樣的 `data-key` - [audio tag](https://www.w3schools.com/html/html5_audio.asp) - [keycode online](http://keycodes.atjayjo.com/#charcode) --- ### CSS 樣式 - background shorthand ```css background: url('https://i.imgur.com/b9r5sEL.jpg') bottom center; background-size: cover; background: #ffffff url("img_tree.png") no-repeat right top; ``` - background-color - background-image - background-repeat - background-position - text-transform: uppercase - 把字母轉大寫 --- ### JavaScript ```javascript function playSound(e) { const audio = document.querySelector(`audio[data-key="${e.keyCode}"]`); const key = document.querySelector(`.key[data-key="${e.keyCode}"]`); if(!audio) return; audio.currentTime = 0; audio.play(); key.classList.add('playing'); }; ``` ```javascript function removeTransition(e){ if(e.propertyName !== 'transform') return; this.classList.remove('playing'); } ``` - 如果元素的 tranform 結束了就移除 `playing` 的 class --- ```javascript const keys = document.querySelectorAll('.key'); keys.forEach(key => key.addEventListener('transitionend', removeTransition)) window.addEventListener('keydown', playSound); ``` - 在所有的 key 的元素加上 `transitionend` 的事件監聽 - 在所有的頁面加上 `keydown` 的事件監想,屬於事件代理 - Bug : 長按按鍵會一直加上 playing 的 class
{"metaMigratedAt":"2023-06-16T03:28:58.451Z","metaMigratedFrom":"Content","title":"JS30 - Drum kit","breaks":true,"contributors":"[{\"id\":\"501c937b-efc9-4941-94b4-ec0bc323749a\",\"add\":1659,\"del\":188}]"}
    1170 views