一部の要素でnganimateを無効にする


96

私はngAnimateモジュールを使用していますが、すべて私のng-ifng-showなどは、私はいくつかの選択された要素のためngAnimateを活用したい、それに影響されます。非常に高速に表示および非表示になる要素のパフォーマンスといくつかのバグ。

ありがとう。


1
問題のサンプルコードをいくつか追加します。
cheekybastard 2014年

問題の一つは、ngAnimate力であるdisplay:block:すべてのリピーターにng-hide-add-active, .ng-hide-remove { display: block!important; }
Somatik

より良い質問は、「完全なアニメーションループを完了せずに非表示の要素に対してngAnimateが正しく機能するようにCSSを定義するにはどうすればよいですか」です。最良の答えは、以下のクリスバーからです。
Eric

回答:


53

これをCSSに追加するだけです。それが最後のルールである場合が最善です:

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

次に、no-animate無効にする要素のクラスに追加します。例:

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

2
あなたはSASSを使用している場合は、「-webkit-の移行:なしを重要!;」必要はありません
Marwen Trabelsi

15
Angularで処理されるアニメーションだけでなく、すべてのアニメーションが無効になるため、この回答は誤りです。
スタック型の2015

1
試しましたか?コードのサンプルを見てみましょう。それは私とそれを承認した6人以上の人々のために機能します
David Addoteye

2
.no-animate, .no-animate-children *子供などを対象とするルールを追加しました
キンボールロビンソン

1
@DavidAddoteyeこのソリューションは、遷移のある要素に対してng-showまたはng-ifがある場合は実行できません。つまり、httpリクエスト中にのみ表示され、リクエストが解決されると表示されなくなるローダースピナーがある場合、追加このクラスの結果はまったくアニメーションになりません!マイケルの回答はOKですが、実装するには面倒なので、コントローラーで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 2014

これはアニメーションのオプトインが必要であり、アニメーション化された要素はクラス名によって他と明確に区​​別されるため、最もエレガントなソリューションです。
Nikola M.

2
これは受け入れられる解決策です。完璧に動作し、私の日を救った!

9
使用/^(?:(?!ng-animate-disabled).)*$/して無効にannimationに正規表現ng-animate-disabledクラス。
IcanDivideBy0 2015年

素晴らしい解決策!ページごとに20行のページ分割されたテーブルがあります。ページを切り替える時間の3分の1は、使用されていないアニメーションのcssクラスを処理するブラウザーによって消費されていました。
ケビン

81

モジュールの依存関係としてモジュールngAnimateがある場合、AngularJSでアニメーションを無効にする方法は2つあります。

  1. $ animateサービスでグローバルにアニメーションを無効または有効にします。

    $animate.enabled(false);
  2. 特定の要素のアニメーションを無効にします-これは、angularがanimationstate cssクラス(ng-enterなど)を追加するための要素でなければなりません!

    $animate.enabled(false, theElement);

Angular 1.4バージョン以降、引数を逆にする必要があります:

$animate.enabled(theElement, false);

のドキュメント$animate


2
これは期待通りに特定の要素では機能しません。アニメーションをグローバルにオフにしてから、特定の要素で有効にすると、機能しません。
Kushagra Gour 2014

1
この回答を削除または編集して、実際に動作するAngularのバージョンを指定する必要があります。1.2.10の場合、AFAICTの質問の要点である特定の要素のアニメーションを選択的に有効にすることはできません。
Trindaz

オプション2が1.2.25バージョンで動作しているかどうかを誰かが知っていますか?
khorvat 2014

1
ドキュメント(docs.angularjs.org/api/ng/service/$animate)を見ると、«要素»が有効な関数に渡される最初のパラメーターであるようです。
DanielM

49

Angular animateパラダイムに従うCSSクラスを使用して、特定の要素のng-animateを無効にするには、正規表現を使用してクラスをテストするように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
私はこれが無力な行動をフィルタリングする最も正しい方法だと思います!
エドリアン

6
この回答はスクロールする価値がありました。
Jossef Harush 2017

AngularJSの最新バージョンでは、これが間違いなく問題の最良の解決策であることを確認できます。
アダムReis

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

これはかなり気の利いたアプローチであり、要素オブジェクトにアクセスする方法が常に明確であるとは限りません。他のいくつかのアプローチでは、テンプレートで定義された1つまたは複数の要素をハード参照するJavascriptでコントローラーが乱雑になると思います。これは、懸念の大きな分離のように感じます。
Mattygabe

2
$ animate.enabledでは、なぜこれがすべてのngアニメーションを無効にするのか疑問に思っている場合、パラメーターの順序が逆になります。使用すると魅力のように機能します$animate.enabled(element,false);
gss

お詫び申し上げますが、これは1.4.x +にのみ当てはまります。上記のコードは以前のバージョンでも問題ありません。
gss 2016年

19

$animate.enabled(false, $element);使用する要素では機能するng-showng-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、ここでスコアを均等にするためにもっと与えることができればいいのに
Eric

これは最も難しい答えです。cssでそれを行うことは、jsをいじることよりも優れています。
マナ2015

@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消える前に0.5秒間表示される結果を使用します。

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選択が機能します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.