HTML๊ตฌ์กฐ
<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>
const key = document.querySelector('.key');
const chgBox = () => {
key.classList.add('playing');
key.classList.add('sound');
}
const removeBox = () => {
key.classList.remove('playing');
key.classList.remove('sound');
}
key.addEventListener("mouseover",chgBox);
key.addEventListener("mouseout",removeBox);
</script>
A ๋ง ๊ตฌํ๋๊ณ ๋๋จธ์ง๋ ์ ๋ถ ๊ตฌํ์ด ๋์ง ์๋๋ค -> this๋ฅผ ์ฌ์ฉํด์ผ ํ ๊ฒ ๊ฐ์๋ฐ..๋ผ๊ณ ๊ณ ๋ฏผํ๋๋ฐ ์๊ณ ๋ณด๋ ๋ด๊ฐ ๋ฌธ์ ์ดํด๋ฅผ ์๋ชปํ๋ค. ๋ง์ฐ์ค์๋ํ ์ด๋ฒคํธ๊ฐ ์๋๋ผ ํค๋ณด๋์ ํค ๊ฐ์ ๋ฐ์์ ํ๋ฉด์ ๋์จ ์ํ๋ฒณ์ ์ ๋ ฅํ์ ๋ data-key๋ก ์ฐ๊ฒฐ๋์ด ์๋ audiotag์ ์ฐ๋์ด ๋์ ํด๋น ์ฌ์ด๋๋ผ ์ธ๋ ค์ผ ํ๊ณ , ๋์์ CSS transitionํจ๊ณผ๋ฅผ ์ฃผ์ด์ผ ํ๋ ๋ฌธ์ ์๋ค.
๐ ํฌ์ธํธ
- keydown ์ด๋ฒคํธ ์ฌ์ฉ - ํค๋ณด๋์ ๊ฐ์ด ์ ๋ ฅ๋์ด์ผ ํ๋ค.
- e.keyCode : ํค ๊ฐ(value)์ ๋ ฅ ๋ฐ๊ธฐ
- keycode.info ์ฌ์ดํธ๋ฅผ ํตํด ํค๋ณด๋๋ฅผ ์ ๋ ฅํ์ ๋์ ๊ฐ์ ์ ์ ์๋ค.
- audio.play() ๋ฉ์๋ : ์์ ์ฌ์
- transitionend() ์ด๋ฒคํธ : transition์ด ์๋ฃ๋ ์ดํ ๋ฐ์ํ๋ ์ด๋ฒคํธ, transition์๋ฃ๋ฅผ ๊ฐ์งํจ, transition๊ณผ ํจ๊ป ์ฌ์ฉํ๋ค. -> addEventListener๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋ฒคํธ ๋ชจ๋ํฐ๋ง๊ฐ๋ฅ
1) ์ฒซ๋ฒ์งธ๋ก ์ด๋์ ์ด๋ฒคํธ๋ฅผ ์ฃผ์ด์ผ ํ ๊ฒ์ธ๊ฐ?
window
์ ์ฃผ์ด์ผ ์ ์ฒด ํ๋ฉด์์! ํค๋ณด๋๋ฅผ ๋๋ฅด๊ธฐ๋งํ๋ฉด ์ด๋์๋ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๊ฒ ํ๋ ค๊ณ 2) data-key๋ผ๋ ์์ฑ๊ฐ์ ์ด๋ป๊ฒ ํํํด์ผ ํ ๊น?
[]
์ Backtick(``)ํ๊ธฐ๋ฒ
์ฌ์ฉ3) โ ์์ ์ฝ์์ฐฝ์ ํ์ธํด๋ณด๋ฉด ๊ฐ์ฒด ํํ๋ก ์ถ๋ ฅ์ด ๋๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
+) ๋ด๊ฐ ์
๋ ฅํ ๋ฐ๋ก ๊ทธ ํค๋ณด๋์ ํค ๊ฐ(value)๋ฅผ ๋ฐ๊ธฐ ์ํด e.keyCode
์ฌ์ฉ!
4) โข์์ ์ค๋์ค๋ฅผ ์คํ์์ผ๋ณด๊ณ ํค๋ณด๋๋ฅผ ๋๋ฅด๋ฉด ํน์ ํค๋ณด๋ ์
๋ ฅ ๊ฐ์ ๋ฐ๋ผ ์ค๋์ค๊ฐ ๋์จ๋ค.
โ
๋ฌธ์ ์ ๋ฐ์ !! : ์ฐ์ํด์ ํค๋ณด๋๋ฅผ ๋๋ ์๋, ์ค๋์ค ์ฌ์์ ๋ก๋ฉ์ด ๊ฑธ๋ฆฐ๋ค.
5) ์ด๋ฌํ ๋ฌธ์ ์ ์ ํด๊ฒฐํ๊ธฐ ์ํด currentTime ์์ฑ์ ์ฌ์ฉํ๋ค.
6) ์ด์ css ์ ๋๋ฉ์ด์
ํจ๊ณผ๋ฅผ ์ ์ฉํด๋ณด์
class๋ช
์ด 'key'์ธ ๋ฐ์ค๋ค ์์ ํค๋ณด๋ ์
๋ ฅ์ฐฝ์ด ์
๋ ฅ๋์ด ์๋ค.
๋ฐ๋ผ์ ์ด .key๋ฅผ ๋ณ์๋ก ์ค์ ํ๋ค.
โค๋ฒ์์ const key์ ์ฝ์์ ์ฐ์ด๋ณด๋ฉด, ํค ๊ฐ(์ซ์๊ฐ)์ด ์ ์์ ์ผ๋ก ๋์ค๊ณ ์์์ ํ์ธํ ์ ์๋ค.
7) ์ด key๋ผ๋ ๋ณ์์ class๋ฅผ ์ถ๊ฐํด์ฃผ๋ฉด border๊ฐ ๋ ธ๋์์ธ ๋ฐ์ค ํํ๊ฐ ๊ตฌํ๋จ์ ๋ณผ ์ ์๋ค.
8) โ
๋ฌธ์ ์ ๋ฐ์!! : removeClass๋ ์ด๋ป๊ฒ ์ฃผ์ด์ผ ํ๋?
โ ์กฐ๊ฑด: transitionํจ๊ณผ๊ฐ ๋ชจ๋ ๋๋๊ณ class๊ฐ ์ฆ, ๋
ธ๋์ borderline์ด ์ฌ๋ผ์ ธ์ผ ํ๋ค.
โ ๋ฐ๋ผ์ transitionend ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ค. ๐ ํจ์๋ก ๋ง๋ค์ด์ ์ฌ์ฉ
window.addEventListener(e){
//console.log(e) ........โ
//const audio = document.querySelector('audio');
const audio = document.querySelector(`audio[data-key="${e.keyCode}"]`);
//console.log(audio) ........โก
if(!audio) return; //audio๊ฐ์ ๋ฐ์ ์ ์๋ ํค ๊ฐ์ด ์ถ๋ ฅ๋ ๊ฒฝ์ฐ ๋ฉ์ถฐ!
audio.currentTIme = 0; //.......โฃ ์ค๋์ค / ๋น๋์ค ์ฌ์์ ํ์ฌ ์์น ๋ฐํํ๋๋ฐ ๊ทธ ๋ฐํํ๋ ์์น๋ฅผ 0์ผ๋ก ์ค์ ํ๊ฒ!
audio.play(); //............โข
//////////////////////////////////////////
const key = document.querySelector(`.key[data-key="${e.keyCode}"]`);
//console.log(key); ............โค
key.classList.add('playing');
//โฆํด๋์ค ์ ๊ฑฐํจ์ ๋ง๋ค๊ธฐ
function removeTransition(e){
//console.log(e); //
if(e.propertyName !== 'transform'){
// console.log(e.propertyName); //transform - h ํค๋ฅผ ๋๋ ์ ๋, data-key๊ฐ ์๋ ๊ฐ์ด๋ฏ๋ก ์ ์์ถ๋ ฅ
//console.log(this); //this = keys
this.classList.remove('palying');
}
const keys = document.querySelectorAll('.key');
//console.log(keys) .......โฅ์ ์ฌ๋ฐฐ์ด๊ฐ์ฒด ํํ๋ก ๋ฐํ , ๊ทธ ์ค e.propertyName์ด transition์ ์์ฑ์ ๋ํ๋ด๊ณ ์์์ ํ์ธ
//โง
keys.forEach((key) => key.addEventListener('transitionend', removeTransition));
}
์ ์์ ์ผ๋ก ์๋ํ๋ค!
์ฐธ๊ณ : transitionend_Event
์ฐธ๊ณ 2: dataset