角度动画的目的是什么?


69

我一直想知道为什么我应该在CSS动画上使用Angular动画。我发现人们在使用它们之前可能会考虑的几个方面:


性能

在第一步中,我发现这个问题只与物联网服务表现方面的交易。接受的答案对我来说并不令人满意,因为它指出应该尽可能使用CSS动画,以便可以应用诸如在单独线程中运行动画之类的优化。这似乎不是事实,因为Angular文档指出

角动画建立在标准Web动画API的基础上,并在支持该动画的浏览器上本地运行。

(强调我的)

而且,当我们查看Web动画API草案时,我们发现可以对Web动画应用与表中指定的CSS相同的优化。

尽管可以使用ECMAScript通过requestAnimationFrame [HTML]来执行动画,但是这种动画的行为与声明性动画不同,就其在CSS级联中的表示方式以及可能的性能优化(例如在单独的线程上执行动画)而言。使用Web动画编程界面,可以从脚本创建与声明性动画具有相同行为和性能特征的动画

(再次强调我的)

除了IE等某些浏览器不支持Web动画外,是否有任何理由在Angular动画上使用CSS声明,反之亦然?我认为它们是可互换的性能。


更好地控制动画

这可能是Angular动画的一个参数,因为您可以暂停动画或将JS变量与其一起使用,等等,但是使用eg时也是如此。CSSanimation-play-state: pause或使用JS中指定的CSS变量,请参见说明文件

现在,我看到在JS代码中设置CSS变量可能不方便,但是在使用Angular动画时也是如此。这些通常是在@Component animations字段中声明的,除了通过动画状态数据绑定属性之外,没有访问实例字段的权限(AnimationBuilder当然,如果您不通过动画创建动画,顺便说一句也不太方便或美观) 。

另一点是,使用Web Animations API可以检查,调试或测试动画,但是我看不到Angular动画怎么可能。如果是,请您告诉我如何?如果不是这样,那么我也确实没有发现为了控制而使用Angular动画而不是CSS动画有什么好处


清洁代码

例如,我在这里阅读了一段,指出将动画与“常规”样式分开实际上是将行为和表现形式分开。确实是在样式表中声明动画来混合这些职责吗?我总是看到另一种方式,尤其是看@Component动画中的CSS规则时,让我感觉到在太多地方都有CSS声明。


那么Angular动画怎么样?

  • 从其他样式中提取动画只是一种便利实用程序,还是它带来了一些有价值的功能?
  • 使用Angular动画是否仅在特殊情况下才会奏效,还是团队选择沿袭这一惯例?

我想在这里谈谈使用Angular动画的明显优势。谢谢大家提前!


3
您是否了解Angular嵌套动画,暂存动画和状态转换?而使用简单的Web动画,这就变得相当复杂。这正是您想要构建动画Web应用程序的东西。角动画应达到类似于Android的动画水平。
软盘'18

我发现对角度动画非常着迷的是,它们可以在不同的平台上轻松重用(例如:您可以在不同的框架中使用完全相同的动画,例如普通角度2(Web应用程序),离子3,本机脚本,电子)。除此之外,请注意,您可以嵌套动画,将它们定义为过渡动画...,甚至可以将它们模块化。
briosheje

另外,我将添加框架的目标及其附带的所有内容,以提高您的生产率。
软盘'18

1
@DanMacák:关于过渡,您可以轻松定义动画状态和状态之间的过渡。除此之外,您可以直接从组件/服务设置动画状态,并跟踪动画的开始和结束事件(以及其他相关内容)。关于“嵌套”动画,我的意思是您可以以编程方式运行并行/串行动画集(请查看此文章,以解决“常见”问题:stackoverflow.com/questions/45598685/…)。
briosheje

Answers:


70

因此,我进行了一些研究,尽管我没有找到支持或反对Angular动画性能的任何理由(正如上面的问题中所述),但是有很多很好的论据可以使用Angular动画功能,这对于至少在某些情况下仅希望在表单中使用CSS的纯粹主义者。

让我列出一些有用的功能,其中每个功能对于Angular动画来说都是令人信服的。大多数可以在Angular动画文档中找到:

  1. 过渡样式-这些样式仅在从一种状态过渡到另一种状态时应用-仅在元素处于动画状态时使用,如下所示使用它们:

    transition('stateA => stateB', [style({...}), animate(100)])
    

    仅使用CSS尝试执行相同操作可能不会表现出哪个状态导致下一个状态。如果动画必须基于初始状态而最终状态相同,则可能会完全笨拙。

  2. void与国家一起:enter:leave别名(空白文档:休假和:输入文档) -让您添加或从DOM删除动画元素。

    transition('stateA => void', animate(...))
    

    这非常酷,因为以前虽然可以轻松地为添加的动画制作动画,但是删除操作更为复杂,并且需要触发动画,直到动画结束,直到从DOM删除元素之后,所有操作都使用JS。

  3. 自动属性计算 '*'文档)-允许执行传统上困难的动画,例如为具有动态高度的元素执行高度转换。此问题可能需要在元素上设置固定高度(不灵活),将max-height与调整的过渡函数一起使用(不完美)或通过JS查询元素的高度(可能导致不必要的回流)。但是,现在有了Angular,它就像这样简单:

    trigger('collapsible', [
      state('expanded', style({ height: '*' })),
      state('collapsed', style({ height: '0' })),
      transition('expanded <=> collapsed', animate(100))
    ])
    

    而且动画是平滑且“完整的”,因为元素的实际高度用于过渡。

  4. 动画回调文档)-这是CSS动画无法实现的(如果可能未使用进行模仿setTimeout),并且非常方便。用于调试。

  5. 与问题中所述不同,实际上可以在Angular动画中将实例字段用作参数,请参见此问题。我发现使用它比通过DOM API操纵CSS变量要容易得多,如MDN所示,更不用说某些浏览器的有限支持了。

如果您需要上面列出的任何功能,Angular可能是完成此任务的更好工具。同样,当一个组件中要管理许多动画时,这只是我个人的看法,我发现以Angular方式组织动画要比将它们包含在工作表中更容易,在这种情况下,也很难看到它们与各种元素状态之间的关系。 。


4
我被卖了!感谢您的研究和解释。第2点和第4点使用纯CSS进行开发非常麻烦,并且需要用一种非常优雅的方式解决它。
orlaqp

除了chrome之外,我在其他浏览器中看到了一些非常差的性能。由于ngOnInit触发,连幻灯片动画也开始掉帧。我一直在寻找使用GSAP或使用简单CSS的替代方案,但我无法提出选择。似乎您陷入了使用TypeScript嵌入CSS样式的路线动画中。怀疑其基于polyfill的代码导致了该问题。似乎有大量的处理工作会导致渲染变糟。
标记

没关系,本教程使用左/右来对vs翻译X进行动画处理。那创造了垃圾。我还注意到,如果您使用一些动画,它们似乎都在后台触发,因此也要小心。似乎只有一个触发器并通过传递数据将其路由到适当的动画会更聪明,而不是为所有的弹出,滑动,淡入淡出,溶解等过渡都设置无数个触发器。
标记
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.