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
Promise
cũng được tạo ra. Bên trong cho biếtPromise
, mộtsetTimeout
chứ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
setTimeout
chạy chức năng gọi lại của nó và đặttransition
thành không. Sau khi làm điều đó,setTimeout
cũng trở lạitransform
giá 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
transition
giá trị của hộp trở về giá trị ban đầu của nó
Tuy nhiên, như có thể thấy, transition
giá trị dường như không phải là none
khi 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 transition
trở lại giá trị ban đầu của nó chỉ sau khi các setTimeout
kế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 đề: