bazı öğeler için nganimate'i devre dışı bırak


96

Ben ngAnimate modülü kullanıyorum, ancak tüm benim ng-if, ng-showvb, bu etkilenir, bazı seçilmiş elemanlar için kaldıraç ngAnimate istiyorum. Performans ve çok hızlı gösteren ve gizlenen öğelerdeki bazı hatalar için.

Teşekkürler.


1
Sorunun bazı örnek kodunu ekleyin.
cheekybastard

Sorunlardan biri, ngAnimate'in display:blocktüm tekrarlayıcılarınıza güç vermesidir :ng-hide-add-active, .ng-hide-remove { display: block!important; }
Somatik 15

Sorulması gereken daha iyi soru, "ngAnimate'in tam bir animasyon döngüsünü tamamlamadan gizlenmiş öğeler için doğru çalışmasını sağlamak için CSS'mi nasıl tanımlayabilirim? En iyi cevap aşağıdaki Chris Barr'dan.
Eric

Yanıtlar:


53

Sadece bunu CSS'nize ekleyin. Son kural olması en iyisidir:

.no-animate {
   -webkit-transition: none !important;
   transition: none !important;
}

ardından no-animatedevre dışı bırakmak istediğiniz öğe sınıfına ekleyin . Misal:

<div class="no-animate"></div>

2
Sass kullanıyorsanız, "-webkit-geçişi: yok! Önemli;" 'e ihtiyacınız yok
Marwen Trabelsi

15
Lütfen bu cevabın yanlış olduğunu unutmayın çünkü sadece Angular tarafından yönetilenleri değil TÜM ANİMASYONLARI DEVRE DIŞI BIRAKIR.
stackular

1
Bunu denediniz mi? kodunuzun bir örneğini görmeme izin verin. Benim ve bunu onaylayan altıdan fazla kişi için işe yarıyor
David Addoteye

2
.no-animate, .no-animate-children *Çocukları vb.
Kimball Robinson

1
@DavidAddoteye Bu çözüm, geçişli bir öğenin üzerinde ng-show veya ng-if varsa geçerli değildir .. Yani, sadece http isteği sırasında görünen ve istek çözüldüğünde kaybolan bir yükleyici döndürücüm varsa, ekliyor bu sınıf hiçbir şekilde canlandırmaya neden olmayacak !, michael cevap tamam, ancak uygulanması çok yorucu ve denetleyicilerde css seçicilerden kaçınmaya çalışmalısınız. Bir yönerge oluşturmak sorun değil, ancak Blowsie'nin cevabına baktığınızda, AngularJS ekibinin bu sorunu halletmek için esnek bir yol sağladığını
göreceksiniz

106

Belirli öğeler için animasyonları etkinleştirmek istiyorsanız (belirli öğeler için devre dışı bırakmanın aksine ), canlandırmak için belirli bir sınıf adına (veya regex) sahip öğeleri yapılandırmak için $ animateProvider'ı kullanabilirsiniz .

Aşağıdaki kod, angular-animatesınıfa sahip öğeler için animasyonları etkinleştirecektir :

var myApp = angular.module("MyApp", ["ngAnimate"]);
myApp.config(function($animateProvider) {
  $animateProvider.classNameFilter(/angular-animate/);
})

angular-animateAnimasyonları etkinleştirmek için sınıfı içeren örnek işaretleme :

<div ng-init="items=[1,2,3,4,5,6,7,8,9]">
  <input placeholder="Filter with animations." ng-model="f" /> 
  <div class="my-repeat-animation angular-animate" ng-repeat="item in items | filter:f track by item" >
    {{item}}
  </div>
</div>

Plunker örneği , yalnızca ilk filtrenin animasyonlara sahip olduğu bu blogdan ödünç alınmış ve değiştirilmiştir ( angular-animatesınıfa sahip olduğu için ).

Lütfen angular-animateörnek olarak kullandığımı ve .classNameFilterişlev kullanılarak tamamen yapılandırılabileceğini unutmayın .


5
Günümü kurtardın. Çok teşekkür ederim
gustavohenke

