jQueryでCSSアニメーション終了時の処理を作る方法
CSSアニメーションは手軽に高度なアニメーションを実装できますが、JavaScriptなどと違ってコールバック関数を設定することができません。
1つ目のアニメーション終了後に、2つ目のアニメーションを動かしたい・・・という場合に困ってしまいます。
その問題を解決するために役立つのが、jQueryの「animationend」イベントです。今回は、CSSのアニメーション終了時の処理をjQueryで作る方法を解説していきます。
【イベント】animationend
CSSのアニメーション終了を検知する際には、”animationend”というイベントがキーになります。
animationendイベントは、CSSアニメーションに限らず、対象となる要素で何かしらのアニメーションが終了した場合に発生するイベントです。
CSSアニメーション場合、animationプロパティを用いて実装されたアニメーション(keyframesアニメーション等)が完全に終了した場合に実行されます。
animationendイベントを使用するメリット
animationendイベントをわざわざ使わなくても、関数setTimeout( )を使用すれば疑似的にアニメーション後に処理を実行できます。
ただ、CSS側でアニメーションの所要時間を変更する度に、setTimeoutの数値も変更する必要があるため、開発の所要時間が大幅に伸びるかもしれません。
animationendはアニメーションの所要時間に関わらず、とりあえずCSSアニメーションが終わった際に発火するイベントですから、CSS側で実行時間を自由に変更できるのがメリットです。
jQueryでanimationendを使う
jQueryでanimationendを使うためには、イベントリスナーを設置すればOKです。
基本的には、以下のようなコードで実装できます。clickやmousemoveなどのイベントと実装方法はほぼ同じです。
$(document).on("animationend", 対象となる要素, function(){
// 実行したい処理
});
ただ、多少異なる点があるので、それについては後述します。
では、実際にjQueryでanimationendイベントを利用し、アニメーション終了後の処理を作っていきましょう。
サンプルプログラム
<head>
<link rel="stylesheet" href="./style.css">
</head>
<body>
<div id="sample-container">
<!-- 動く箱 -->
<div class="box"></div>
</div>
<!-- アニメーション終了後にテキストを表示する -->
<div class="text"></div>
<!-- javascript -->
<!-- あとで実装するもの -->
<script src="./sample.js"></script>
</body>
/* style.css */
@keyframes moveBox{
from{
left: 0%;
}
to{
left: calc(100% - 100px);
}
}
#sample-container{
width: 80vw;
height: 200px;
position: relative;
background: pink;
}
.box{
width: 100px;
height: 100px;
background: red;
position: absolute;
top: 50%;
transform: translateY(-50%);
animation: moveBox 3000ms linear forwards;
}
.text{
font-size: 20px;
}
上記コードを実装すると、以下のようなアニメーションが流れます。

イベントを設置
では、次にjQueryのイベント処理を書いていきます。
実装する処理は皆さんの自由ですが、ここでは簡単にアニメーションが終了した後、文字列を画面上に表示させるプログラムにしましょう。
前述したひな形にならって、以下のようなコードをJavaScriptファイルに入力してください。
/* sample.js */
$(()=>{
// イベント設置
$(document).on("animationend", ".box", function(){
// class「text」の要素にテキストを表示
$(".text").text("アニメーション終了");
});
});
もちろん、HTMLのscriptタグに直接書き込んでも良いです。
ここまでのコードをしっかり実装できていれば、画像のようにアニメーションが終了した後に「アニメーション終了」という文字が表示されるはず。

その他の実装方法
animationendはjQuery専用のイベントリスナーではないので、もちろん、通常のJavaScriptの記法でも問題なく実装可能です。
// イベント設置
let target = document.getElementsByClassName("box");
target[0].addEventListener("animationend", function(){
$(".text").text("javascriptで実装");
});

ただ、目に見えてコード量が増えるので、管理人は基本的にjQueryで実装しています。
clickイベントと同様に動くわけではない
jQueryを使っている方であれば、以下のようなコードでイベントリスナーを設置することも多いですよね。
$(要素名).click(function(){
// 実行したい処理
});
簡潔にコードが書けて便利なのですが、animationendで同じようにイベントリスナーを設置しようとしても、エラーを吐いてしまいます。
$(".box").animationend(function(){
// class「text」の要素にテキストを表示
$(".text").text("animationendのイベントリスナーです。");
});
【実行結果】

必ず、onメソッドを用いてイベントリスナーを設置しましょう。
まとめ
CSSとJavaScriptは切っても切れない関係にあり、CSSアニメーションとJavaScriptの処理を連携させたいとなる場面が多いです。
より完全性の高いプログラムを構築するためにも、jQueryでanimationendイベントを上手に使い、CSSアニメーションをさらに便利に活用していきましょう。