[解決済み] Angularのアニメーションの目的は何ですか?
質問
以前から不思議に思っていたのですが なぜCSSアニメーションではなくAngularアニメーションを使うべきなのか? . 私はそれらを使用する前に考慮すべきいくつかの領域を参照してください。
パフォーマンス
最初のステップで、私はこれを見つけました 質問 を見つけました。これは物事のパフォーマンス面のみを扱っています。受理された回答は私にとって満足のいくものではありません。 可能な限りCSSアニメーションを使用し、別スレッドでアニメーションを実行するような最適化が適用できるようにすべきです。 . これは正しいとは思えません。 Angular ドキュメント の状態だからです。
Angularのアニメーションは 標準の Web Animations API の上に構築されています。 の上に構築され、それをサポートするブラウザ上でネイティブに実行されます。
(強調)
そして、私たちが見るとき ウェブアニメーションAPIドラフト を見ると、シートで指定された CSS と同じ最適化が Web Animation に適用できることがわかります。
ECMAScript を使用して requestAnimationFrame [HTML] を使用してアニメーションを実行することは可能ですが、そのようなアニメーションは、CSS カスケードでの表現方法や、別スレッドでのアニメーション実行などのパフォーマンス最適化の点で宣言型アニメーションと異なる動作をします。 ウェブアニメーションの使用 プログラミングインタフェースでは アニメーションを作成することができます。 スクリプトから 宣言的なアニメーションと同じ動作と性能特性を持つアニメーション .
(再度強調)
IE のような一部のブラウザがウェブアニメーションをサポートしていないことを除けば は、AngularのアニメーションよりもCSSの宣言を使う理由、またはその逆はあるのでしょうか? 私は、パフォーマンス的に交換可能だと考えています。
アニメーションをより細かく制御できる
これはAngularのアニメーションの引数のように見えるかもしれません、なぜならあなたは
アニメーションを一時停止する
や JS 変数の使用などができるため、Angular のアニメーションのための議論に見えるかもしれませんが、同じことが、例えば CSS の
animation-play-state: pause
を使ったり
CSS変数
JSで指定する場合は
ドキュメントを参照してください。
.
JSコードでCSS変数を設定するのは不便かもしれませんが、Angularアニメーションを使用している間も同じことが言えます。これらは通常
@Component
animations
フィールドで宣言され、アニメーションの状態データバインドプロパティを除いて、インスタンスフィールドにアクセスすることはできません (もし、アニメーションの作成を
AnimationBuilder
を介してアニメーションを作成しない場合、もちろん、これもあまり便利でも美しくもありません)。
もう一つのポイントは、Web Animations API を使って、以下のようなことが可能だということです。 検査、デバッグ、テスト しかし、私はこれがAngularアニメーションでどのように可能であるかわかりません。もし可能であれば、方法を教えていただけませんか?そうでない場合、私は本当に 制御のためにCSSのものよりもAngularのアニメーションを使用する利点も見当たりません。 .
よりクリーンなコード
私は、例えば
はこちら
では、アニメーションを通常のスタイルから分離することは、実際には動作と体裁を分離することであると述べています。
スタイルシートでアニメーションを宣言することは、本当にそれらの責任を混同しているのでしょうか?
私はそれが常に他の方法であると見ました。
@Component
のアニメーションのCSSルールを見ていると、CSSの宣言が一箇所多くなりすぎているような気がしました。
では、Angularのアニメーションはどうなのでしょうか?
- アニメーションを他のスタイルから抽出するための便利なユーティリティに過ぎないのか、それとも機能的に価値のあるものをもたらしてくれるのか?
- Angularのアニメーションの使用は、特別な場合にのみ利益をもたらすのでしょうか、それとも、チームがそれを使ってすべての道を行くことを選択する慣習なのでしょうか?
Angularのアニメーションを使用する具体的な利点についてお聞きしたいです。前もってみんなに感謝します。
どのように解決するのですか?
そこで、私はいくつかの研究を行い、Angularアニメーションのパフォーマンスについて賛成も反対も見つけられませんでしたが(上記の質問ですでに述べられているように)。 Angularのアニメーションを使用することは、機能的に非常に良い議論です。 これは、少なくとも特定のケースでは、CSSをシートの中にだけ持っていたいという純粋主義者には十分なものでしょう。
Angularのアニメーションの説得力を高める便利な機能をいくつか挙げてみましょう。それらのほとんどは Angular アニメーションドキュメント :
-
遷移スタイル - これらのスタイルは、ある状態から別の状態への遷移時にのみ適用されます - 要素がアニメーションしている間のみ。
transition('stateA => stateB', [style({...}), animate(100)])
同じことをCSSだけでやろうとすると、どの前の状態が次の状態につながっているかという点で表現力が乏しくなるかもしれません。また、最初の状態に応じてアニメーションを変えなければならないのに、最後の状態が同じであれば、まったく不格好になる可能性があります。
-
は
void
の状態で、一緒に:enter
であり:leave
エイリアス ( void ドキュメント , :leaveと:enterのドキュメント ) - DOM に追加または削除される要素をアニメーション化することができます。transition('stateA => void', animate(...))
以前は、追加をアニメーション化するのは簡単でしたが、削除はもっと複雑で、アニメーションを起動し、終了まで待ち、その後でDOMから要素を削除する必要があり、すべてJSで行う必要がありましたので、これは非常にクールです。
-
プロパティの自動計算
'*'
( ドキュメント ) - 従来は困難だった、以下のようなアニメーションの実行を可能にします。 のような従来は困難であったアニメーションの実行を可能にします。 . この問題は、要素に固定の高さを設定するか(柔軟性に欠ける)、調整された遷移関数で最大高さを使用するか(完璧ではない)、JSで要素の高さを問い合わせる必要がありました(不要なリフローを引き起こす可能性があります)。しかし、Angularを使えばこれほど簡単なことはありません。trigger('collapsible', [ state('expanded', style({ height: '*' })), state('collapsed', style({ height: '0' })), transition('expanded <=> collapsed', animate(100)) ])
そして、アニメーションは滑らかで "完全な" になっています。 実際の の高さが遷移に使用されるためです。
-
アニメーションのコールバック ( ドキュメンテーション ) - これは CSS アニメーションでは不可能だったことです (もしかしたら
setTimeout
でエミュレートできないとしても)、これはCSSアニメーションでは不可能なことで、例えばデバッグのために便利です。 -
質問で述べたのとは異なり Angularのアニメーションでインスタンスフィールドをパラメータとして使用することは可能です。 を参照してください。 この質問 . 私はそれがはるかに簡単に使用することができますDOM APIを介してCSS変数を操作するよりも、次のとおりです。 この MDN で のように、DOM API を使って CSS 変数を操作するよりもはるかに簡単です。
上記のような機能が必要な場合、Angularはそのタスクのためのより良いツールになりえます。また、コンポーネント内で管理する多くのアニメーションがあるとき、これは私の個人的な意見ですが、私は、アニメーションをシートの中に持つよりも、Angularの方法で整理する方が簡単であると思います。
関連
-
[解決済み] JavaScriptで "use strict "は何をするのか、その根拠は?
-
[解決済み] let "と "var "の使い分けは?
-
[解決済み] JavaScriptでメールアドレスを検証するのに最適な方法は何ですか?
-
[解決済み] JavaScriptでオブジェクトをディープクローンする最も効率的な方法は何ですか?
-
[解決済み] とは何ですか! (not not)演算子とは何ですか?
-
[解決済み] callとapplyの違いは何ですか?
-
[解決済み] varキーワードの目的と、どのような場合に使用する(または省略する)べきですか?
-
[解決済み] Node.jsのmodule.exportsの目的と使い方を教えてください。
-
[解決済み】JavaScript版sleep()とは?)
-
[解決済み] Node.jsのES6クラスをrequireで作る
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] JSのDateからDay名
-
[解決済み] jqueryでdivの要素がオーバーフローしていないかチェックする
-
[解決済み] Angularjs - 現在の日付を表示する
-
[解決済み] なぜ "use strict "はパフォーマンスを10倍向上させるのか?
-
[解決済み] Chart.jsを使ってドーナツチャートの中にテキストを追加するには?
-
[解決済み] javascript の関数から `undefined` と `null` のどちらを返すのが良いのでしょうか?
-
[解決済み] Chromeの拡張機能開発にWebStormを使用するにはどうすればよいですか?
-
[解決済み] jqueryはjavascriptのライブラリなのかフレームワークなのか?[クローズド]
-
[解決済み] javascriptのキャンバスで画像をリサイズする (スムーズ)
-
[解決済み] JavaScriptの文字列プリミティブとStringオブジェクトの違いは何ですか?