Bu, animasyonlara dahil olmayı gerektirdiğinden ve animasyonlu öğeler diğerlerinden sınıf adına göre açıkça ayırt edildiğinden en zarif çözümdür.
Nikola M.

2
Kabul edilen çözüm bu olmalıdır. Mükemmel çalışıyor ve günümü kurtardı!

9
sınıfla açıklamayı /^(?:(?!ng-animate-disabled).)*$/devre dışı bırakmak için normal ifadeyi kullanın ng-animate-disabled.
IcanDivideBy0

Harika çözüm! Sayfa başına 20 satırlık sayfalara ayrılmış bir tablom var. Sayfaları değiştirmek için zamanın üçte biri, kullanılmayan animasyon css sınıflarını işleyen tarayıcı tarafından tüketiliyordu.
Kevin

81

Modülünüze bağımlı olarak ngAnimate modülüne sahipseniz, AngularJS'de animasyonları dağıtmanın iki yolu vardır:

  1. $ Animate hizmetinde animasyonu genel olarak devre dışı bırakın veya etkinleştirin:

    $animate.enabled(false);
    
  2. Belirli bir öğe için animasyonları devre dışı bırakın - bu, bu açısal öğe olmalıdır, animationstate css sınıflarını ekler (örneğin ng-enter, ...)!

    $animate.enabled(false, theElement);
    

Angular 1.4 sürümünden itibaren argümanları tersine çevirmelisiniz:

$animate.enabled(theElement, false);

İçin belgeler$animate .


2
Bu, beklendiği gibi belirli unsurlarda çalışmaz. Animasyonları global olarak kapatır ve sonra belirli bir öğede etkinleştirirsem, çalışmıyor.
Kushagra Gour

1
Bu yanıt, gerçekte hangi Angular sürümünde çalıştığını belirtmek için kaldırılmalı veya düzenlenmelidir. 1.2.10 için, AFAICT sorusunun tüm noktası olan belirli öğeler için canlandırmayı seçmeli olarak etkinleştirmek için kesinlikle çalışmaz.
Trindaz

Seçenek 2'nin 1.2.25 sürümünde çalışıp çalışmadığını bilen var mı?
khorvat

1
Dokümantasyona bakıldığında ( docs.angularjs.org/api/ng/service/$animate ), "eleman" ın etkinleştirilmiş işleve iletilecek ilk parametre olduğu görülmektedir.
DanielM

49

Angular animate paradigmasını izleyen bir CSS sınıfı kullanarak belirli öğeler için ng-animate'i devre dışı bırakmak için, normal ifadeyi kullanarak sınıfı test etmek için ng-animate'i yapılandırabilirsiniz.

Yapılandırma

    var myApp = angular.module("MyApp", ["ngAnimate"]);
    myApp.config(function($animateProvider) {
        $animateProvider.classNameFilter(/^(?:(?!ng-animate-disabled).)*$/);
    })

Kullanım

ng-animate-disabledSınıfı, ng-animate ile yok sayılmasını istediğiniz öğelere eklemeniz yeterlidir .


Kredi http://davidchin.me/blog/disable-nganimate-for-selected-elements/


7
Bence bu, anma davranışlarını filtrelemenin en doğru yolu!
edrian

6
Bu cevap için kaydırmaya değerdi.
Jossef Harush

AngularJS'nin en son sürümüyle bunun kesinlikle sorun için en iyi çözüm olduğunu doğrulayabilirim.
Adam Reis

44

teşekkürler, elemente yerleştirebileceğiniz bir yönerge yazdım

CoffeeScript:

myApp.directive "disableAnimate", ($animate) ->
  (scope, element) ->
    $animate.enabled(false, element)

JavaScript:

myApp.directive("disableAnimate", function ($animate) {
    return function (scope, element) {
        $animate.enabled(false, element);
    };
});

Bu oldukça şık bir yaklaşımdır, öğe nesnesine nasıl erişileceği her zaman açık değildir ve diğer bazı yaklaşımlarda, korkarım denetleyicilerimi bir şablonda tanımlanmış bir veya birkaç öğeye sabit referans veren Javascript ile karıştırıyorum. . Bu kaygıların büyük bir ayrımı gibi geliyor, tebrikler!
Mattygabe

