JavaScript Drum kit
程序员文章站
2022-04-16 21:33:05
用 JavaScript 实现网页鼓乐器,相关的初始代码在 JavaScript30 官网和 GitHub 上已经存在。我把 sound 文件夹下的音频全部替换掉了,一些相关解释也直接在注释中标明。 下面是最终成品地址,可能有些卡顿,音频加载也比较慢: 结果展示 index.html:
用 javascript 实现网页鼓乐器,相关的初始代码在 javascript30 官网和 github 上已经存在。我把 sound 文件夹下的音频全部替换掉了,一些相关解释也直接在注释中标明。
下面是最终成品地址,可能有些卡顿,音频加载也比较慢:
index.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> 标签定义键盘文本--> <kbd>a</kbd> <span class="sound">clock</span> </div> <div data-key="83" class="key"> <kbd>s</kbd> <span class="sound">pin</span> </div> <div data-key="68" class="key"> <kbd>d</kbd> <span class="sound">gong</span> </div> <div data-key="70" class="key"> <kbd>f</kbd> <span class="sound">ding-dong</span> </div> <div data-key="71" class="key"> <kbd>g</kbd> <span class="sound">pulse</span> </div> <div data-key="72" class="key"> <kbd>h</kbd> <span class="sound">robot</span> </div> <div data-key="74" class="key"> <kbd>j</kbd> <span class="sound">wooden fish</span> </div> <div data-key="75" class="key"> <kbd>k</kbd> <span class="sound">toaster</span> </div> <div data-key="76" class="key"> <kbd>l</kbd> <span class="sound">bell</span> </div> </div> <audio data-key="65" src="sound/clock.mp3"></audio> <audio data-key="83" src="sound/pin.mp3"></audio> <audio data-key="68" src="sound/gong.mp3"></audio> <audio data-key="70" src="sound/ding-dong.mp3"></audio> <audio data-key="71" src="sound/pulse.mp3"></audio> <audio data-key="72" src="sound/robot.mp3"></audio> <audio data-key="74" src="sound/wooden fish.mp3"></audio> <audio data-key="75" src="sound/toaster.mp3"></audio> <audio data-key="76" src="sound/bell.mp3"></audio> <script> function removetransition(e) { if (e.propertyname !== 'transform') return; e.target.classlist.remove('playing'); } function playsound(e) { const audio = document.queryselector(`audio[data-key="${e.keycode}"]`); const key = document.queryselector(`div[data-key="${e.keycode}"]`); if (!audio) return; key.classlist.add('playing'); audio.currenttime = 0; audio.play(); } const keys = array.from(document.queryselectorall('.key')); keys.foreach(key => key.addeventlistener('transitionend', removetransition)); window.addeventlistener('keydown', playsound); /* 1. foreach() 方法用于调用数组的每个元素,并将元素传递给回调数。 语法:array.foreach(function(currentvalue, index, arr),thisvalue) 2. addeventlistener() 方法用于向指定元素添加事件句柄。 element.addeventlistener(event, function, usecapture) transitionend:该事件在 css 完成过渡后触发。 3. 箭头函数 x => x * x 上面的箭头函数相当于: function (x) { return x * x; } */ </script> </body> </html>
style.css:
html { font-size: 10px; background: white bottom center; } body, html { margin: 0; padding: 0; font-family: sans-serif; } .keys { display: flex; flex: 1; /*让所有弹性盒模型对象的子元素都有相同的长度,且忽略它们内部的内容*/ min-height: 100vh; /*align-items 属性定义flex子项在flex容器的当前行的侧轴(纵轴)方向上的对齐方式*/ align-items: center; justify-content: center; /*元素在页面主轴上的排列,此处居中*/ } .key { border: 4px solid black; border-radius: .5rem; margin: 1rem; font-size: 1.5rem; padding: 1rem .5rem; transition: all .07s ease; /* 语法 transition: property duration timing-function delay; transition-property 规定设置过渡效果的 css 属性的名称。 transition-duration 规定完成过渡效果需要多少秒或毫秒。 transition-timing-function 规定速度效果的速度曲线。 transition-delay 定义过渡效果何时开始。 */ width: 10rem; text-align: center; color: white; background: rgba(0, 0, 0, 0.5); text-shadow: 0 0 .5rem black; /*语法 text-shadow: h-shadow v-shadow blur color; */ } .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: .1rem; color: greenyellow; }