【问题标题】:Animations: opacity property not being applied动画:未应用不透明度属性
【发布时间】:2019-07-08 07:49:38
【问题描述】:

我制作了一个非常简单的动画:点击一个 div,它应该折叠/展开并显示不同的内容。

我已经嘲笑了这里的行为:https://stackblitz.com/edit/animations-opacity-issue?file=src/app/app.component.ts

当您单击 div 时,它会按预期折叠,但青色 div 应该淡出,而深红色 div 应该淡入。

目前没有工作,我不知道为什么。

import { Component } from '@angular/core';
import { animate, query, state, style, transition, trigger } from '@angular/animations';

@Component({
  selector: 'my-app',
  template: `
<div class="menu-container" [@menuSize]="isMenuExpanded" (click)="isMenuExpanded = !isMenuExpanded">
  <div style="background-color: teal" *ngIf="isMenuExpanded" @menuVisibility></div>
  <div style="background-color: crimson" *ngIf="!isMenuExpanded" @menuVisibility></div>
</div>
  `,
  styles: [`
.menu-container {
  height: 100%;
  background: coral;
  width: 300px;
  position: relative;
}

.menu-container div {
  height: 200px;
  width: 100%;
  position: absolute;
}
`],
    animations: [
    trigger('menuSize', [
      state('true', style({ width: '*' })),
      state('false', style({ width: '100px' })),
      transition('true <=> false', [
        animate('500ms ease-in-out'),
      ]),
    ]),
    trigger('menuVisibility', [
      state('*', style({ opacity: '1' })),
      state('void', style({ opacity: '0' })),
      transition(':enter', [animate('300ms ease-in-out')]),
      transition(':leave', [animate('300ms 500ms ease-in-out')])
    ])
  ],
})
export class AppComponent  {
  isMenuExpanded = true;
}

【问题讨论】:

    标签: css angular animation angular-animations


    【解决方案1】:

    您必须使用animateChild (https://angular.io/api/animations/animateChild),因此在相同的关键帧中进行动画处理

    动画孩子

    在动画中执行查询到的内部动画元素 顺序。

    group (https://angular.io/api/animations/group) 你的动画,所以它们同时执行

    定义要并行运行的动画步骤列表。

    代码:

     transition('true <=> false', group([
            query('@menuVisibility', [
              animateChild()
            ], {optional: true}),        
            animate('3s'),
          ]))
    

    这是您的示例,带有 cahgnes:https://stackblitz.com/edit/animations-opacity-issue-exycbu:

    import { Component } from '@angular/core';
    import { animate, query, state, style, transition, trigger, animateChild, group } from '@angular/animations';
    
    @Component({
      selector: 'my-app',
      template: `
    <div class="menu-container" [@menuSize]="isMenuExpanded" (click)="isMenuExpanded = !isMenuExpanded">
      <div style="background-color: teal" *ngIf="isMenuExpanded" @menuVisibility>teal</div>
      <div style="background-color: crimson" *ngIf="!isMenuExpanded" @menuVisibility>crimson</div>
    </div>
      `,
      styles: [`
    .menu-container {
      height: 100%;
      background: coral;
      width: 300px;
      position: relative;
    }
    
    .menu-container div {
      height: 200px;
      width: 100%;
      position: absolute;
    }
    `],
        animations: [
        trigger('menuSize', [
          state('true', style({ width: '300px' })),
          state('false', style({ width: '100px' })),
          transition('true <=> false', group([
            query('@menuVisibility', [
              animateChild()
            ], {optional: true}),        
            animate('3s'),
          ]))
        ]),
        trigger('menuVisibility', [
          state('*', style({ opacity: '1' })),
          state('void', style({ opacity: '0' })),
          transition(':enter', [animate('3s')]),
          transition(':leave', [animate('3s')])
        ])
      ],
    })
    export class AppComponent  {
      isMenuExpanded = true;
    }
    

    在这篇笔记中,我在 github 中发现了一些处理嵌套动画的错误:

    所以它接缝,具有相同触发器的动画嵌套是错误的。

    我从这里得到了灵感:https://docs.w3cub.com/angular/api/animations/animatechild/ 和这里:Angular 5 parent and child animations not working at the same time

    总之这很痛苦....

    【讨论】:

    • 抱歉,我没有收到关于您的回答的通知。我看到它确实有效,谢谢你的信息,甚至不知道animateChild属性!
    • 在深度嵌套动画的情况下,我需要多次使用animateChild,还是一次就够了?(如果你已经知道答案)
    • 您好,感谢您的认可。不,我不知道,也不确定动画是否打算如此深入地嵌套。我在 Angular 演示网站上找到的所有示例都没有嵌套。不确定在这种情况下,外部动画库(例如 Tweenmax)是否会更好。在那里,我创建了一个动画横幅,它根据时间轴移动、褪色等不同的元素。不知道它与 angular 的结合如何...
    猜你喜欢
    • 1970-01-01
    • 2010-09-25
    • 2015-06-26
    • 2017-06-26
    • 2011-08-27
    • 2012-09-09
    • 2017-10-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多