일부 요소에 대해 nganimate 비활성화


96

나는 ngAnimate 모듈을 사용하고 있지만, 모든 내 ng-if, ng-show등, 그에 의해 영향을받는, 나는 몇 가지 선택 요소를 활용 ngAnimate 싶어요. 매우 빠르게 표시하고 숨기는 요소의 성능 및 일부 버그.

감사.


1
문제의 몇 가지 예제 코드를 추가하십시오.
cheekybastard

문제 중 하나는 ngAnimate display:block가 모든 리피터에 적용 된다는 것입니다 .ng-hide-add-active, .ng-hide-remove { display: block!important; }
Somatik 2015 년

더 좋은 질문은 "전체 애니메이션 루프를 완료하지 않고 숨겨진 요소에 대해 ngAnimate가 올바르게 작동하도록 CSS를 정의 할 수있는 방법"입니다. 가장 좋은 대답은 아래의 Chris Barr입니다.
에릭

답변:


53

이것을 CSS에 추가하기 만하면됩니다. 마지막 규칙 인 경우 가장 좋습니다.

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

그런 다음 no-animate비활성화하려는 요소의 클래스에 추가하십시오 . 예:

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

2
당신이 말대꾸를 사용하는 경우, 당신은 "-webkit-전환 : 없음을 중요!"필요하지 않습니다
Marwen 트라벨시

15
Angular에서 처리하는 애니메이션뿐만 아니라 모든 애니메이션을 비활성화하기 때문에이 대답은 잘못된 것입니다.
stackular

1
시도해 보셨습니까? 코드 샘플을 보겠습니다. 그것은 나를 위해 작동하고 이상 육명 그것을 승인
데이비드 Addoteye에게

2
나는 추가 .no-animate, .no-animate-children *커버 어린이 등을 규칙
킴볼 로빈슨

1
@DavidAddoteye 전환이있는 요소에 대해 ng-show 또는 ng-if가있는 경우이 솔루션은 실행 가능하지 않습니다. 내 말은 .. http 요청 중에 만 표시되고 요청이 해결 될 때 사라지는 로더 스피너가있는 경우 추가 이 클래스는 애니메이션이 전혀 발생하지 않습니다!, michael 대답은 ​​괜찮지 만 구현하기에는 너무 지루하므로 컨트롤러에서 CSS 선택기를 피해야합니다. 지시문을 만드는 것은 괜찮습니다. 그러나 Blowsie의 답변을 보면 AngularJS 팀이 이미이 문제를 처리하는 유연한 방법을 제공했음을 알 수 있습니다.;)
edrian

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
당신은 내 하루를 구했습니다. 대단히 감사합니다
gustavohenke gustavohenke 2014-08-08

애니메이션에 대한 옵트 인이 필요하고 애니메이션 요소가 클래스 이름에 따라 다른 요소와 명확하게 구별되므로 가장 우아한 솔루션입니다.
Nikola M.

2
이것이 허용되는 솔루션이어야합니다. 완벽하게 작동하고 내 하루를 구했습니다!

9
사용 /^(?:(?!ng-animate-disabled).)*$/과 해제 annimation에 정규식 ng-animate-disabled클래스입니다.
IcanDivideBy0

훌륭한 솔루션! 페이지 당 20 개의 행이있는 페이지가 매겨진 테이블이 있습니다. 페이지 전환 시간의 1/3은 사용되지 않는 애니메이션 CSS 클래스를 처리하는 브라우저에 의해 소비되었습니다.
Kevin

81

모듈에 대한 종속성으로 ngAnimate 모듈이있는 경우 AngularJS에서 애니메이션을 해제 할 수있는 두 가지 방법이 있습니다.

  1. $ animate 서비스에서 전역 적으로 애니메이션을 비활성화하거나 활성화합니다.

    $animate.enabled(false);
  2. 특정 요소에 대한 애니메이션을 비활성화합니다.이 요소는 해당 각도에 대한 요소 여야합니다. 그러면 animationstate CSS 클래스 (예 : ng-enter, ...)가 추가됩니다!

    $animate.enabled(false, theElement);

Angular 1.4 버전에서는 인수를 반대로해야합니다.

$animate.enabled(theElement, false);

에 대한 문서$animate .


2
이것은 예상대로 특정 요소에서 작동하지 않습니다. 애니메이션을 전역 적으로 끈 다음 특정 요소에서 활성화하면 작동하지 않습니다.
Kushagra Gour

1
이 답변은 실제로 작동하는 Angular 버전을 지정하기 위해 제거하거나 편집해야합니다. 1.2.10의 경우 특정 요소에 대해 애니메이션을 선택적으로 활성화하는 데는 작동하지 않습니다. 이는 AFAICT 문제의 요점입니다.
Trindaz 2014 년

옵션 2가 1.2.25 버전에서 작동하는지 아는 사람이 있습니까?
khorvat 2014 년

1
문서 ( docs.angularjs.org/api/ng/service/$animate )를 살펴보면 «element»가 활성화 된 함수에 전달되는 첫 번째 매개 변수 인 것 같습니다.
DanielM

49

Angular animate 패러다임을 따르는 CSS 클래스를 사용하여 특정 요소에 대해 ng-animate를 비활성화하려면 regex를 사용하여 클래스를 테스트하도록 ng-animate를 구성 할 수 있습니다.

구성

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

용법

ng-animate-disabledng-animate에서 무시할 요소에 클래스를 추가하기 만하면 됩니다.


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


7
나는 이것이 ngannimate 행동을 필터링하는 가장 올바른 방법이라고 생각합니다!
edrian

6
이 답변을 스크롤 할 가치가 있습니다.
Jossef Harush

최신 버전의 AngularJS를 사용하면 이것이 문제에 대한 최상의 솔루션임을 확인할 수 있습니다.
Adam Reis

44

감사합니다. 요소에 배치 할 수있는 지시문을 작성했습니다.

CoffeeScript :

myApp.directive "disableAnimate", ($animate) ->
  (scope, element) ->
    $animate.enabled(false, element)

자바 스크립트 :

myApp.directive("disableAnimate", function ($animate) {
    return function (scope, element) {
        $animate.enabled(false, element);
    };
});

이것은 매우 멋진 접근 방식이며 요소 개체에 액세스하는 방법이 항상 명확하지는 않습니다. 다른 접근 방식을 사용하면 템플릿에 정의 된 하나 또는 여러 요소를 자바 스크립트로 하드 참조하여 컨트롤러를 복잡하게 만들 수 있습니다. . 이것은 큰 관심사, 명성의 분리처럼 느껴집니다!
Mattygabe

2
매개 변수 순서는 $ animate.enabled에서 반전됩니다. 누군가 이것이 모든 애니메이션을 비활성화하는 이유를 궁금해한다면. 사용하면 매력처럼 작동합니다$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 대답을보십시오. 더 일반적이고 정확한이 문제를 처리하는 방법입니다
edrian

3

나는 않습니다 NOT 내에서 ngAnimate를 사용하려면 ng-if이 내 해결책이 될 것이다, 그래서의 :

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

다른 제안으로 이것을 게시하십시오!


2

li사용하여 첫 번째 가 숨겨진 목록 이 있습니다 ng-hide="$first". 사라지기 전에 0.5 초 동안 표시되는 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. */

0

지연된 응답이라는 것을 알고 있지만 여기서는 MainController에서 사용합니다.

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

그러나 문제는 모든 애니메이션을 비활성화하면 ui-select가 opacity: 0.

따라서 CSS를 사용하여 불투명도를 1로 설정해야합니다.

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

이렇게하면 불투명도가 제대로 설정되고 ui-select가 작동합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.