【JavaScript】ボタンを押した後にアニメーションしてから何かを実行させたい

JavaScript

よくあるナビゲーションでボタンを押すとなんらかのアニメーションをしてからページを移動するみたいな、そんなサンプルを紹介します。

今回のサンプルでは、「ナビ開閉ボタン」を押すとページ移動のナビゲーションがアニメーションで現れ、リンクを選択すると点滅、さらにナビゲーションが閉じてからやっとページ遷移を行います。

動作サンプルページ

実際のサンプルはこちら

HTML

<article id="sample01">
  <h2>サンプル01</h2>

  <button id="sample01-toggle-btn" class="close">ナビ開閉ボタン</button>

  <div id="sample01-toggle">
    <h3>押すと点滅してページ遷移するボタン</h3>
    
    <ol id="button-list">
      <li><a href="http://www.google.co.jp/">サンプルボタン01</a></li>
      <li><a href="http://www.yahoo.co.jp/">サンプルボタン02</a></li>
      <li><a href="http://www.google.co.jp/">サンプルボタン03</a></li>
      <li><a href="http://www.yahoo.co.jp/">サンプルボタン04</a></li>
      <li><a href="http://www.google.co.jp/">サンプルボタン05</a></li>
    </ol>
  </div>
</article>

CSS

#sample01 {
  overflow: hidden;
}

#sample01-toggle {
  width: 50%;
  padding: 10px;
  background: #eeeeee;
  transform: translateX(-100%);
  transition: all .25s ease;
}

#sample01-toggle.open {
  transform: translateX(0);
}

#sample01-toggle.close {
  transform: translateX(-100%);
}

.flashing {
  animation: flashAni .25s ease 0s 3 normal;
}

@keyframes flashAni {
  0% {
    color: red;
  }
  100% {
    color: yellow;
  }
}

JavaScript

/* Back Forward Cache対策 */
window.onpageshow = function(event) {

  // bfcacehが残っている場合、リロードして値をリセット
  if (event.persisted) {
    window.location.reload();
  }
};


// アニメーションするナビのボックスとその開閉ボタンを取得し、変数へ代入
var naviBox = document.getElementById('sample01-toggle');
var toggleBtn = document.getElementById('sample01-toggle-btn');


// ナビ開閉ボタンの処理
toggleBtn.onclick = function() {

  // 押下時のボタンクラスを取得
  var btnClass = this.getAttribute('class');

  // ボタンのクラスで条件分岐させる処理
  // ボタンのクラスが'open'じゃない場合の処理、ボタンリストがスライドイン
  if( btnClass !== 'open' ) {
    this.className = 'open';
    naviBox.className = 'open';
  }

  // ボタンのクラスが'open'だった場合の処理、ボタンリストがスライドアウト
  else {
    this.className = 'close';
    naviBox.className = 'close';
  }
};


// アニメーションする要素を全て取得し、変数へ代入
var btns = document.querySelectorAll('#button-list a');

// 取得した要素(配列)をループ処理でイベントを付与する
for ( i=0; i<btns.length; i++ ) {

  // イベントを付与
  btns[i].onclick = function() {

    // アニメーションさせたい要素へアニメーションするクラスを付与
    this.classList.add('flashing');

    // アニメーションが終了した後の処理('animationend'はCSSアニメーションの場合)
    this.addEventListener('animationend', function() {

      // ボタンのアニメーションが終了したら、'open'クラスを'close'へ戻す
      toggleBtn.className = 'close';
      naviBox.className = 'close';

      // 何かする(今回はページ遷移)
      // ボタンのhref属性の値を取得し、ページ遷移させる
      window.location = this.getAttribute('href');

    }, false);

    // aを押下しても遷移させない
    return false;
  };
}

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*

関連記事