Kısa cevap
Bu CSS'yi kullanın:
.notransition {
-webkit-transition: none !important;
-moz-transition: none !important;
-o-transition: none !important;
transition: none !important;
}
Artı ya bu JS (jQuery olmadan) ...
someElement.classList.add('notransition'); // Disable transitions
doWhateverCssChangesYouWant(someElement);
someElement.offsetHeight; // Trigger a reflow, flushing the CSS changes
someElement.classList.remove('notransition'); // Re-enable transitions
Veya jQuery ile bu JS ...
$someElement.addClass('notransition'); // Disable transitions
doWhateverCssChangesYouWant($someElement);
$someElement[0].offsetHeight; // Trigger a reflow, flushing the CSS changes
$someElement.removeClass('notransition'); // Re-enable transitions
... veya üzerinde çalıştığınız diğer kitaplıkları veya çerçeveleri kullanarak eşdeğer bir kodu kullanabilirsiniz.
açıklama
Bu aslında oldukça ince bir sorundur.
İlk olarak, muhtemelen *-transition
CSS özniteliklerini ayarlamak için öğelere uygulayabileceğiniz bir 'notransition' sınıfı oluşturmak istersiniz none
. Örneğin:
.notransition {
-webkit-transition: none !important;
-moz-transition: none !important;
-o-transition: none !important;
transition: none !important;
}
(Minör kenara - nota bir eksikliği -ms-transition
. Orada Sen buna ihtiyacı yoktur destek geçişlerine Internet Explorer'ın ilk sürümü. Hiç bunları Öneksiz desteklenen IE 10 idi.)
Ama bu sadece stil ve kolay olanı. Bu sınıfı kullanmaya ve denemeye geldiğinizde bir tuzağa düşeceksiniz. Tuzak, bunun gibi kodun naif olarak beklediğiniz şekilde çalışmadığıdır:
// 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')
Saf olarak, yükseklikteki değişikliğin canlandırılmayacağını düşünebilirsiniz, çünkü 'notransition' sınıfı uygulanırken olur. Gerçekte, en azından denediğim tüm modern tarayıcılarda animasyonlu olacak . Sorun, tarayıcının JavaScript'in çalışması bitene kadar yapması gereken stil değişikliklerini önbelleğe alması ve ardından tüm değişiklikleri tek bir yeniden akışta yapmasıdır. Sonuç olarak, geçişlerin etkin olup olmadığı konusunda net bir değişiklik olmadığı, ancak yükseklikte net bir değişiklik olduğu bir yeniden akış yapar. Sonuç olarak, yükseklik değişimini canlandırır.
Bu sorunun üstesinden gelmenin makul ve temiz bir yolunun 'notransition' sınıfının kaldırılmasını 1ms zaman aşımına uğramak olduğunu düşünebilirsiniz:
// 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);
ancak bu da güvenilir bir şekilde çalışmaz. WebKit tarayıcılarında yukarıdaki kod kırmasını yapamadım, ancak Firefox'ta (hem yavaş hem de hızlı makinelerde) bazen (görünüşte rastgele) naif yaklaşımı kullanarak aynı davranışı elde edersiniz. Bunun nedeni, JavaScript yürütmesinin, zaman aşımı işlevinin tarayıcı boşta kaldığında ve aksi takdirde fırsatçı bir yeniden akış yapmayı düşünürken yürütmeyi bekleyecek kadar yavaş olabilmesinin mümkün olduğunu düşünüyorum ve bu senaryo gerçekleşirse, Firefox, yeniden akıştan önce kuyruğa alınan işlevi yürütür.
Soruna bulduğum tek çözüm , 'notransition' sınıfını kaldırmadan önce, üzerinde yapılan CSS değişikliklerini temizleyerek öğenin yeniden akışını zorlamak . Bunu yapmanın çeşitli yolları vardır - bazıları için buraya bakın . Bunu yapmanın 'standart' bir yoluna en yakın şey offsetHeight
, elemanın özelliğini okumaktır .
Aslında işe yarayan bir çözüm,
someElement.classList.add('notransition'); // Disable transitions
doWhateverCssChangesYouWant(someElement);
someElement.offsetHeight; // Trigger a reflow, flushing the CSS changes
someElement.classList.remove('notransition'); // Re-enable transitions
Burada tarif ettiğim üç olası yaklaşımı gösteren bir JS kemanı (hem başarılı bir yaklaşım hem de başarısız olan iki yaklaşım):
http://jsfiddle.net/2uVAA/131/