[javascript30] JavaScript Drum kit



1. JavaScript Drum kit

  • キーボードのA、S、D、Fをクリック...クリックするとイベント
  • がトリガーされます.
  • クリックしてキーボードごとの音声ファイルを再生
  • クリックすると黄色くなる
  • 2.完全なコード


    style.css

    html {
      font-size: 10px;
      background: url('./background.jpg') bottom center;
      background-size: cover;
    }
    
    body,html {
      margin: 0;
      padding: 0;
      font-family: sans-serif;
    }
    
    .keys {
      display: flex;
      flex: 1;
      min-height: 100vh;
      align-items: center;
      justify-content: center;
    }
    
    .key {
      border: .4rem solid black;
      border-radius: .5rem;
      margin: 1rem;
      font-size: 1.5rem;
      padding: 1rem .5rem;
      transition: all .07s ease;
      width: 10rem;
      text-align: center;
      color: white;
      background: rgba(0,0,0,0.4);
      text-shadow: 0 0 .5rem black;
    }
    
    .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: #ffc600;
    }
    

    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>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 playSound(e){
          const audio = document.querySelector(`audio[data-key="${e.keyCode}"]`);
          const key = document.querySelector(`.key[data-key="${e.keyCode}"]`);
          if (!audio) return;
          audio.currentTime = 0;
          audio.play();
          key.classList.add('playing');
        }
        
        function removeTransition(e){
          if(e.propertyName !== 'transform') return;
          this.classList.remove('playing');
        }
        
        const keys = document.querySelectorAll('.key');
        keys.forEach(key => key.addEventListener('transitionend',removeTransition));
    
        window.addEventListener('keydown', playSound);
    
      </script>
    
    
    </body>
    
    </html>

    3.動作手順

  • A, S, D, F.... キーボードを押す

  • window.addEventListener('keydown', playSound);
    keydown 이벤트를 확인 후 playSound 함수를 호출한다.
    3-1. PlaySound()関数で入力した値に基づいて音源ファイルを再生成します.
    3-2. ClassListでplay cssを追加します.
    4.
    const keys = document.querySelectorAll('.key');
    keys.forEach(key => key.addEventListener('transitionend',removeTransition));
    transitionend 이벤트를 확인한 후 removeTransition 함수를 호출한다.
  • classList上.cssの再生を削除します.
  • 4. HTML, CSS


    <audio>ラベル

  • 音声コンテンツを文書に含める
  • <audio data-key="76" src="sounds/tink.wav"></audio>
    |放送
  • srcで定義された音源ファイル
  • <kbd>タグ

  • キーボード入力および音声入力を含む任意のデバイスを使用するユーザ入力を表示する
  • 効果は明らかではなく、ブラウザに固定フォントで表示
  •     <div data-key="76" class="key">
          <kbd>L</kbd>
          <span class="sound">tink</span>
        </div>

    .css内#,。

  • #:id値をセレクタとして指定します.
  • .:class値を選択子として指定します.
  • 選択者:HTMLタグにユニークな識別番号を指定し、カスタマイズされた設計効果を提供します.
  • 5. JAVASCRIPT


    Document.querySelector()

  • 提供された選択プログラムまたは選択プログラムセットに一致するドキュメントの最初のElement
  • を返します.
  • 一致する要素がない場合はnull
  • を返します.
  • getElementByID()より高速
  • querySelector()は、より詳細なインポートを提供します.
  • <audio data-key="68" src="sounds/kick.wav"></audio>
    const audio = document.querySelector(`audio[data-key="${e.keyCode}"]`);
    =>audioラベルのdata-key値は入力値と同じです.

    Document.querySelectorAll()

  • 提供された選択者または選択者の組合せに一致する文書
  • を返す
    const keys = document.querySelectorAll('.key');
    =>リスト形式で戻る

    audio.play()

  • video、audioオブジェクト再生時に使用
  • audio.play();
  • .Play():再生音源
  • .load():ムービーを読み込み
  • .一時停止():一時停止
  • key.classList

  • 読取り専用Property
  • は、Ellientクラス属性の集合としてアクティブなDOMTokenListを返します.
    key.classList.add('playing');
    =>classListにplayというクラス値を追加
    =>>新しいプレイクラスが追加され、cssが有効になります.
    .playing {
      transform: scale(1.1);
      border-color: #ffc600;
      box-shadow: 0 0 1rem #ffc600;
    }

    transitionend

  • CSSの移行効果完了時に発生します.
  • const keys = document.querySelectorAll('.key');
        keys.forEach(key => key.addEventListener('transitionend',removeTransition));
    =>cssアプリケーションが完了すると発生し、変換が発生するとremoveTransition関数を呼び出してcssを再削除します.