transitionやanimationを使ったアニメーションで、開始時や終了時をJavaScriptで取得する方法を試してみます。
サンプルコード
ボタンクリック時にtransitionやanimationでアニメーションする要素を用意して、各イベントを試してみます。
まずはtransitionです。
<button id="button">アニメーション実行</button> <div id="sample" class="sample"></div>
要素に.is-moveが追加された時に、transitionでアニメーションするようにします。
.sample { width: 50px; height: 50px; background: red; transition: transform 3s linear 500ms; } .sample.is-move { transform: translateX(200px); }
ボタンクリック時に.is-moveを追加・削除するように設定します。
const button = document.getElementById('button'); const element = document.getElementById('sample'); button.addEventListener('click', function() { element.classList.toggle('is-move'); }, false); element.addEventListener('transitionrun', function() { console.log('transitionrun'); }, false); element.addEventListener('transitionstart', function() { console.log('transitionstart'); }, false); element.addEventListener('transitionend', function() { console.log('transitionend'); }, false); element.addEventListener('transitioncancel', function() { console.log('transitioncancel'); }, false);
transitionのデモページ
6〜17行目がtransiton中の状態に応じて発火するイベントで、それぞれ以下の内容になります。
transitionrun | アニメーションの開始時で、transition-delayの始まる前に発火。 |
---|---|
transitionstart | アニメーションの開始時で、transition-delayの終了後に発火。 |
transitionend | アニメーション終了時に発火。アニメーションが途中でキャンセルされた場合は発火しない。 |
transitioncancel | アニメーションがキャンセルされた時に発火。 |
上記のうちtransitionrunとtransitionstart、transitioncancelに関しては実験的な機能となっているようなので、使用する際はご注意ください。
次にanimationを試してみます。
animationは繰り返す回数が1回とループの2種類を用意します。
<button id="button">アニメーション実行(1回)</button> <div id="sample" class="sample"></div> <button id="button2">アニメーション実行(ループ)</button> <div id="sample2" class="sample2"></div>
transitionと同じく、要素に.is-moveが追加された時にアニメーションするようにします。
.sample, .sample2 { width: 50px; height: 50px; background: red; } .sample.is-move { animation: sample 3s linear 500ms; } .sample2.is-move { animation: sample 3s linear 500ms infinite alternate; } @keyframes sample { 0% { transform: translateX(0); } 100% { transform: translateX(200px); } }
ボタンクリック時に.is-moveを追加・削除するように設定します。
const button = document.getElementById('button'); const element = document.getElementById('sample'); button.addEventListener('click', function() { element.classList.toggle('is-move'); }, false); element.addEventListener('animationstart', function() { console.log('animationstart'); }, false); element.addEventListener('animationend', function() { console.log('animationend'); }, false); element.addEventListener('animationiteration', function() { console.log('animationiteration'); }, false); element.addEventListener('animationcancel', function() { console.log('animationcancel'); }, false); const button2 = document.getElementById('button2'); const element2 = document.getElementById('sample2'); button2.addEventListener('click', function() { element2.classList.toggle('is-move'); }, false); element2.addEventListener('animationstart', function() { console.log('animationstart'); }, false); element2.addEventListener('animationend', function() { console.log('animationend'); }, false); element2.addEventListener('animationiteration', function() { console.log('animationiteration'); }, false); element2.addEventListener('animationcancel', function() { console.log('animationcancel'); }, false);
animationのデモページ
6〜17、24〜35行目が状態に応じて発火するイベントで、それぞれ以下の内容になります。
animationstart | アニメーションの開始時で、animation-delayの終了後に発火。 |
---|---|
animationend | アニメーション終了時に発火。アニメーションが途中でキャンセルされた場合は発火しない。 |
animationiteration | アニメーションの反復が終了し、次の回開始時に発火。animationendと同時には発火しない。 |
animationcancel | アニメーションがキャンセルされた時に発火。 |
上記のうちanimationcancelだけ実験的な機能となっています。
コメントが承認されるまで時間がかかります。