次のスニペットを実行してから、ボックスをクリックしてください。
const box = document.querySelector('.box')
box.addEventListener('click', e => {
if (!box.style.transform) {
box.style.transform = 'translateX(100px)'
new Promise(resolve => {
setTimeout(() => {
box.style.transition = 'none'
box.style.transform = ''
resolve('Transition complete')
}, 2000)
}).then(() => {
box.style.transition = ''
})
}
})
.box {
width: 100px;
height: 100px;
border-radius: 5px;
background-color: #121212;
transition: all 2s ease;
}
<div class = "box"></div>
私が起こりそうなこと:
- クリックが発生
- ボックスは100pxだけ水平方向に平行移動を開始します(このアクションには2秒かかります)
- クリックすると、新しい
Promise
ものも作成されます。内部ではPromise
、setTimeout
関数は2秒に設定されています - アクションが完了した(2秒が経過した)後、
setTimeout
そのコールバック関数を実行し、transition
noneに設定します。その後、setTimeout
もtransform
元の値に戻り、ボックスを元の場所に表示するようにレンダリングします。 - ボックスは元の場所に表示され、ここでは遷移効果の問題はありません
- これらすべてが完了し
transition
たら、ボックスの値を元の値に戻します
ただし、transition
ご覧のようにnone
、実行時には値が表示されないようです。上記を実現する他の方法、たとえばキーフレームやを使用する方法があることは知っていますtransitionend
が、なぜこれが発生するのですか?コールバックが終了した後でtransition
のみ、明示的に元の値に戻し、Promiseを解決しました。setTimeout
編集