संक्षिप्त जवाब
इस सीएसएस का प्रयोग करें:
.notransition {
-webkit-transition: none !important;
-moz-transition: none !important;
-o-transition: none !important;
transition: none !important;
}
इसके अलावा या तो जेएस (jQuery के बिना) ...
someElement.classList.add('notransition'); // Disable transitions
doWhateverCssChangesYouWant(someElement);
someElement.offsetHeight; // Trigger a reflow, flushing the CSS changes
someElement.classList.remove('notransition'); // Re-enable transitions
या jQuery के साथ यह जेएस ...
$someElement.addClass('notransition'); // Disable transitions
doWhateverCssChangesYouWant($someElement);
$someElement[0].offsetHeight; // Trigger a reflow, flushing the CSS changes
$someElement.removeClass('notransition'); // Re-enable transitions
... या आपके द्वारा काम कर रहे अन्य पुस्तकालय या ढांचे का उपयोग करके समान कोड।
व्याख्या
यह वास्तव में एक काफी सूक्ष्म समस्या है।
सबसे पहले, आप शायद एक 'नोटरीशन' क्लास बनाना चाहते हैं जिसे आप अपने *-transitionसीएसएस विशेषताओं को सेट करने के लिए तत्वों पर लागू कर सकते हैं none। उदाहरण के लिए:
.notransition {
-webkit-transition: none !important;
-moz-transition: none !important;
-o-transition: none !important;
transition: none !important;
}
(माइनर अलग - टिप्पणी एक की कमी -ms-transition। में वहाँ आप इसकी आवश्यकता नहीं है पहले इंटरनेट एक्सप्लोरर के समर्थन बदलाव करने के लिए संस्करण। सब पर आईई 10 था जो समर्थित उन्हें बिना उपसर्ग,।)
लेकिन यह सिर्फ शैली है, और आसान सा है। जब आप इस वर्ग का उपयोग करने का प्रयास करते हैं, तो आप एक जाल में दौड़ेंगे। जाल यह है कि कोड इस तरह काम नहीं करेगा जिस तरह से आप उम्मीद कर सकते हैं:
// Don't do things this way! It doesn't work!
someElement.classList.add('notransition')
someElement.style.height = '50px' // just an example; could be any CSS change
someElement.classList.remove('notransition')
स्वाभाविक रूप से, आप सोच सकते हैं कि ऊंचाई में परिवर्तन एनिमेटेड नहीं होगा, क्योंकि यह तब होता है जब 'नोट्रिशन' वर्ग लागू होता है। वास्तविकता में, हालांकि, यह होगा एनिमेटेड , कम से कम सभी आधुनिक ब्राउज़रों में मैंने कोशिश की है। समस्या यह है कि ब्राउज़र स्टाइल परिवर्तनों को कैशिंग कर रहा है, जो कि जावास्क्रिप्ट को निष्पादित करने तक पूरा करने की आवश्यकता है, और फिर सभी परिवर्तनों को एक एकल रिफ्लो में बना रहा है। नतीजतन, यह एक रीफ़्लो करता है, जहाँ कोई परिवर्तन नहीं किया जाता है या परिवर्तन सक्षम होते हैं या नहीं, लेकिन ऊँचाई में शुद्ध परिवर्तन होता है। नतीजतन, यह ऊंचाई में बदलाव को दर्शाता है।
आप एक उचित और साफ तरीका सोच सकते हैं कि इस तरह से 1ms के समय में 'नोट्रिशन' वर्ग को हटाने के लिए इस तरह से लपेटना होगा:
// Don't do things this way! It STILL doesn't work!
someElement.classList.add('notransition')
someElement.style.height = '50px' // just an example; could be any CSS change
setTimeout(function () {someElement.classList.remove('notransition')}, 1);
लेकिन यह मज़बूती से काम नहीं करता है। मैं WebKit ब्राउज़रों में उपरोक्त कोड विराम नहीं बना पा रहा था, लेकिन फ़ायरफ़ॉक्स (धीमी और तेज़ दोनों मशीनों पर) आप कभी-कभी (बेतरतीब ढंग से) भोले दृष्टिकोण का उपयोग करने के समान व्यवहार प्राप्त कर सकते हैं। मुझे लगता है कि इसका कारण यह है कि जावास्क्रिप्ट निष्पादन के लिए यह काफी संभव है कि टाइमआउट फ़ंक्शन ब्राउज़र निष्क्रिय होने के समय तक निष्पादित होने की प्रतीक्षा कर रहा है और अन्यथा अवसरवादी रिफ्लेक्स करने के बारे में सोच रहा होगा, और यदि ऐसा होता है, तो फ़ायरफ़ॉक्स reflow से पहले पंक्तिबद्ध फ़ंक्शन को निष्पादित करता है।
समस्या का एकमात्र समाधान मैंने पाया है कि 'नोटरीन्स' कक्षा को हटाने से पहले, तत्व में परिवर्तन को सीएसएस में फेरबदल करने के लिए मजबूर किया जाता है। ऐसा करने के विभिन्न तरीके हैं - कुछ के लिए यहां देखें । करीबी बात यह है कि ऐसा करने का एक 'मानक' तरीका offsetHeightहै, तत्व की संपत्ति को पढ़ना ।
एक समाधान जो वास्तव में काम करता है, वह है
someElement.classList.add('notransition'); // Disable transitions
doWhateverCssChangesYouWant(someElement);
someElement.offsetHeight; // Trigger a reflow, flushing the CSS changes
someElement.classList.remove('notransition'); // Re-enable transitions
यहाँ एक जेएस फिडेल है जो मेरे द्वारा वर्णित तीन संभावित दृष्टिकोणों को दिखाता है (दोनों एक सफल दृष्टिकोण और दो असफल व्यक्ति):
http://jsfiddle.net/2uVAA/131/