[JS] ๐๏ธJavaScript 30 - Day 1
๐Day 1 - JAVASCRIPT DRUM KIT
JavaScript 30์ Day 1 ํ๋ก์ ํธ๋ '๋๋ผ ํท ๋ง๋ค๊ธฐ'์ด๋ค. ํ๋ฉด์ ๋งค์นญ ๋ ํค๋ณด๋ ๋ฒํผ์ ๋๋ฅด๋ฉด ์ฐ๊ฒฐ๋ audio ํ์ผ์ ์ฌ์ํ๋ ํ๋ก์ ํธ์ด๋ค.
๐ค๐์ฝ๋ ๋ชจ์๋ณด๊ธฐ
HTML
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <title>JS Guitar Kit</title> <link rel="stylesheet" href="style.css" /> </head> <body> <div class="keys"> <div class="up-key"> <div data-key="q" class="key"> <kbd>Q</kbd> <span class="sound">A2A3</span> </div> <div data-key="w" class="key"> <kbd>W</kbd> <span class="sound">A3</span> </div> <div data-key="e" class="key"> <kbd>E</kbd> <span class="sound">B2</span> </div> <div data-key="r" class="key"> <kbd>R</kbd> <span class="sound">B3</span> </div> <div data-key="u" class="key"> <kbd>U</kbd> <span class="sound">B3B4</span> </div> <div data-key="i" class="key"> <kbd>I</kbd> <span class="sound">B4</span> </div> <div data-key="o" class="key"> <kbd>O</kbd> <span class="sound">C#3</span> </div> <div data-key="p" class="key"> <kbd>P</kbd> <span class="sound">C#3C#4</span> </div> </div> <div class="down-key"> <div data-key="a" class="key"> <kbd>A</kbd> <span class="sound">C#4</span> </div> <div data-key="s" class="key"> <kbd>S</kbd> <span class="sound">D#4</span> </div> <div data-key="d" class="key"> <kbd>D</kbd> <span class="sound">D3</span> </div> <div data-key="f" class="key"> <kbd>F</kbd> <span class="sound">D5</span> </div> <div data-key="j" class="key"> <kbd>J</kbd> <span class="sound">E2</span> </div> <div data-key="k" class="key"> <kbd>K</kbd> <span class="sound">E4</span> </div> <div data-key="l" class="key"> <kbd>L</kbd> <span class="sound">F2</span> </div> <div data-key=";" class="key"> <kbd>:</kbd> <span class="sound">F2F3</span> </div> </div> </div> <audio data-key="q" src="./sounds/A2A3.wav"></audio> <audio data-key="w" src="./sounds/A3.wav"></audio> <audio data-key="e" src="./sounds/B2.wav"></audio> <audio data-key="r" src="./sounds/B3.wav"></audio> <audio data-key="u" src="./sounds/B3B4.wav"></audio> <audio data-key="i" src="./sounds/B4.wav"></audio> <audio data-key="o" src="./sounds/C_3.wav"></audio> <audio data-key="p" src="./sounds/C_3C_4.wav"></audio> <audio data-key="a" src="./sounds/C_4.wav"></audio> <audio data-key="s" src="./sounds/D_4.wav"></audio> <audio data-key="d" src="./sounds/D3.wav"></audio> <audio data-key="f" src="./sounds/D5.wav"></audio> <audio data-key="j" src="./sounds/E2.wav"></audio> <audio data-key="k" src="./sounds/E4.wav"></audio> <audio data-key="l" src="./sounds/F2.wav"></audio> <audio data-key=";" src="./sounds/F2F3.wav"></audio> <script src="main.js"></script> </body> </html>
CSS
html { font-size: 10px; background: url("./images/background.jpg") center; background-size: cover; } body, html { margin: 0; padding: 0; font-family: sans-serif; } .keys { display: flex; flex-direction: column; min-height: 100vh; align-items: center; justify-content: center; } .up-key, .down-key { display: flex; } .key { border: 0.4rem solid black; border-radius: 0.5rem; margin: 1rem; font-size: 1.5rem; padding: 1rem 0.5rem; transition: all 0.07s ease; width: 10rem; text-align: center; color: white; background: rgba(0, 0, 0, 0.4); text-shadow: 0 0 0.5rem black; } .up-key .key:nth-child(4) { margin-right: 25rem; } .down-key .key:nth-child(4) { margin-right: 10rem; } .playing { transform: scale(1.1); border-color: #ffc600; box-shadow: 0 0 1rem #ffc600; } kbd { display: block; font-size: 4rem; } .sound { font-size: 1.2rem; text-transform: uppercase; letter-spacing: 0.1rem; color: #ffc600; }
JavaScript
function playSound(e) { console.log(e.key); const audio = document.querySelector(`audio[data-key='${e.key}']`); const key = document.querySelector(`.key[data-key='${e.key}']`); if (audio) { audio.currentTime = 0; // rewind to the start (์ฒ์์ผ๋ก ๋๋๋ฆฐ๋ค.) audio.play(); key.classList.add("playing"); } } function removeTransition(e) { if (e.propertyName === "transform") { this.classList.remove("playing"); } } window.addEventListener("keydown", playSound); const keys = document.querySelectorAll(".key"); keys.forEach((key) => key.addEventListener("transitionend", removeTransition));
๐์ฝ๋ ์ค๋ช
- ๊ฐ์ฅ ๋จผ์ ํด๋น ํค๋ณด๋ ๋ฒํผ์ ๋๋ฅด๋ฉด audio๊ฐ ์ฌ์๋์ด์ผ ํ๋ค. ๊ฐ์์์๋
KeyboardEvent.keyCode
๋ฅผ ์ด์ฉํด ์ฌ์ฉ์๊ฐ ๋๋ฅธ ํค์ ๊ฐ์ ๋ฐํ๋ฐ์์ง๋ง, MDN ๋ฌธ์๋ฅผ ํ์ธํด๋ณด๋ Deprecated(๋ ์ด์ ์ฌ์ฉ๋์ง ์๋๋ค) ๋ผ๊ณ ๋์ด์์ด,KeyboardEvent.key
๋ฅผ ์ด์ฉํด ์ฝ๋๋ฅผ ์์ ํ๋ค. ์ด๋ ๊ฒ ์ป์ ๊ฐ์ audio์ data-key๋ผ๋ ํ๋กํผํฐ์ ๊ฐ๊ณผ ๋น๊ตํ๊ณ ๋์ผํ ๊ฒฝ์ฐ ํด๋น audio ํ์ผ์ ์ฌ์ํ๋ค. - ์ด์ ํค๋ณด๋๋ฅผ ๋๋ ์ ๋, ์๋ฆฌ๋ ๋์ค์ง๋ง ๋๊ฐ์ ๋ฒํผ์ ์ฌ๋ฌ๋ฒ ๋๋ฅผ ๊ฒฝ์ฐ ์ด์ ์ audio ํ์ผ์ด ๋๋์ง ์์๋ค๋ฉด ์๋ก์ด ์๋ฆฌ๊ฐ ๋์ค์ง ์๋ ๊ฒ์ ํ์ธํ ์ ์๋ค. ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์, audio์
HTMLMediaElement.currentTime
์ 0์ผ๋ก ์ค์ ํด์ค๋ค. audio ํ์ผ์ ์ฒ์(0์ด)์ผ๋ก ๋์๊ฐ ์ฌ์ํ๋ ๊ฒ์ ์๋ฏธํ๋ค. - ๋ค์์ผ๋ก๋, ๋ฒํผ์ ๋๋ ์ ๋ ์๊ฐ์ ์ธ ํจ๊ณผ๋ฅผ ์ค๋ค.
key.classList.add('playing')
์ ์ด์ฉํด ํค๋ณด๋์ ๋ฒํผ์ ํด๋นํ๋ element์ class์ playing์ ์ถ๊ฐํด์ค๋ค. - ๋ง์ง๋ง์ผ๋ก, ํจ๊ณผ๊ฐ ์ ์ฉ๋ ๋ฒํผ์ ์์ํ๋ก ๋๋๋ ค์ผ ํ๋ค.
transitionend
์ด๋ฒคํธ๋ CSS์ transition์ด ์๋ฃ๋ ์์ ์ ์คํ๋๋๋ฐ, key๋ผ๋ class๋ฅผ ๊ฐ์ง ๋ชจ๋ element์์ playing์ด๋ผ๋ ํด๋์ค๋ฅผ ์ญ์ ํ๋๋ก ํ๋ค.
๐TIL(Today I Learned)
- ๋ฌด์ธ๊ฐ๋ฅผ ๋ง๋ค์ด๋ณด๋๊ฑด ์๊ฐ๋ณด๋ค ํจ์ฌ ์ด๋ ค์ ๋ค.
- ๊ฐ์๋ฅผ ๋ค์ผ๋ฉด์๋ ์ ์ ๋ ๊ฒ ๋๋์ง ๋ชจ๋ฅผ ๋๋ MDN์ ํ์ฉํ๊ฑฐ๋ ๊ตฌ๊ธ๋ง์ ์ ๊ทน ํ์ฉํด์ผํ๋ค.
addEventListener
,querySelector
,classList
,KeyboardEvent
,HTMLMediaElement
JavaScript 30 ํ๋ก์ ํธ ๊ฒฐ๊ณผ๋ฌผ
์ด ๊ธ์
๋ณธ ์ ์์ ํ์ ๊ท์น ํ์ ๋ฐฐํฌํ ์ ์์ต๋๋ค. ์์ธํ ๋ด์ฉ์ Creative Commons ๋ผ์ด์ ์ค๋ฅผ ํ์ธํ์ธ์.
Creative Commons
๋ณธ ์ ์์ ํ์
'Language > JavaScript' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[JS] ๐๏ธJavaScript 30 - Day 5 (0) | 2021.11.18 |
---|---|
[JS] ๐๏ธJavaScript 30 - Day 4 (0) | 2021.11.17 |
[JS] ๐๏ธJavaScript 30 - Day 3 (0) | 2021.11.12 |
[JS] ๐๏ธJavaScript 30 - Day 2 (0) | 2021.11.11 |
[JS] ๐๏ธJavaScript 30 - 30์ผ๊ฐ 30๊ฐ์ ํ๋ก์ ํธ (0) | 2021.11.07 |
๋๊ธ
์ด ๊ธ ๊ณต์ ํ๊ธฐ
-
๊ตฌ๋
ํ๊ธฐ
๊ตฌ๋ ํ๊ธฐ
-
์นด์นด์คํก
์นด์นด์คํก
-
๋ผ์ธ
๋ผ์ธ
-
ํธ์ํฐ
ํธ์ํฐ
-
Facebook
Facebook
-
์นด์นด์ค์คํ ๋ฆฌ
์นด์นด์ค์คํ ๋ฆฌ
-
๋ฐด๋
๋ฐด๋
-
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
-
Pocket
Pocket
-
Evernote
Evernote
๋ค๋ฅธ ๊ธ
-
[JS] ๐๏ธJavaScript 30 - Day 4
[JS] ๐๏ธJavaScript 30 - Day 4
2021.11.17 -
[JS] ๐๏ธJavaScript 30 - Day 3
[JS] ๐๏ธJavaScript 30 - Day 3
2021.11.12 -
[JS] ๐๏ธJavaScript 30 - Day 2
[JS] ๐๏ธJavaScript 30 - Day 2
2021.11.11 -
[JS] ๐๏ธJavaScript 30 - 30์ผ๊ฐ 30๊ฐ์ ํ๋ก์ ํธ
[JS] ๐๏ธJavaScript 30 - 30์ผ๊ฐ 30๊ฐ์ ํ๋ก์ ํธ
2021.11.07
๋๊ธ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.