Silakan coba dan jalankan cuplikan berikut, lalu klik kotaknya.
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>
Apa yang saya harapkan terjadi:
- Klik terjadi
- Box mulai menerjemahkan secara horizontal dengan 100px (tindakan ini memakan waktu dua detik)
- Pada klik, yang baru
Promise
juga dibuat. Di dalam kataPromise
,setTimeout
fungsi diatur ke 2 detik - Setelah tindakan selesai (dua detik berlalu),
setTimeout
jalankan fungsi panggilan baliknya dan aturtransition
ke none. Setelah melakukan itu,setTimeout
juga kembalitransform
ke nilai aslinya, sehingga menampilkan kotak untuk muncul di lokasi asli. - Kotak muncul di lokasi asli tanpa masalah efek transisi di sini
- Setelah semua selesai, atur
transition
nilai kotak kembali ke nilai aslinya
Namun, seperti yang bisa dilihat, transition
nilainya nampaknya tidak none
ketika berjalan. Saya tahu bahwa ada metode lain untuk mencapai hal di atas, misalnya menggunakan keyframe dan transitionend
, tetapi mengapa ini terjadi? Saya secara eksplisit mengatur transition
kembali ke nilai aslinya hanya setelah itu setTimeout
selesai callback nya, sehingga menyelesaikan Janji.
EDIT
Sesuai permintaan, berikut adalah gif kode yang menampilkan perilaku bermasalah: