作成: 2019年03月10日
更新: 2021年03月29日
anime.jsを使ってアニメーションを表示させるとtranslateやrotateの値が変化したままでそのあと続けてアニメーションを表示させるとおかしな挙動になる。そこでcallback関数を用いて以下のようにアニメーション終了後に値を戻せばその後のアニメーションも正しい挙動になる。
var target = document.getElementById("target");
anime({
targets: target,
translateX: 100,
duration: 200,
complete: function(anim){ //callback関数
anime.set(target, {
translateX:0
});
}
});
しかし、forループやwhileループで以下のようにすると想定通りには動かない。
for(target of targets){
anime({
targets: target,
translateX: 100,
duration: 200,
complete: function(anim){
anime.set(target, {
translateX:0
})
}
});
}
これはcallback関数がforループの終了後に行われていてtargetsリストの一番最後の要素だけにしかcallback関数が適用されないからである。
そこで以下のようanimeオブジェクトからtargetを直接とるとうまくいく。
for(target of targets){
anime({
targets: target,
translateX: 100,
duration: 200,
complete: function(anim){
anime.set(anim.animatables[0].target, {
translateX:0
})
}
});
}
callback関数は第一引数にanimeオブジェクトをとれるので使用し(thisでも可能)anim.animatables[0].targetでアニメーションオブジェクトからtargetをとってこれる。
anime.jsのanimeオブジェクトはtarget以外にも終了時のイベントやアニメーション進行度合いなどさまざまな要素を含んでいるのでうまく利用するとアニメーションを工夫できる。