कृपया निम्न स्निपेट आज़माएँ और चलाएँ, फिर बॉक्स पर क्लिक करें।
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
संपादित करें
अनुरोध के अनुसार, यहाँ समस्यात्मक व्यवहार प्रदर्शित करने वाले कोड का gif है: