[JavaScript30] ๐Ÿฅ 01. Drum Kit

์กฐ์ค€ํ˜•ยท2021๋…„ 7์›” 4์ผ
0

JavaScript30

๋ชฉ๋ก ๋ณด๊ธฐ
1/30

๐Ÿฅ 01. Drum Kit

A, S, D, F, G, H, J, K ,L ์˜ ํ‚ค์ž…๋ ฅ์„ ๋ฐ›์•„ ๋งž๋Š” ์• ๋‹ˆ๋ฉ”์ด์…˜ํšจ๊ณผ์™€ ๋“œ๋Ÿผ ์†Œ๋ฆฌ๋ฅผ ์ถœ๋ ฅํ•˜๋Š” Drum Kit

์ดˆ๊ธฐ html : index-START.html ์ฐธ๊ณ .

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>JS Drum Kit</title>
  <link rel="stylesheet" href="style.css">
</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>
// add Answer

</script>


</body>
</html>

์ดˆ๊ธฐํ™”๋ฉด

๐ŸŒ ์ƒˆ๋กœ ์•Œ๊ฒŒ ๋œ ๊ฒƒ.

๐Ÿ‘‰ kbd Tag

kbd ํƒœ๊ทธ๋Š”ํ‚ค๋ณด๋“œ ์ž…๋ ฅ, ์Œ์„ฑ ์ž…๋ ฅ ๋“ฑ ์ž„์˜์˜ ์žฅ์น˜๋ฅผ ์‚ฌ์šฉํ•œ ์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

์ฐธ๊ณ  : https://developer.mozilla.org/ko/docs/Web/HTML/Element/kbd

๐Ÿ‘‰ data-* ์†์„ฑ

data-๋กœ ์‹œ์ž‘ํ•˜๋Š” ์†์„ฑ์€ ๋ฌด์—‡์ด๋“  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

data-colums , data-index-number, data-parent ๋“ฑ๋“ฑ...

์ด๋ฒˆ์˜ˆ์ œ์—์„œ ์‚ฌ์šฉํ•œ data-key์†์„ฑ์€ ์œ„์˜ div์™€ ์•„๋ž˜ audio๋ฅผ ํ•˜๋‚˜๋กœ ๋ฌถ๋Š” ์†์„ฑ์ด๊ณ ,

key๊ฐ’์„ ์šฐ๋ฆฌ๊ฐ€ ๋ˆ„๋ฅผ ํ‚ค๋ณด๋“œํ‚ค ASCII-Code๊ฐ’์œผ๋กœ ์—ฐ๊ฒฐํ•ด๋†“์•˜๋‹ค.

์ฐธ๊ณ  : https://developer.mozilla.org/ko/docs/Learn/HTML/Howto/Use_data_attributes

๐ŸŒ ๊ณผ์ •

๐Ÿ‘‰ 1.ํ•ด๋‹น ํ‚ค ์ž…๋ ฅ ์‹œ ํšจ๊ณผ์Œ์„ ์ถ”๊ฐ€.

// add Answer
window.addEventListener('keydown', function(e){
    // console.log(e);
    // console.log(e.keyCode);
    const audio = document.querySelector(`audio[data-key="${e.keyCode}"]`);
    // console.log(audio);
    if(!audio) return; // stop the function from running all togethers
    audio.currentTime = 0; // rewind to the start, ํ‚ค์˜ ์žฌ์ž…๋ ฅ์‹œ๊ฐ„ ์„ค์ •.
    audio.play();

});
const audio = document.querySelector(`audio[data-key="${e.keyCode}"]`);
์ผ์ผ์ด keyCode๋ฅผ ์ž…๋ ฅํ•˜์ง€ ์•Š๊ณ , ES6๋ฌธ๋ฒ• ํ™œ์šฉํ•ด ๋ฐฑํ‹ฑ(`)๊ณผ ${e.keycode}๋กœ ๊ฐ’์„ ๋ฐ›์Œ.

keyCode๋Š” console.log(e.keyCode)๋กœ ํ™•์ธ.

๐Ÿ‘‰ 2. ํ‚ค์˜ ์žฌ์ž…๋ ฅ ์‹œ๊ฐ„ ์„ค์ •

audio.currentTime = 0; // rewind to the start, ํ‚ค์˜ ์žฌ์ž…๋ ฅ์‹œ๊ฐ„ ์„ค์ •.

๐Ÿ‘‰ 3. ํšจ๊ณผ ์ข…๋ฃŒ์‹œ ๋ณ€ํ™”ํ•˜๋Š” ํ•จ์ˆ˜ ์ƒ์„ฑ

function removeTransition(e){
 	// console.log(e);
    if(e.propertyName !== 'transform') return; // skip if is it's not a transform
    // console.log(e.prototypeName);
    // console.log(this);
    this.classList.remove('playing');
}

removeTransition์—์„œ console.log(e) ๊ฒฐ๊ณผ

๋ˆ„๋ฅธ ํ‚ค์˜ ์†์„ฑ๋ช… ์ค‘ transform์ด ์—†์œผ๋ฉด ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜์ง€์•Š๊ณ , ์กด์žฌํ•˜๋ฉด playingํด๋ž˜์Šค๋ฅผ ์ง€์šด๋‹ค.

๐Ÿ‘‰ 4. ํšจ๊ณผ์Œ ์ถœ๋ ฅ ๋ฐ ์ข…๋ฃŒ ์„ค์ •

const keys = document.querySelectorAll('.key');
keys.forEach(key => key.addEventListener('transitionend', removeTransition));
window.addEventListener('keydown', playSound);
const keys = document.querySelectorAll('.key');

keyํด๋ž˜์Šค๋ฅผ ๊ฐ€์ง„ ๋ชจ๋“  ์š”์†Œ๋ฅผ keys์— ๋ฐฐ์—ด๋กœ ๋‹ด๊ณ ,

keys.forEach(key => key.addEventListener('transitionend', removeTransition));

forEach()๋ฅผ ํ†ตํ•ด ๊ฐ ์š”์†Œ์— ๋ณ€ํ™”๊ฐ€ ๋๋‚˜๋ฉด, removeTransitionํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•จ.

keys.forEach(key => key.addEventListener('transitionend', removeTransition));

ES6๋ฌธ๋ฒ•์˜ ํ™”์‚ดํ‘œํ•จ์ˆ˜๋ฅผ ์ด์šฉ.

์œ„์—์„œ ๋งŒ๋“  ํšจ๊ณผ์Œ์„ ์ถ”๊ฐ€ํ•˜๋Š” function์„ playSound()๋กœ ๋”ฐ๋กœ ๋งŒ๋“ค๊ณ ,

keydown event๋ฅผ script๊ฐ€์žฅ ์•„๋ž˜ ์ถ”๊ฐ€.

profile
๊นƒํ—ˆ๋ธŒ : github.com/JuneHyung

0๊ฐœ์˜ ๋Œ“๊ธ€