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
Promisejuga dibuat. Di dalam kataPromise,setTimeoutfungsi diatur ke 2 detik - Setelah tindakan selesai (dua detik berlalu),
setTimeoutjalankan fungsi panggilan baliknya dan aturtransitionke none. Setelah melakukan itu,setTimeoutjuga kembalitransformke 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
transitionnilai kotak kembali ke nilai aslinya
Namun, seperti yang bisa dilihat, transitionnilainya nampaknya tidak noneketika 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 transitionkembali ke nilai aslinya hanya setelah itu setTimeoutselesai callback nya, sehingga menyelesaikan Janji.
EDIT
Sesuai permintaan, berikut adalah gif kode yang menampilkan perilaku bermasalah:
