disabilita nganimate per alcuni elementi


96

Sto usando il modulo ngAnimate, ma tutto il mio ng-if, ng-show, ecc, sono influenzati da questo, voglio leva ngAnimate per alcuni elementi selezionati. Per le prestazioni e alcuni bug in elementi che mostrano e nascondono molto velocemente.

Grazie.


1
Aggiungi un codice di esempio del problema.
Cheekybastard

Uno dei problemi è che ngAnimate forza display:blocktutti i tuoi ripetitori:ng-hide-add-active, .ng-hide-remove { display: block!important; }
Somatik

La domanda migliore da porsi sarebbe "come posso definire il mio CSS per far funzionare correttamente ngAnimate per gli elementi che sono nascosti senza completare un ciclo completo di animazione". La migliore risposta è di Chris Barr di seguito.
Eric

Risposte:


53

Basta aggiungerlo al tuo CSS. È meglio se è l'ultima regola:

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

quindi aggiungi no-animatealla classe dell'elemento che desideri disabilitare. Esempio:

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

2
Se stai usando sass, non hai bisogno della "-webkit-Transition: none! Important;"
Marwen Trabelsi

15
Si noti che questa risposta è sbagliata perché DISABILITA TUTTE LE ANIMAZIONI, non solo quelle gestite da Angular.
impilabile

1
L'hai provato? fammi vedere un esempio del tuo codice. Funziona per me e per più di sei persone che l'hanno approvato
David Addoteye

2
Ho aggiunto una .no-animate, .no-animate-children *regola per coprire i bambini, ecc.
Kimball Robinson

1
@DavidAddoteye questa soluzione non è praticabile se hai un ng-show o ng-if su un elemento con transizione .. Voglio dire .. se ho uno spinner del caricatore che si presenta solo durante la richiesta http e scompare quando la richiesta viene risolta, aggiungendo questa classe risulterà in nessuna animazione !, la risposta di Michael è ok, ma troppo noiosa da implementare, e dovresti cercare di evitare i selettori CSS nei controller. La creazione di una direttiva va bene, ma guardando la risposta di Blowsie scoprirai che il team di AngularJS ha già fornito un modo flessibile per prendersi cura di questo problema;)
edrian

106

Se vuoi abilitare le animazioni per elementi specifici (invece di disabilitarle per elementi specifici) puoi usare $ animateProvider per configurare gli elementi con un particolare nome di classe (o regex) da animare.

Il codice seguente abiliterà le animazioni per gli elementi che hanno la angular-animateclasse:

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

Ecco un esempio di markup che include la angular-animateclasse per abilitare le animazioni:

<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>

Esempio di Plunker preso in prestito e modificato da questo blog in cui solo il primo filtro ha animazioni (a causa della angular-animateclasse).

Si prega di notare che lo sto utilizzando angular-animatecome esempio ed è completamente configurabile utilizzando la .classNameFilterfunzione.


5
Mi hai salvato la giornata. Grazie mille
gustavohenke

Questa è la soluzione più elegante poiché richiede l'attivazione delle animazioni e gli elementi animati sono chiaramente differenziati dagli altri in base al nome della classe.
Nikola M.

2
Questa dovrebbe essere la soluzione accettata. Funziona perfettamente e mi ha salvato la giornata!

9
usa /^(?:(?!ng-animate-disabled).)*$/regex per disabilitare l'annimazione con la ng-animate-disabledclasse.
IcanDivideBy0

Ottima soluzione! Ho una tabella impaginata con 20 righe per pagina. Un terzo del tempo per passare da una pagina all'altra veniva consumato dal browser che elaborava le classi css di animazione che non venivano nemmeno utilizzate.
Kevin

81

Ci sono due modi in cui puoi disbalsare le animazioni in AngularJS se hai il modulo ngAnimate come dipendenza dal tuo modulo:

  1. Disabilita o abilita l'animazione a livello globale sul servizio $ animate:

    $animate.enabled(false);
  2. Disabilita le animazioni per un elemento specifico - questo deve essere l'elemento per quell'angular aggiungerà le classi css animationstate (es. Ng-enter, ...)!

    $animate.enabled(false, theElement);

