Vui lòng thử và chạy đoạn mã sau, sau đó nhấp vào hộp.
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>
Những gì tôi mong đợi sẽ xảy ra:
- Nhấp chuột xảy ra
- Hộp bắt đầu dịch theo chiều ngang 100px (hành động này mất hai giây)
- Khi nhấp chuột, một cái mới
Promisecũng được tạo ra. Bên trong cho biếtPromise, mộtsetTimeoutchức năng được đặt thành 2 giây - Sau khi hành động hoàn thành (hai giây đã trôi qua), hãy
setTimeoutchạy chức năng gọi lại của nó và đặttransitionthành không. Sau khi làm điều đó,setTimeoutcũng trở lạitransformgiá trị ban đầu của nó, do đó làm cho hộp xuất hiện ở vị trí ban đầu. - Hộp xuất hiện ở vị trí ban đầu không có vấn đề về hiệu ứng chuyển tiếp ở đây
- Sau khi tất cả kết thúc, đặt
transitiongiá trị của hộp trở về giá trị ban đầu của nó
Tuy nhiên, như có thể thấy, transitiongiá trị dường như không phải là nonekhi chạy. Tôi biết rằng có các phương pháp khác để đạt được những điều trên, ví dụ như sử dụng keyframe và transitionend, nhưng tại sao điều này lại xảy ra? Tôi dứt khoát thiết lập transitiontrở lại giá trị ban đầu của nó chỉ sau khi các setTimeoutkết thúc cuộc gọi lại của nó, do đó giải quyết Promise.
BIÊN TẬP
Theo yêu cầu, đây là một gif của mã hiển thị hành vi có vấn đề:
