<div data-key="65" class="key">
<kbd>A</kbd>
<span class="sound">clap</span>
</div>
<!-- data-key="65"는 data-key라는 attribute를 임의로 추가한 것으로 생각하면 됨 -->
<audio data-key="65" src="clap.wav"></audio>
<!-- data-something으로 정의해서 사용 가능(user-defined)-->
.keys{
flex : 1; /* flex-grow : 1과 같은 의미. 즉 다 같은 크기로 늘린다. */
min-height: 100vh; /* 100vh는 브라우저의 높이를 다 사용하겠다는 것.
즉, 브라우저의 크기에 상관없이 class keys가 height를 다 사용
하게 해서 안쓰면 align-item : center해도 parent의 size
때문에 제일 위로 붙음 */
transition: all 0.07s ease; /* 순서대로 property, duration, timing , (delay)으로
모든 속성, 시전 시간, 천천히 적용을 의미 */
transform: scale(1.1); /* 크기 1.1배 */
text-transform: uppercase; /* 대문자로 변환 */
}
div {
transition: <property> <duration> <timing-function> <delay>;
/* 이렇게 단축 문법 사용 */
}
function playAudio(event) {
const key = event.key;
const audio = document.querySelector(`audio[data-key="${key}"]`);
const kbd = document.querySelector(`div[data-key=${key}]`);
if (!audio) return;
audio.currentTime = 0;
audio.play();
kbd.classList.add("playing");
}
function removeTransition(event) {
if (event.propertyName !== "transform") return;
const kbd = event.target;
kbd.classList.remove("playing");
}
const key = document.querySelector(".keys");
key.addEventListener("transitionend", removeTransition);
window.addEventListener("keydown", playAudio);
transition: property duration timing-function delay
이런식으로 씀(CSS code 부분 참조)HTMLElement.dataset 읽기 전용 속성은 요소의 사용자 지정 데이터 특성(data-*)에 대한 읽기와 쓰기 접근 방법을 HTML과 DOM 양측에 제공합니다.
html에서 data-* 란 class를 여러개 정의할 수 있다. javascript에서 queryseletor로 tag를 가져온 후, dataset으로 접근할 수 있다.
const exmaple = document.querySelector('.example');
if(exmple.dataset.age === 13)
//... to do
출처 : https://developer.mozilla.org/ko/docs/Web/API/HTMLElement/dataset
정답 코드에서는 keys.forEach문을 사용해서 모든 key에 대해 event를 달아 주었다.
keys.forEach(key => key.addEventListener('transitionend', removeTransition));
eventListener가 많아지면 성능에 악영향을 끼칠 것 같아, 이벤트 위임을 통해 그냥 keys에만 달아서 event.target의 'playing' class를 제거하는 방식으로 진행했다.
event.keykode 대신 event.key를 받아와서 사용했다.