2
Herhangi biri bunun neden tüm ng animasyonu devre dışı bıraktığını merak ederse, $ animate.enabled'da parametre sırası tersine çevrilir. $animate.enabled(element,false);
Kullanırsanız

Özür dilerim, bu yalnızca 1.4.x + için geçerli, yukarıdaki kod önceki sürümler için doğru.
gss

19

Bunun veya $animate.enabled(false, $element);kullanan öğeler için işe yarayacağını buldum, ancak herhangi bir nedenle kullanılan öğeler için işe yaramayacak ! Sonunda kullandığım çözüm, hepsini GitHub'daki bu iş parçacığından öğrendiğim CSS'de yapmaktı .ng-showng-hideng-if

CSS

/* Use this for transitions */
.disable-animations.ng-enter,
.disable-animations.ng-leave,
.disable-animations.ng-animate {
  -webkit-transition: none !important;
  transition: none !important;
}

/* Use this for keyframe animations */
.disable-animations.ng-animate {
  -webkit-animation: none 0s;
  animation: none 0s;
}

SCSS

.disable-animations {
  // Use this for transitions
  &.ng-enter,
  &.ng-leave,
  &.ng-animate {
    -webkit-transition: none !important;
    transition: none !important;
  }
  // Use this for keyframe animations
  &.ng-animate {
    -webkit-animation: none 0s;
    animation: none 0s;
  }
}

Benim durumum, ngAnimate yüklendiğinde, .loading.ng-hide gibi bir sınıfın, tam bir animasyon döngüsü tamamlanana kadar ekranda kalmasıydı. Bu en temiz cevaptır, çünkü temelde doğru yapılandırmayı ngAnimate'e beslemek ve normal şekilde kullanmaktır. Bu, yanlış yapılandırmaya ve ardından devre dışı bırakmaya tercih edilir. Yani +1, keşke buradaki puanı eşitlemek için daha fazlasını verebilseydim.
Eric

Bu en zor cevap. Bunu css ile yapmak js ile uğraşmaktan daha iyidir.
manas

Lütfen @Blowsie cevabına bakın, bununla baş etmenin daha genel ve doğru yolu bu
edrian

3

Ben do DEĞİL benim üzerinde ngAnimate kullanmak istiyorum ng-ifbu benim çözüm olurdu böylece, 's:

[ng-if] {
  .ng-enter, .ng-leave, .ng-animate {
    -webkit-transition: none !important;
    transition: none !important;
  }
}

Bunu başka bir öneri olarak gönderiyorum!


2

liİlkinin kullanılarak gizlendiği bir listem var ng-hide="$first". Ortadan kaybolmadan önce yarım saniye gösterilen varlıktaki ng-entersonuçları kullanmak li.

Chris Barr'ın çözümüne dayanarak, kodum artık şöyle görünüyor:

HTML

<ol>
    <li ng-repeat="item in items"
        ng-hide="$first"
        ng-class="{'no-animate' : $first}">
    </li>
</ol>

CSS

.no-animate.ng-enter,
.no-animate.ng-leave,
.no-animate.ng-animate {
        transition: none !important; /* disable transitions */
        animation: none 0s !important; /* disable keyframe animations */
}

li.ng-enter {
    opacity: 0;
    transition: opacity 0.3s ease-out;
}
li.ng-enter-active {
    opacity: 1;
}

/* I use Autoprefixer. If you don't, please include vendor prefixes. */

0

Bunun gecikmiş bir cevap olduğunu biliyorum, ancak burada MainController'da kullanıyoruz:

// disable all animations
$animate.enabled(false);

Ancak sorun şu ki, tüm animasyonları devre dışı bıraktığımızda, ui-select'in yapılandırılması opacity: 0.

Bu nedenle, opaklığı CSS kullanarak 1'e ayarlamak gereklidir:

.ui-select-choices {
    opacity: 1 !important;
}

Bu, opaklığı uygun şekilde ayarlayacak ve ui-select çalışacaktır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.