সংক্ষিপ্ত উত্তর
এই সিএসএস ব্যবহার করুন:
.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
। সেখানে আপনি এটা প্রয়োজন হবে না প্রথম Internet Explorer এর সমর্থন ট্রানজিশন থেকে সংস্করণ। এ সব IE 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')
নিঃসন্দেহে, আপনি ভাবতে পারেন যে উচ্চতার পরিবর্তনটি অ্যানিমেটেড হবে না, কারণ 'নোট্রিশন' শ্রেণি প্রয়োগ করার সময় এটি ঘটে। বাস্তবে, যদিও এটি অ্যানিমেটেড হবে , কমপক্ষে সমস্ত আধুনিক ব্রাউজারে আমি চেষ্টা করেছি। সমস্যাটি হ'ল ব্রাউজারটি জাভাস্ক্রিপ্টের সম্পাদনা শেষ না হওয়া অবধি স্টাইলিং পরিবর্তনগুলি করা হচ্ছে এবং তারপরে একক রিফ্লোতে সমস্ত পরিবর্তন আনতে হবে। ফলস্বরূপ, এটি এমন একটি প্রতিচ্ছবি ঘটায় যেখানে ট্রানজিশনগুলি সক্ষম হয় কি না তাতে কোনও নেট পরিবর্তন নেই, তবে উচ্চতায় নেট পরিবর্তন রয়েছে। ফলস্বরূপ, এটি উচ্চতা পরিবর্তনকে অ্যানিমেট করে।
আপনি মনে করতে পারেন এর কাছাকাছি যাওয়ার একটি যুক্তিসঙ্গত এবং পরিষ্কার উপায় হ'ল 1 মিমি সময়সীমার মধ্যে 'নোট্রিশন' শ্রেণীর অপসারণটি গুটিয়ে রাখা, এটির মতো:
// 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);
তবে এটি নির্ভরযোগ্যভাবে কাজ করে না। আমি ওয়েবকিট ব্রাউজারগুলিতে উপরের কোডটি ব্রেক করতে সক্ষম হয়েছি না, তবে ফায়ারফক্সে (উভয় ধীর এবং দ্রুত মেশিনে) আপনি কখনও কখনও (আপাতদৃষ্টিতে এলোমেলোভাবে) নিখুঁত পদ্ধতির ব্যবহারের মতো আচরণ পাবেন। আমি এর কারণ অনুমান করি যে জাভাস্ক্রিপ্টের কার্যকরকরণের পক্ষে এতটা ধীর হওয়া সম্ভব যে ব্রাউজারটি নিষ্ক্রিয় হওয়ার সময়সীমা নির্বাহের জন্য অপেক্ষা করা হয় এবং অন্যথায় সুযোগসন্ধানী রিফ্লো করার কথা ভাবছিল, এবং যদি সেই পরিস্থিতি ঘটে, ফায়ারফক্স রেফ্লোয়ের আগে সারিবদ্ধ ফাংশন সম্পাদন করে।
সমস্যার সমাধানের একমাত্র সমাধান হ'ল 'নোট্রিশন' শ্রেণিটি সরিয়ে নেওয়ার আগে উপাদানটির পুনর্বিবেচনা জোর করা , এতে করা সিএসএস পরিবর্তনগুলি ফ্লাশ করে দেওয়া। এটি করার বিভিন্ন উপায় রয়েছে - কিছুটির জন্য এখানে দেখুন । এটি করার একটি 'স্ট্যান্ডার্ড' পদ্ধতির নিকটতম জিনিসটি হল 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/