A partire dalla versione 1.4 di Angular dovresti invertire gli argomenti:

$animate.enabled(theElement, false);

Documentazione per$animate .


2
Questo non funziona su elementi specifici come previsto. Se disattivo le animazioni a livello globale e poi lo abilito su un particolare elemento, non funziona.
Kushagra Gour

1
Questa risposta dovrebbe essere rimossa o modificata per specificare su quale versione di Angular funziona effettivamente. Per 1.2.10 sicuramente non funziona per abilitare selettivamente l'animazione per alcuni elementi, che è il punto centrale della domanda AFAICT.
Trindaz

Qualcuno sa se l'opzione 2 funziona sulla versione 1.2.25?
khorvat

1
Solo guardando la documentazione ( docs.angularjs.org/api/ng/service/$animate ) sembra che l '«elemento» sia il primo parametro da passare alla funzione abilitata.
DanielM

49

Per disabilitare ng-animate per determinati elementi, utilizzando una classe CSS, che segue il paradigma di Angular animate, puoi configurare ng-animate per testare la classe usando regex.

Config

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

Utilizzo

Aggiungi semplicemente la ng-animate-disabledclasse a qualsiasi elemento che desideri venga ignorato da ng-animate.


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


7
Penso che questo sia il modo più corretto per filtrare il comportamento dei ngannimate!
edrian

6
Valeva la pena scorrere per trovare questa risposta.
Jossef Harush

Posso confermare che con l'ultima versione di AngularJS questa è sicuramente la migliore soluzione al problema.
Adam Reis

44

grazie, ho scritto una direttiva che puoi inserire sull'elemento

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);
    };
});

Questo è un approccio piuttosto ingegnoso, non è sempre chiaro come accedere all'oggetto elemento e con alcuni degli altri approcci temo di ingombrare i miei controller con riferimenti Javascript a uno o più elementi definiti in un modello . Sembra una grande separazione delle preoccupazioni, complimenti!
Mattygabe

2
L'ordine dei parametri è invertito in $ animate.enabled, se qualcuno si chiede perché questo disabiliti tutte le animazioni. Funziona a meraviglia se usi$animate.enabled(element,false);
gss

Mi scuso, vedo che è applicabile solo a 1.4.x +, il codice sopra è corretto per le versioni precedenti.
gss

19

Ho scoperto che $animate.enabled(false, $element);funzionerà per gli elementi che usano ng-showo ng-hidema non funzionerà per gli elementi che usano ng-ifper qualche motivo! La soluzione che ho finito per usare è stata quella di fare tutto in CSS, che ho imparato da questo thread su GitHub .

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;
  }
}

Il mio caso era che con ngAnimate caricato, una classe come .loading.ng-hide sarebbe rimasta sullo schermo fino al completamento di un ciclo completo di animazione. Questa è la risposta più pulita, perché fondamentalmente sta solo fornendo la giusta configurazione a ngAnimate e usandola normalmente. È preferibile configurarlo in modo errato, quindi disabilitarlo. Quindi +1 per te, vorrei poter dare di più per pareggiare il punteggio qui.
Eric

Questa è la risposta più complicata. Farlo con CSS è meglio che scherzare con js.
manas

Si prega di guardare la risposta di @Blowsie, questo è il modo più generico e corretto per affrontare questo
problema

3

Io non voglio usare ngAnimate sul mio ng-if's, quindi questo sarebbe la mia soluzione:

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

Sto solo pubblicando questo come un altro suggerimento!


2

Ho un elenco da cui il primo liè nascosto usando ng-hide="$first". L'utilizzo dei ng-enterrisultati linell'essere mostrato per mezzo secondo prima di scomparire.

Sulla base della soluzione di Chris Barr, il mio codice ora ha questo aspetto:

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

So che è una risposta ritardata, ma qui usiamo in MainController:

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

Ma il problema è che quando disabilitiamo tutte le animazioni, l'interfaccia utente è configurata su opacity: 0.

Quindi, è necessario impostare l'opacità su 1 utilizzando CSS:

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

Questo imposterà correttamente l'opacità e l'interfaccia utente funzionerà.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.