Deaktivieren Sie nganimate für einige Elemente


96

Ich bin das ngAnimate Modul verwenden, aber alle meine ng-if, ng-showusw, sind davon betroffen, möchte ich Hebel ngAnimate für einige ausgewählte Elemente. Für die Leistung und einige Fehler in Elementen, die sehr schnell ein- und ausgeblendet werden.

Vielen Dank.


1
Fügen Sie einen Beispielcode für das Problem hinzu.
frecher Bastard

Eines der Probleme ist, dass ngAnimate Kräfte display:blockauf alle Ihre Repeater:ng-hide-add-active, .ng-hide-remove { display: block!important; }
Somatik

Die bessere Frage wäre: "Wie kann ich mein CSS definieren, damit ngAnimate für ausgeblendete Elemente korrekt funktioniert, ohne eine vollständige Animationsschleife abzuschließen?". Die beste Antwort kommt von Chris Barr unten.
Eric

Antworten:


53

Fügen Sie dies einfach Ihrem CSS hinzu. Es ist am besten, wenn es die letzte Regel ist:

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

Fügen no-animateSie dann der Elementklasse hinzu , die Sie deaktivieren möchten. Beispiel:

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

2
Wenn Sie sass verwenden, brauchen Sie nicht den "-webkit-Übergang: keine! Wichtig;"
Marwen Trabelsi

15
Bitte beachten Sie, dass diese Antwort falsch ist, da sie alle Animationen deaktiviert, nicht nur diejenigen, die von Angular verarbeitet werden.
Stapel

1
Hast du es versucht? Lassen Sie mich ein Beispiel Ihres Codes sehen. Es funktioniert für mich und über sechs Personen, die es genehmigt haben
David Addoteye

2
Ich habe eine .no-animate, .no-animate-children *Regel hinzugefügt , um Kinder usw. abzudecken
Kimball Robinson

1
@DavidAddoteye Diese Lösung ist nicht realisierbar, wenn Sie eine ng-show oder ng-if über einem Element mit Übergang haben. Ich meine. Wenn ich einen Loader-Spinner habe, der nur während einer http-Anfrage angezeigt wird und verschwindet, wenn die Anfrage gelöst wird, und hinzufügen Diese Klasse führt zu keiner Animation!, Michael Antwort ist in Ordnung, aber zu langwierig, um sie zu implementieren, und Sie sollten versuchen, CSS-Selektoren in Controllern zu vermeiden. Das Erstellen einer Direktive ist in Ordnung, aber wenn Sie sich die Antwort von Blowsie ansehen, werden Sie feststellen, dass das AngularJS-Team bereits eine flexible Möglichkeit bereitgestellt hat, um dieses Problem zu lösen;)
Edrian

106

Wenn Sie Animationen für bestimmte Elemente aktivieren möchten ( anstatt sie für bestimmte Elemente zu deaktivieren), können Sie mit dem $ animateProvider Elemente mit einem bestimmten Klassennamen (oder regulären Ausdruck) zum Animieren konfigurieren.

Der folgende Code aktiviert Animationen für Elemente mit der angular-animateKlasse:

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

Hier ist ein Beispiel-Markup, das die angular-animateKlasse zum Aktivieren von Animationen enthält:

<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- Beispiel aus diesem Blog ausgeliehen und geändert, in dem nur der erste Filter Animationen enthält (aufgrund der angular-animateKlasse).

Bitte beachten Sie, dass ich angular-animateals Beispiel verwende und es mit der .classNameFilterFunktion vollständig konfigurierbar ist.


5
Du hast meinen Tag gerettet. Vielen Dank
Gustavohenke

Dies ist die eleganteste Lösung, da für Animationen ein Opt-In erforderlich ist und animierte Elemente durch den Klassennamen klar von anderen unterschieden werden.
Nikola M.

2
Dies sollte die akzeptierte Lösung sein. Funktioniert perfekt und hat meinen Tag gerettet!

9
Verwenden Sie /^(?:(?!ng-animate-disabled).)*$/Regex, um die Annimation mit ng-animate-disabledKlasse zu deaktivieren .
IcanDivideBy0

Tolle Lösung! Ich habe eine paginierte Tabelle mit 20 Zeilen pro Seite. Ein Drittel der Zeit zum Wechseln der Seiten wurde vom Browser verbraucht, der die nicht einmal verwendeten Animations-CSS-Klassen verarbeitete.
Kevin

81

Es gibt zwei Möglichkeiten, Animationen in AngularJS zu entkalken, wenn Sie das Modul ngAnimate als Abhängigkeit von Ihrem Modul haben:

  1. Deaktivieren oder aktivieren Sie die Animation global für den Dienst $ animate:

    $animate.enabled(false);
  2. Deaktivieren Sie die Animationen für ein bestimmtes Element - dies muss das Element für diesen Winkel sein, um die CSS-Klassen des Animationsstatus hinzuzufügen (z. B. ng-enter, ...)!

    $animate.enabled(false, theElement);

Ab der Version Angular 1.4 sollten Sie die Argumente umkehren:

$animate.enabled(theElement, false);

Dokumentation für$animate .


2
Dies funktioniert nicht wie erwartet bei bestimmten Elementen. Wenn ich die Animationen global ausschalte und sie dann für ein bestimmtes Element aktiviere, funktioniert es nicht.
Kushagra Gour

1
Diese Antwort sollte entfernt oder bearbeitet werden, um anzugeben, auf welcher Version von Angular sie tatsächlich funktioniert. Für 1.2.10 funktioniert es definitiv nicht, um bestimmte Elemente selektiv zu animieren, was der springende Punkt der Frage AFAICT ist.
Trindaz

Weiß jemand, ob Option 2 auf der Version 1.2.25 funktioniert?
Khorvat

1
Wenn man sich nur die Dokumentation ( docs.angularjs.org/api/ng/service/$animate ) ansieht , scheint das «Element» der erste Parameter zu sein, der an die aktivierte Funktion übergeben wird.
DanielM

49

Um ng-animate für bestimmte Elemente mithilfe einer CSS-Klasse zu deaktivieren, die dem Angular-Animate-Paradigma folgt, können Sie ng-animate so konfigurieren, dass die Klasse mithilfe von Regex getestet wird.

Konfig

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

Verwendung

Fügen Sie die ng-animate-disabledKlasse einfach zu allen Elementen hinzu, die von ng-animate ignoriert werden sollen.


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


7
Ich denke, dies ist der korrekteste Weg, um ngannimate Verhalten zu filtern!
Edrian

6
Es hat sich gelohnt, für diese Antwort zu scrollen.
Jossef Harush

Ich kann bestätigen, dass dies mit der neuesten Version von AngularJS definitiv die beste Lösung für das Problem ist.
Adam Reis

44

danke, ich habe eine Direktive geschrieben, die Sie auf das Element setzen können

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

Dies ist ein ziemlich geschickter Ansatz, es ist nicht immer klar, wie auf das Elementobjekt zugegriffen werden soll, und bei einigen anderen Ansätzen befürchte ich, dass ich meine Controller mit Javascript überladen würde, indem ich ein oder mehrere in einer Vorlage definierte Elemente hart referenziere . Das fühlt sich wie eine große Trennung von Sorgen an, ein dickes Lob!
Mattygabe

2
Die Parameterreihenfolge wird in $ animate.enabled umgekehrt, wenn sich jemand fragt, warum dadurch alle ng-Animationen deaktiviert werden. Funktioniert wie ein Zauber, wenn Sie$animate.enabled(element,false);
gss

Entschuldigung Ich sehe, dass dies nur für 1.4.x + gilt. Der obige Code ist für frühere Versionen korrekt.
gss

19

Ich habe festgestellt, dass dies $animate.enabled(false, $element);für Elemente funktioniert, die verwendet werden, ng-showoder ng-hideaber nicht für Elemente, die ng-ifaus irgendeinem Grund verwendet werden! Die Lösung, die ich letztendlich verwendet habe, bestand darin, alles in CSS zu erledigen, was ich aus diesem Thread auf GitHub gelernt habe .

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

Mein Fall war, dass mit ngAnimate eine Klasse wie .loading.ng-hide auf dem Bildschirm bleiben würde, bis eine vollständige Animationsschleife abgeschlossen ist. Dies ist die sauberste Antwort, da ngAnimate im Grunde genommen nur die richtige Konfiguration zugeführt und normal verwendet wird. Dies ist vorzuziehen, um es falsch zu konfigurieren und dann zu deaktivieren. Also +1 für Sie, ich wünschte, ich könnte mehr geben, um die Punktzahl hier auszugleichen.
Eric

Dies ist die schwierigste Antwort. Es ist besser, es mit CSS zu machen, als mit JS zu spielen.
Manas

Bitte schauen Sie sich die Antwort von @Blowsie an, das ist der allgemeinere und korrektere Weg, um damit umzugehen
edrian

3

Ich möchte ngAnimate NICHT für meine verwenden ng-if, daher wäre dies meine Lösung:

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

Posten Sie dies einfach als einen weiteren Vorschlag!


2

Ich habe eine Liste, von der die erste limit versteckt wird ng-hide="$first". Verwenden Sie die ng-enterErgebnisse li, um eine halbe Sekunde lang angezeigt zu werden, bevor Sie verschwinden.

Basierend auf der Lösung von Chris Barr sieht mein Code jetzt folgendermaßen aus:

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

Ich weiß, dass es sich um eine verspätete Antwort handelt, aber hier verwenden wir in MainController:

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

Das Problem ist jedoch, dass, wenn wir alle Animationen deaktivieren, die UI-Auswahl so konfiguriert ist opacity: 0.

Daher ist es notwendig, die Deckkraft mithilfe von CSS auf 1 zu setzen:

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

Dadurch wird die Deckkraft richtig eingestellt und die UI-Auswahl funktioniert.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.