Отключить nganimate для некоторых элементов

Я использую модуль ngAnimate, но все мои ng-if, ng-show и т.д. зависят от этого, я хочу использовать ngAnimate для некоторых выбранных элементов. Для производительности и некоторых ошибок в элементах, которые показывают и скрывают очень быстро.

спасибо.

Ответ 1

Просто добавьте это в свой CSS. Лучше, если это последнее правило:

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

затем добавьте no-animate в класс элемента, который вы хотите отключить. Пример:

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

Ответ 2

Если вы хотите включить анимацию для определенных элементов (в отличие от их отключения для определенных элементов), вы можете использовать $animateProvider для настройки элементов с определенным именем класса (или регулярное выражение) для анимации.

В приведенном ниже коде будут включены анимации для элементов, имеющих класс angular-animate:

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

Вот пример разметки, включающий класс angular-animate для включения анимации:

<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 пример заимствован и изменен из этого блога, где только первый фильтр имеет анимацию (из-за того, что класс angular-animate).

Обратите внимание, что я использую angular-animate в качестве примера, и он полностью настраивается с помощью функции .classNameFilter.

Ответ 3

Есть два способа вырезать анимации в AngularJS, если у вас есть модуль ngAnimate в зависимости от вашего модуля:

  • Отключите или включите анимацию по всему миру в службе $animate:

    $animate.enabled(false);
    
  • Отключите анимацию для определенного элемента - это должен быть элемент для этого angular, который добавит классы css анимации (например, ng-enter,...)!

    $animate.enabled(false, theElement);
    

По версии angular 1.4 вы должны изменить аргументы:

$animate.enabled(theElement, false);

Документация для $animate: https://docs.angularjs.org/api/ng/service/ $animate

Ответ 4

спасибо, я написал директиву, которую вы можете разместить на элементе

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

Ответ 5

Чтобы отключить ng-animate для определенных элементов, используя класс CSS, который следует за анимированной парадигмой Angular, вы можете настроить ng-animate для проверки класса с помощью regex.

Config

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

Использование

Просто добавьте класс ng-animate-disabled к любым элементам, которые вы хотите игнорировать ng-animate.


Кредит http://davidchin.me/blog/disable-nganimate-for-selected-elements/

Ответ 6

Я обнаружил, что $animate.enabled(false, $element); будет работать для элементов, которые используют ng-show или ng-hide, но он не будет работать для элементов, которые используют ng-if по какой-то причине! Решение, которое я в конечном итоге использовал, состояло в том, чтобы просто сделать все это в CSS, что я узнал из этот поток на 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;
  }
}

Ответ 7

У меня есть список, из которого первый li скрыт с помощью ng-hide="$first". Использование ng-enter приводит к тому, что li отображается на полсекунды перед исчезновением.

На основе решения Chris Barr мой код теперь выглядит следующим образом:

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. */

Ответ 8

Я хочу НЕ использовать ngAnimate на моем ng-if, так что это было бы моим решением:

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

Просто опубликуйте это как другое предложение!

Ответ 9

Я знаю, что это отложенный ответ, но здесь мы используем в MainController:

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

Но проблема в том, что когда мы отключили все анимации, ui-select настроен на opacity: 0.

Итак, необходимо установить непрозрачность в 1 с помощью CSS:

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

Это правильно установит непрозрачность, и ui-select будет работать.