Angular.js: ng-if ведет себя странно с анимацией бесконечных ключевых кадров CSS

Созданный на 3 янв. 2014  ·  3Комментарии  ·  Источник: angular/angular.js

Относится к https://github.com/angular/angular.js/issues/4818

См. Следующий Plunker: http://plnkr.co/edit/i1DJ6ejtuHVFHty9jxfe?p=preview

Элемент <div class="box" ng-if="showBox"> имеет 5-секундную бесконечную анимацию для постоянно меняющегося фона. Когда значение showBox переключается, анимация элемента начинается заново и не удаляется из DOM до тех пор, пока не пройдут все 5 секунд, несмотря на то, что анимации входа / выхода не определены.

Еще более проблематично: если вы переключаете значение несколько раз до завершения анимации (несколько раз щелкните флажок), одновременно отображаются несколько копий элемента.

ngAnimate moderate bug

Самый полезный комментарий

Проблема в том, что ngAnimate считает, что ваша бесконечная анимация существует для всех используемых анимационных событий (таких как вход, выход и т. Д.). И поскольку это бесконечная анимация, события CSS никогда не запускаются до тех пор, пока не пройдет последний обратный отсчет, то есть через 7,5 секунд (5 x 1,5 == 7,5).

Вам нужно будет указать ng-animate не анимировать бесконечную фоновую анимацию, переопределив класс .ng-animate CSS в элементе и отменив анимацию ключевых кадров.

http://plnkr.co/edit/fq7ZEO7tDnqLmavHoBfQ?p=preview

.box.ng-animate {
  -webkit-animation: none 0s;
  animation: none 0s;
}

К сожалению, определение стилей и классов CSS в JavaScript сильно ограничено. В более ранних версиях AngularJS у нас было правило, согласно которому вы можете определять анимацию / переход CSS только в свойстве анимации (например, .ng-enter, .ng-leave и т. Д.), Но это вызывало больше проблем, чем решало. Так что в этом случае вам нужно сделать наоборот.

PS. Все, что вам нужно, это префикс -webkit- и стандартные свойства animation поскольку все другие поставщики отказались от своих префиксов.

Все 3 Комментарий

Проблема в том, что ngAnimate считает, что ваша бесконечная анимация существует для всех используемых анимационных событий (таких как вход, выход и т. Д.). И поскольку это бесконечная анимация, события CSS никогда не запускаются до тех пор, пока не пройдет последний обратный отсчет, то есть через 7,5 секунд (5 x 1,5 == 7,5).

Вам нужно будет указать ng-animate не анимировать бесконечную фоновую анимацию, переопределив класс .ng-animate CSS в элементе и отменив анимацию ключевых кадров.

http://plnkr.co/edit/fq7ZEO7tDnqLmavHoBfQ?p=preview

.box.ng-animate {
  -webkit-animation: none 0s;
  animation: none 0s;
}

К сожалению, определение стилей и классов CSS в JavaScript сильно ограничено. В более ранних версиях AngularJS у нас было правило, согласно которому вы можете определять анимацию / переход CSS только в свойстве анимации (например, .ng-enter, .ng-leave и т. Д.), Но это вызывало больше проблем, чем решало. Так что в этом случае вам нужно сделать наоборот.

PS. Все, что вам нужно, это префикс -webkit- и стандартные свойства animation поскольку все другие поставщики отказались от своих префиксов.

Круто, спасибо за обходной путь.

Функция одновременного копирования нескольких копий по-прежнему кажется мне ошибкой: я пишу свой код в предположении, что элемент, использующий ng-if , либо присутствует один раз, либо отсутствует вообще, и я ожидал, что framework, чтобы он не сломался так легко из-за непреднамеренной ошибки новичка. Пожалуйста, поправьте меня, если я неправильно понял, как работает ng-if (или ng-switch ).

Множественные копии были там, потому что анимация продолжалась. А в $ animate есть анимация catch-all для ключевых кадров / переходов, которая происходит после истечения срока действия * 1.5. Вот почему они исчезают через мгновение.

Ваш код ng-if правильный. И да, это возможно только тогда, когда это правда. Но внутренние компоненты создают новую копию элемента каждый раз, когда выражение снова становится истинным. Но поскольку анимация висит на более старом элементе, она еще не была удалена, пока не будет обработана вся анимация.

И ng-switch и ng-if работают одинаково. Только ng-switch имеет несколько элементов вместо одного.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги