1
0

More than 3 years have passed since last update.

ウェブサイト作成用備忘録・10号:二重発火防止メモ【コピペでプレビュー】

Last updated at Posted at 2021-03-08

突然ですが…

1・ある要素をクリックすると、javascript(jquery)でクリックした要素にClassが追加され、CSSで設定した全体で2秒間のアニメーションが実行される。

2・同じ要素をもう一度クリックすると、最初のアニメーションが逆再生されて元の状態に戻る。(以降ループ…)

というコードを作成したとします。

仮に以下の様な内容の場合

<!doctype html>
<html>
<head>
<meta name="viewport" content="width=device-width,user-scalable=yes,initial-scale=1.0">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
<style>

  body {
    margin: 0;
    width: 100vw;
    height: 100vh;
  }

  #click {
    cursor: pointer;
    background-color: #000;
    transition: all 2s;
  }

  #click.on {
    background-color: #fff;
  }

</style>
</head>
<body id="click" class=""></body>
<script type="text/javascript">

  jQuery(document).ready(function(){

    $("#click").click(function() {
      $("#click").toggleClass("on");
    });

  });
</script>
</html>

上記のコードは画面をクリックする事で、2秒間掛けて背景色が変化するのですが…(コピペで確認可能です)

・javascriptが発火してから処理が完了するまでの時間は長く見積もっても0.05秒
・要素にClassが追加され、CSSアニメーションが完了するまでに2秒

javascriptとCSSの動作は独立している為、javascriptが発火してからアニメーションが完了するまであと1.95秒残っているのに、javascriptの方は次の入力を受け付けてしまう為、ダブルクリックしてしまうとアニメーションが完了する前に次のアニメーションが開始され、現在のアニメーションが中断されてしまいます。

この課題を解決する方法を自分なりに考えた結果…

対策
⇒クリック制限クラスとsetTimeoutと組み合わせる事で、CSSアニメーションが完了するタイミングまでjavascriptの処理を遅延させる

対策前
$("#click").click(function() {←クリックで発火
$("#click").toggleClass("on");←アニメーションクラスの切り替え
});
対策後
<style>
.lock {
  cursor: none;←カーソルの表示を変更
  pointer-events: none;←要素のクリックイベントを無効化
}
</style>
$("#click").click(function() {←クリックで発火
$("#click").addClass("lock");←クリック制限クラスを追加
$("#click").toggleClass("on");←アニメーションクラスの切り替え(CSSアニメーション終了まで2秒)
setTimeout(function(){ 
$("#click").removeClass("lock");
},2000);←CSSアニメーション終了(2秒)後にクリック制限クラスを解除
});

対策版はコチラ ↓

<!doctype html>
<html>
<head>
<meta name="viewport" content="width=device-width,user-scalable=yes,initial-scale=1.0">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
<style>

  body {
    margin: 0;
    width: 100vw;
    height: 100vh;
  }

  #click {
    cursor: pointer;
    background-color: #000;
    transition: all 2s;
  }

  #click.on {
    background-color: #fff;
  }

  .lock {
    cursor: none;
    pointer-events: none;
  }

</style>
</head>
<body id="click" class=""></body>
<script type="text/javascript">

  jQuery(document).ready(function(){

    $("#click").click(function() {
      $("#click").addClass("lock");
      $("#click").toggleClass("on");
      setTimeout(function(){ 
        $("#click").removeClass("lock");
      },2000);
    });

  });

</script>
</html>

最初はif関数で発火条件を指定してみたり、クリック要素そのものを削除したりと色々試行錯誤しましたが、現状ではこの方法が使い勝手が良いと感じました。

あくまで自分用のメモですが、参考になれば幸いです。

1
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0