вимкнути nganimate для деяких елементів


96

Я використовую модуль ngAnimate, але це впливає на всі мої ng-if, ng-showтощо, я хочу використовувати ngAnimate для деяких вибраних елементів. Для продуктивності та деяких помилок в елементах, які дуже швидко відображаються та приховуються.

Дякую.


1
Додайте приклад коду випуску.
cheekybastard

Одне з питань полягає в тому, що ngAnimate діє display:blockна всі ваші ретранслятори:ng-hide-add-active, .ng-hide-remove { display: block!important; }
Somatik

Кращим запитанням було б: "як я можу визначити свій CSS, щоб ngAnimate працював правильно для елементів, які приховані без завершення повного циклу анімації". Найкраща відповідь від Кріса Барра нижче.
Ерік

Відповіді:


53

Просто додайте це у свій CSS. Найкраще, якщо це буде останнє правило:

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

потім додайте no-animateдо класу елемент, який потрібно відключити. Приклад:

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

2
Якщо ви використовуєте sass, вам не потрібен перехід "-webkit: none!
Important

15
Зверніть увагу, що ця відповідь неправильна, оскільки ВІН ВІДМІНЮЄ ВСІ АНІМАЦІЇ, а не лише ті, якими обробляє Angular.
stackular

1
Ви пробували? дозвольте мені побачити зразок вашого коду. Це працює для мене та для шести людей, які схвалили його
Девід Аддотей

2
Я додав .no-animate, .no-animate-children *правило, що стосується дітей тощо
Кімбол Робінсон

1
@DavidAddoteye це рішення не життєздатне, якщо у вас є ng-show або ng-if над елементом з переходом .. я маю на увазі .. якщо у мене є навантажувач, який відображається лише під час запиту http і зникає, коли запит вирішено, додаючи цей клас не призведе до жодної анімації !, відповідь Майкла нормальна, але занадто нудна для реалізації, і вам слід намагатися уникати селекторів css у контролерах. Створення директиви - це нормально, але, подивившись на відповідь Blowsie, ви виявите, що команда AngularJS вже надала гнучкий спосіб вирішити цю проблему;)
Едріан

106

Якщо ви хочете увімкнути анімацію для певних елементів (на відміну від їх вимкнення для певних елементів), ви можете використовувати $ 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функції.


5
Ти врятував мій день. Щиро дякую
густавохенке

Це найелегантніше рішення, оскільки воно вимагає відмови від анімації, а анімовані елементи чітко відрізняються від інших за назвою класу.
Nikola M.

2
Це має бути прийнятим рішенням. Працює ідеально і врятував мій день!

9
використовуйте /^(?:(?!ng-animate-disabled).)*$/регулярний вираз, щоб вимкнути анімацію з ng-animate-disabledкласом.
IcanDivideBy0

Чудове рішення! У мене є стовпчикова таблиця з 20 рядками на сторінку. Третина часу для перемикання сторінок витрачалася браузером, який обробляв анімаційні класи css, які навіть не використовувались.
Кевін

81

Існує два способи скасування анімації в AngularJS, якщо у вас є модуль ngAnimate як залежність від вашого модуля:

  1. Вимкніть або ввімкніть анімацію глобально на службі $ animate:

    $animate.enabled(false);
  2. Вимкніть анімацію для певного елемента - це повинен бути елемент, для якого angular додасть класи анімації стану css (наприклад, ng-enter, ...)!

    $animate.enabled(false, theElement);

Починаючи з версії Angular 1.4, ви повинні змінити аргументи:

$animate.enabled(theElement, false);

Документація для$animate .


2
Це не працює з конкретними елементами, як очікувалося. Якщо я вимкну анімацію глобально, а потім увімкну її на одному конкретному елементі, це не спрацює.
Кушагра Гур

1
Цю відповідь слід видалити або відредагувати, щоб вказати, над якою версією Angular він насправді працює. У 1.2.10 він, безумовно, не працює для вибіркового включення анімації для певних елементів, що є суттю питання AFAICT.
Trindaz,

Хтось знає, чи працює варіант 2 у версії 1.2.25?
хорват

1
Просто переглядаючи документацію ( docs.angularjs.org/api/ng/service/$animate ), здається, що «елемент» є першим параметром, який передається увімкненій функції.
DanielM

49

Щоб вимкнути ng-animate для певних елементів, використовуючи клас CSS, який слідує парадигмі Angular animate, ви можете налаштувати ng-animate для тестування класу за допомогою регулярного виразу.

Налаштування

    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/


7
Я думаю, що це найбільш правильний спосіб фільтрування ngannimate поведінки!
Едріан

6
Варто було прокрутити цю відповідь.
Йосеф Харуш

Я можу підтвердити, що з останньою версією AngularJS це, безумовно, найкраще рішення проблеми.
Адам Рейс

44

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

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

Це досить витончений підхід, не завжди зрозуміло, як отримати доступ до об’єкта елемента, і з деякими іншими підходами, я боюся, я б захаращував свої контролери Javascript жорстким посиланням на один або кілька елементів, визначених у шаблоні . Це відчуває себе великим розділенням проблем, слава!
Mattygabe

2
Порядок параметрів змінюється в $ animate.enabled, якщо хтось задається питанням, чому це відключає всю анімацію ng. Працює як шарм, якщо ви використовуєте$animate.enabled(element,false);
gss

Я переконуюсь, що це стосується лише 1.4.x +, наведений вище код правильний для попередніх версій.
gss

19

Я виявив, що це $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;
  }
}

У моєму випадку було так, що при завантаженні ngAnimate такий клас, як .loading.ng-hide, залишатиметься на екрані до завершення повного циклу анімації. Це найчистіша відповідь, оскільки в основному це просто подача правильної конфігурації до ngAnimate та її нормальне використання. Це переважно, якщо його неправильно налаштувати, а потім відключити. Тож +1 для вас, хоч би я міг дати більше, щоб вирівняти рахунок тут.
Ерік

Це найбільш хитра відповідь. Робити це з css - це краще, ніж возитися з js.
manas

Будь ласка, подивіться на відповідь @Blowsie, це більш загальний і правильний спосіб вирішити це
Едріан,

3

Я НЕ хочу використовувати ngAnimate на своєму ng-if, тому це буде моє рішення:

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

Просто розміщуючи це як чергову пропозицію!


2

У мене є список, з якого перший liприхований за допомогою ng-hide="$first". Використання ng-enterрезультатів на liзображенні відображається за півсекунди до зникнення.

На основі рішення Кріса Барра мій код тепер виглядає так:

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

Я знаю, що це відкладена відповідь, але тут ми використовуємо в MainController:

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

Але проблема в тому, що коли ми вимикаємо всі анімації, ui-select налаштовується на opacity: 0.

Отже, необхідно встановити непрозорість на 1 за допомогою CSS:

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

Це дозволить правильно встановити непрозорість, і ui-select буде працювати.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.