โปรดลองและเรียกใช้ตัวอย่างต่อไปนี้จากนั้นคลิกที่กล่อง
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 (การกระทำนี้ใช้เวลาสองวินาที)
- เมื่อคลิกใหม่
Promise
จะถูกสร้างขึ้น ภายในกล่าวว่าPromise
เป็นsetTimeout
ฟังก์ชั่นการกำหนดเป็น 2 วินาที - หลังจากการดำเนินการเสร็จสมบูรณ์ (ผ่านไปสองวินาที) ให้
setTimeout
เรียกใช้ฟังก์ชันการโทรกลับและตั้งค่าtransition
เป็นไม่มี หลังจากทำเช่นนั้นแล้วsetTimeout
จะเปลี่ยนกลับtransform
เป็นค่าดั้งเดิมดังนั้นจึงแสดงผลกล่องเพื่อให้ปรากฏที่ตำแหน่งเดิม - กล่องจะปรากฏขึ้นที่ตำแหน่งเดิมโดยไม่มีปัญหาผลการเปลี่ยนแปลงที่นี่
- หลังจากเสร็จสิ้นทั้งหมดให้ตั้ง
transition
ค่าของกล่องกลับไปเป็นค่าดั้งเดิม
อย่างไรก็ตามตามที่เห็นtransition
ค่าดูเหมือนจะไม่none
ทำงานเมื่อ ฉันรู้ว่ามีวิธีอื่น ๆ เพื่อให้บรรลุดังกล่าวข้างต้นเช่นการใช้คีย์เฟรมและtransitionend
แต่สิ่งนี้เกิดขึ้นได้อย่างไร ฉันอย่างชัดเจนตั้งค่าtransition
กลับไปเป็นค่าเดิมเท่านั้นหลังจากsetTimeout
เสร็จสิ้นการเรียกกลับของมันดังนั้นการแก้ไขสัญญา
แก้ไข