HTML Piano

HTML
<body> <section id="wrap"> <section id="main"> <div class="nowplaying"></div> <div class="keys"> <div data-key="0" class="key" data-note="A"> <span class="hints">A</span> </div> <div data-key="87" class="key sharp" data-note="C#"> <span class="hints">W</span> </div> <div data-key="83" class="key" data-note="D"> <span class="hints">S</span> </div> <div data-key="82" class="key sharp" data-note="D#"> <span class="hints">R</span> </div> <div data-key="68" class="key" data-note="C"> <span class="hints">D</span> </div> <div data-key="70" class="key" data-note="F"> <span class="hints">F</span> </div> <div data-key="84" class="key sharp" data-note="F#"> <span class="hints">T</span> </div> <div data-key="71" class="key" data-note="G"> <span class="hints">G</span> </div> <div data-key="72" class="key" data-note="A"> <span class="hints">H</span> </div> <div data-key="85" class="key sharp" data-note="A#"> <span class="hints">U</span> </div> <div data-key="74" class="key" data-note="B"> <span class="hints">J</span> </div> <div data-key="75" class="key" data-note="C"> <span class="hints">K</span> </div> <div data-key="79" class="key sharp" data-note="C#"> <span class="hints">O</span> </div> <div data-key="76" class="key" data-note="D"> <span class="hints">L</span> </div> <div data-key="73" class="key sharp" data-note="D#"> <span class="hints">I</span> </div> <div data-key="186" class="key" data-note="E"> <span class="hints">;</span> </div> </div> <audio data-key="65" src="http://carolinegabriel.com/demo/js-keyboard/sounds/040.wav"></audio> <audio data-key="87" src="http://carolinegabriel.com/demo/js-keyboard/sounds/040.wav"></audio> <audio data-key="69" src="http://carolinegabriel.com/demo/js-keyboard/sounds/039.wav"></audio> <audio data-key="68" src="http://carolinegabriel.com/demo/js-keyboard/sounds/040.wav"></audio> <audio data-key="82" src="http://carolinegabriel.com/demo/js-keyboard/sounds/041.wav"></audio> <audio data-key="70" src="http://carolinegabriel.com/demo/js-keyboard/sounds/042.wav"></audio> <audio data-key="84" src="http://carolinegabriel.com/demo/js-keyboard/sounds/043.wav"></audio> <audio data-key="71" src="http://carolinegabriel.com/demo/js-keyboard/sounds/044.wav"></audio> <audio data-key="72" src="http://carolinegabriel.com/demo/js-keyboard/sounds/045.wav"></audio> <audio data-key="85" src="http://carolinegabriel.com/demo/js-keyboard/sounds/046.wav"></audio> <audio data-key="74" src="http://carolinegabriel.com/demo/js-keyboard/sounds/047.wav"></audio> <audio data-key="73" src="http://carolinegabriel.com/demo/js-keyboard/sounds/048.wav"></audio> <audio data-key="75" src="http://carolinegabriel.com/demo/js-keyboard/sounds/049.wav"></audio> <audio data-key="79" src="http://carolinegabriel.com/demo/js-keyboard/sounds/050.wav"></audio> <audio data-key="76" src="http://carolinegabriel.com/demo/js-keyboard/sounds/051.wav"></audio> <audio data-key="80" src="http://carolinegabriel.com/demo/js-keyboard/sounds/052.wav"></audio> <audio data-key="186" src="http://carolinegabriel.com/demo/js-keyboard/sounds/052.wav"></audio> </section> </section> <video playsinline autoplay muted loop id="bgvid" poster="http://carolinegabriel.com/demo/js-keyboard/video/bg.jpg"> <source src="http://carolinegabriel.com/demo/js-keyboard/video/bg.mp4" type="video/mp4"> </video> </body>
CSS
html { background: #000; font-family: 'Noto Serif', serif; -webkit-font-smoothing: antialiased; text-align: center; } video#bgvid { position: fixed; top: 50%; left: 50%; min-width: 100%; min-height: 100%; width: auto; height: auto; z-index: -100; transform: translateX(-50%) translateY(-50%); background-size: cover; } } h1 { color: #fff; font-size: 50px; font-weight: 400; letter-spacing: 0.18em; text-transform: uppercase; margin: 0; } h2 { color: #fff; font-size: 24px; font-style: italic; font-weight: 400; margin: 0 0 30px; } .keys { display: block; width: 100%; height: 350px; max-width: 880px; position: relative; margin: 0px auto 0; cursor: none; } .key { position: relative; border: 4px solid black; border-radius: .5rem; transition: all .07s ease; display: block; box-sizing: border-box; z-index: 2; } .key:not(.sharp) { float: left; width: 10%; height: 100%; background: rgba(255, 255, 255, .8); } .key.sharp { position: absolute; width: 6%; height: 60%; background: #000; color: #eee; top: 0; z-index: 3; } .key[data-key="87"] { left: 7%; } .key[data-key="82"] { left: 27%; } .key[data-key="84"] { left: 37%; } .key[data-key="89"] { left: 100%;a } .key[data-key="85"] { left: 57%; } .key[data-key="79"] { left: 77%; } .key[data-key="73"] { left: 67%; } .playing { transform: scale(.95); border-color: #028ae9; box-shadow: 0 0 1rem #028ae9; } .hints { display: block; width: 100%; opacity: 0; position: absolute; bottom: 7px; transition: opacity .3s ease-out; font-size: 20px; } .keys:hover .hints { opacity: 1; }
JAVASCRIPT
const keys = document.querySelectorAll(".key"), note = document.querySelector(".nowplaying"), hints = document.querySelectorAll(".hints"); function playNote(e) { const audio = document.querySelector(`audio[data-key="${e.keyCode}"]`), key = document.querySelector(`.key[data-key="${e.keyCode}"]`); if (!key) return; const keyNote = key.getAttribute("data-note"); key.classList.add("playing"); note.innerHTML = keyNote; audio.currentTime = 0; audio.play(); } window.addEventListener("keydown", function(event) { if (event.key == key){ // Do Stuff } }); function removeTransition(e) { if (e.propertyName !== "transform") return; this.classList.remove("playing"); } function hintsOn(e, index) { e.setAttribute("style", "transition-delay:" + index * 50 + "ms"); } hints.forEach(hintsOn); keys.forEach(key => key.addEventListener("transitionend", removeTransition)); window.addEventListener("keydown", playNote);
Expand for more options Login