angular 2 ngIf 和 CSS 过渡/动画

新手上路,请多包涵

我希望一个 div 使用 css 从 angular 2 的右侧滑入。

   <div class="note" [ngClass]="{'transition':show}" *ngIf="show">
    <p> Notes</p>
  </div>
  <button class="btn btn-default" (click)="toggle(show)">Toggle</button>

如果我只使用 [ngClass] 来切换类并利用不透明度,我工作得很好。但是我不希望从一开始就渲染该元素,所以我首先用 ngIf “隐藏”它,但是过渡将不起作用。

 .transition{
  -webkit-transition: opacity 1000ms ease-in-out,margin-left 500ms ease-in-out;
  -moz-transition: opacity 1000ms ease-in-out,margin-left 500ms ease-in-out;
  -ms-transition: opacity 1000ms ease-in-out,margin-left 500ms ease-in-out ;
  -o-transition: opacity 1000ms ease-in-out,margin-left 500ms ease-in-out;
  transition: opacity 1000ms ease-in-out,margin-left 500ms ease-in-out;
  margin-left: 1500px;
  width: 200px;
  opacity: 0;
}

.transition{
  opacity: 100;
  margin-left: 0;
}

原文由 Han Che 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 932
2 个回答

更新 4.1.0

普朗克

另请参阅 https://github.com/angular/angular/blob/master/CHANGELOG.md#400-rc1-2017-02-24

更新 2.1.0

普朗克

有关更多详细信息,请参阅 angular.io 上的动画

import { trigger, style, animate, transition } from '@angular/animations';

@Component({
  selector: 'my-app',
  animations: [
    trigger(
      'enterAnimation', [
        transition(':enter', [
          style({transform: 'translateX(100%)', opacity: 0}),
          animate('500ms', style({transform: 'translateX(0)', opacity: 1}))
        ]),
        transition(':leave', [
          style({transform: 'translateX(0)', opacity: 1}),
          animate('500ms', style({transform: 'translateX(100%)', opacity: 0}))
        ])
      ]
    )
  ],
  template: `
    <button (click)="show = !show">toggle show ({{show}})</button>

    <div *ngIf="show" [@enterAnimation]>xxx</div>
  `
})
export class App {
  show:boolean = false;
}

原来的

*ngIf 当表达式变为 false 时,从 DOM 中删除元素。您不能在不存在的元素上进行转换。

改为使用 hidden

 <div class="note" [ngClass]="{'transition':show}" [hidden]="!show">

原文由 Günter Zöchbauer 发布,翻译遵循 CC BY-SA 4.0 许可协议

根据最新的 angular 2 文档 ,您可以为“进入和离开”元素设置动画(如 angular 1)。

简单淡入淡出动画示例:

在相关的@Component 添加:

 animations: [
  trigger('fadeInOut', [
    transition(':enter', [   // :enter is alias to 'void => *'
      style({opacity:0}),
      animate(500, style({opacity:1}))
    ]),
    transition(':leave', [   // :leave is alias to '* => void'
      animate(500, style({opacity:0}))
    ])
  ])
]

不要忘记添加导入

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

相关组件的 html 元素应如下所示:

 <div *ngIf="toggle" [@fadeInOut]>element</div>

在这里 构建了 幻灯片和淡入淡出动画 的示例。

关于’void’和’*‘的 解释

  • voidngIf 设置为 false 时的状态(当元素未附加到视图时适用)。
  • * - 可以有很多动画状态(在文档中阅读更多)。 * 状态作为“通配符”优先于所有状态(在我的示例中,这是 ngIf 设置为 true 时的状态)。

注意(取自角度文档):

在应用程序模块内 额外 声明, import { BrowserAnimationsModule } from '@angular/platform-browser/animations';

Angular 动画建立在标准 Web Animations API 之上,并在支持它的浏览器上本地运行。对于其他浏览器,需要 polyfill。从 GitHub 获取 web-animations.min.js 并将其添加到您的页面。

原文由 Asaf Hananel 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题