用 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;
}

参考:
JavaScript Drum Kit 中文指南

JavaScript Drum kit的更多相关文章

  1. js & 快捷键

    js & 快捷键 demo js-keyboard-shortcuts.html https://codepen.io/webgeeker/pen/MLYrNq let isCtrl = fa ...

  2. JavaScript 30 - 1 学习笔记

    学习JavaScirpt30的笔记! ...虽然英语不是很好,但是跟着来还是学到了一些东西. 1------->   JavaScirpt Drum Kit 功能是这样的 ,敲击键盘上面的按钮, ...

  3. javascript30--day01--Drum kit

    相关视频链接:https://www.bilibili.com/video/av8481988/?p=3 Drum kit 做题思路(1)监听键盘事件 addEventListener(‘事件名’,执 ...

  4. [转载]50个Demo展示HTML5无穷的魅力

    Flash和HTML5的比较已经成为现在最热门的主题之一,我们不去争论哪个好哪个不好.和HTML5在很酷的动画和简单的游戏等方面一样,除非HTML5在未来几年有一些重大发展,否则Flash在富内容网页 ...

  5. JavaScript资源大全中文版(Awesome最新版)

    Awesome系列的JavaScript资源整理.awesome-javascript是sorrycc发起维护的 JS 资源列表,内容包括:包管理器.加载器.测试框架.运行器.QA.MVC框架和库.模 ...

  6. 免费素材:包含 250+ 组件的 DO UI Kit

    DO UI kit 现在可以免费用于 Photoshop 和 Sketch 了.它有超过130个屏幕,10个完整的主题以及250+的组件混合以创造惊人的应用.他们都是再混合和视网膜.最重要的是他们看起 ...

  7. EventRay UI Kit – Web & Mobile 的素材

    EventRay UI 工具包是一个免费的,可以现成使用的界面套件.包括多个为  Web 和移动应用设计的布局和 UI 元素.所有你需要做的就是下载这个 UI 工具包,点击源码下载打开的页面即可下载. ...

  8. HTML5 Audio and JavaScript Control

    IE8 以下无效 <!DOCTYPE html> <html> <head> <meta content="text/html; charset=u ...

  9. 你应该知道的JavaScript中NaN的秘密

    NaN,不是一个数字,是一种特殊的值来代表不可表示的值,使用typeof或其他任何与之比较的处理方式,‘NaN’则会引起一些混乱, 一些操作会导致NaN值的产生.这里有些例子: Math.sqrt(- ...

随机推荐

  1. (十八)JDBC优化使用(一)

    一.将增删改方法合并,优化代码 第十七篇的UserPOImpl.java类代码可以进行优化,因为增删改方法用的都是同一种执行方法executeUpdate(),对十七篇的例子进行优化如下: 2.1 搭 ...

  2. JS时间转换,url编码,jquery返回类型等问题

    1.当时间被转换为json格式后会被转换成 /Date(...)/ 这种格式,其中...为时间转换成妙后的一串整数 function changeDateFormat(cellval) { )); v ...

  3. 树莓派连接显示器后设置ssh服务开机自动开启

    进入命令行,然后执行: cd /boot sudo touch ssh sudo restart -r now 然后就重新启动了,重启好了会有依据提示. 然后可以输入ssh localhost进行一下 ...

  4. c# 结构体struct注意事项

    c# 结构struct注意事项 1,不能定义无参构造函数,因为隐式的默认无参构造函数不能被重写 2,当为某个结构编写带有参数的构造函数时,必须显式初始化所有成员,否则编译不过. 3,不允许在结构的实例 ...

  5. 如何调试Maven软件的源代码

    和调试maven插件方法一样 修改maven源代码 打包模块apache-maven,生成apache-maven-x.x.x-bin.tar.gz 解压上面的压缩包,生成目录apache-maven ...

  6. java的mock工具:mockito

    https://site.mockito.org https://github.com/mockito/mockito https://github.com/hehonghui/mockito-doc ...

  7. 使用python或robotframework调multipart/form-data接口上传文件

    这几天调一个multipart/form-data类型的接口,遇到点小阻碍.之前同事有使用urllib库写了个类似的方法实现,比较长,想要改的时候发现不太好使.在网上查找发现用requests库做这个 ...

  8. Linear regression with one variable - Cost function

    摘要: 本文是吴恩达 (Andrew Ng)老师<机器学习>课程,第二章<单变量线性回归>中第7课时<代价函数>的视频原文字幕.为本人在视频学习过程中逐字逐句记录下 ...

  9. nginx.conf文件配置明细详解

    #etnx运行的用户和用户组 user nginx nginx; #工作进程数,建议设置为CPU的总核数 worker_processes ; #全局错误日志定义类型,日志等级从低到高依次为: #de ...

  10. linux下使用Vsftpd服务传输文件

    FTP协议占用两个端口号: 21端口:命令控制,用于接收客户端执行的FTP命令. 20端口:数据传输,用于上传,下载文件数据. 过程: 首先安装vsftpd服务程序使用命令 yum install v ...