首页 > 编程 > JavaScript > 正文

JavaScript Drum Kit 指南(纯 JS 模拟敲鼓效果)

2019-11-19 16:00:42
字体:
来源:转载
供稿:网友

核心代码:

<script> function removeTransition(event) {  if (event.propertyName !== 'transform') return; // 过滤其中一种事件  event.target.classList.remove('playing'); // 移除高亮的样式 } function playSound(event) {  const audio = document.querySelector(`audio[data-key="${event.keyCode}"]`); // 根据触发按键的键码,获取对应音频  const key = document.querySelector(`div[data-key="${event.keyCode}"]`); // 获取页面对应按钮 DIV 元素  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)); // 添加 transition 事件监听 window.addEventListener('keydown', playSound);</script>

中文版本完整代码:

<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>JS Drum Kit</title> <link rel="stylesheet" href="style.css" rel="external nofollow" rel="external nofollow" ></head><body> <div class="keys">  <div data-key="65" class="key">   <kbd>A</kbd>   <span class="sound">clap</span>  </div>  <div data-key="83" class="key">   <kbd>S</kbd>   <span class="sound">hihat</span>  </div>  <div data-key="68" class="key">   <kbd>D</kbd>   <span class="sound">kick</span>  </div>  <div data-key="70" class="key">   <kbd>F</kbd>   <span class="sound">openhat</span>  </div>  <div data-key="71" class="key">   <kbd>G</kbd>   <span class="sound">boom</span>  </div>  <div data-key="72" class="key">   <kbd>H</kbd>   <span class="sound">ride</span>  </div>  <div data-key="74" class="key">   <kbd>J</kbd>   <span class="sound">snare</span>  </div>  <div data-key="75" class="key">   <kbd>K</kbd>   <span class="sound">tom</span>  </div>  <div data-key="76" class="key">   <kbd>L</kbd>   <span class="sound">tink</span>  </div> </div> <audio data-key="65" src="sounds/clap.wav"></audio> <audio data-key="83" src="sounds/hihat.wav"></audio> <audio data-key="68" src="sounds/kick.wav"></audio> <audio data-key="70" src="sounds/openhat.wav"></audio> <audio data-key="71" src="sounds/boom.wav"></audio> <audio data-key="72" src="sounds/ride.wav"></audio> <audio data-key="74" src="sounds/snare.wav"></audio> <audio data-key="75" src="sounds/tom.wav"></audio> <audio data-key="76" src="sounds/tink.wav"></audio><script> function removeTransition(event) {  if (event.propertyName !== 'transform') return; // 过滤其中一种事件  event.target.classList.remove('playing'); // 移除高亮的样式 } function playSound(event) {  const audio = document.querySelector(`audio[data-key="${event.keyCode}"]`); // 根据触发按键的键码,获取对应音频  const key = document.querySelector(`div[data-key="${event.keyCode}"]`); // 获取页面对应按钮 DIV 元素  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)); // 添加 transition 事件监听 window.addEventListener('keydown', playSound);</script></body></html>

英文版本完整代码:

<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>JS Drum Kit</title> <link rel="stylesheet" href="style.css" rel="external nofollow" rel="external nofollow" ></head><body> <div class="keys">  <div data-key="65" class="key">   <kbd>A</kbd>   <span class="sound">clap</span>  </div>  <div data-key="83" class="key">   <kbd>S</kbd>   <span class="sound">hihat</span>  </div>  <div data-key="68" class="key">   <kbd>D</kbd>   <span class="sound">kick</span>  </div>  <div data-key="70" class="key">   <kbd>F</kbd>   <span class="sound">openhat</span>  </div>  <div data-key="71" class="key">   <kbd>G</kbd>   <span class="sound">boom</span>  </div>  <div data-key="72" class="key">   <kbd>H</kbd>   <span class="sound">ride</span>  </div>  <div data-key="74" class="key">   <kbd>J</kbd>   <span class="sound">snare</span>  </div>  <div data-key="75" class="key">   <kbd>K</kbd>   <span class="sound">tom</span>  </div>  <div data-key="76" class="key">   <kbd>L</kbd>   <span class="sound">tink</span>  </div> </div> <audio data-key="65" src="sounds/clap.wav"></audio> <audio data-key="83" src="sounds/hihat.wav"></audio> <audio data-key="68" src="sounds/kick.wav"></audio> <audio data-key="70" src="sounds/openhat.wav"></audio> <audio data-key="71" src="sounds/boom.wav"></audio> <audio data-key="72" src="sounds/ride.wav"></audio> <audio data-key="74" src="sounds/snare.wav"></audio> <audio data-key="75" src="sounds/tom.wav"></audio> <audio data-key="76" src="sounds/tink.wav"></audio> <script>  /** GOAL: When a user opens this page and presses a key that corresponds with   * one of our div elements, we should play the audio clip associated with   * the keypress, add a class to the specific element that matches with the keypress,   * and then remove that class in order to reset the element to it's original state.   */  (()=> {   const playSound = (e) => {    const soundclip = document.querySelector(`audio[data-key="${e.keyCode}"]`);    const keyelement = document.querySelector(`.key[data-key="${e.keyCode}"]`);    if (!soundclip) return undefined; // Stop function from running if key pressed doesn't match up with our elements    keyelement.classList.add('playing');    // Ensures that the sound clip always plays from the beginning. Otherwise,    // if the 'a' key is pressed twice rapidly, the soundclip will only play through    // once.    soundclip.currentTime = 0;    soundclip.play(); // Play sound   }   const removeTransition = (e) => {    // skip if it's not a transform event    if (e.propertyName !== 'transform') return undefined;    e.target.classList.remove('playing');   }   // Find all elements in the document with a class 'key'   const keys = document.querySelectorAll('.key');   // Listen for any `keydown` events that occur on this browser window instance (this page)   // When a `keydown` event is observered, trigger the `playSound` function, passing in the   // `keydown` event as the argument (e)   window.addEventListener('keydown', playSound);   keys.forEach(key =>    key.addEventListener(     'transitionend',     (e) => removeTransition.call(key, e)    ));  })(); </script></body></html>

在线演示地址:http://demo.VeVB.COm/js/2017/JavaScript30/JavaScriptDrumKit/index-FINISHED.html

请在chrome浏览器下查看效果。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表