可以对垫树进行动画处理吗? (角材料)

时间:2019-08-27 10:49:16

标签: angular tree angular-material angular-animations

我正在使用Angular Materials的mat-tree(https://material.angular.io/components/tree/overview)。在扩展父树节点时,我想为子树节点的外观和消失设置动画。 这是我希望动画效果如何的一个示例:

tree animation

我知道Angular提供了一种用于仿真的功能,但是我仍然找不到如何对mat-tree进行动画处理。

是否可以对Angular Material的垫树进行动画处理?还是如果我想要那种动画,我是否不得不编写自己的树菜单?

2 个答案:

答案 0 :(得分:5)

按照接受的答案中的方法通过垂直滑动子节点的动画来完成此操作,您可以使用嵌套树。 Stackblitz

将动画添加到组件中

  @Component({
    selector: 'tree-nested-overview-example',
    templateUrl: 'tree-nested-overview-example.html',
    styleUrls: ['tree-nested-overview-example.css'],
    animations:[
          trigger('slideVertical', [
        state(
          '*',
          style({
            height: 0
          })
        ),
        state(
          'show',
          style({
            height: '*'
          })
        ),
        transition('* => *', [animate('400ms cubic-bezier(0.25, 0.8, 0.25, 1)')])
      ])
    ]
  })

将动画应用于包含子节点的元素:

<mat-nested-tree-node *matTreeNodeDef="let node; when: hasChild">
  <li>
    <div class="mat-tree-node">
      <button mat-icon-button matTreeNodeToggle
              [attr.aria-label]="'toggle ' + node.name">
        <mat-icon class="mat-icon-rtl-mirror">
          {{treeControl.isExpanded(node) ? 'expand_more' : 'chevron_right'}}
        </mat-icon>
      </button>
      {{node.name}}
    </div>
    <ul  [@slideVertical]="treeControl.isExpanded(node) ? 'show' : null">
      <ng-container matTreeNodeOutlet></ng-container>
    </ul>
  </li>
</mat-nested-tree-node>

隐藏元素上的溢出

.example-tree ul {
  overflow: hidden;
}

答案 1 :(得分:2)

它只是将动画添加到标签mat-tree-node 您的动画可以像

 animations: [

    trigger('simpleFade', [
      transition(':enter', [
        style({ opacity:0 }),
        animate(350)
      ])])]

但是,如果您不想为主树设置动画,则必须使用诸如

 animations: [

    trigger('simpleFade', [
      transition('*=>1', [
        style({ opacity:0 }),
        animate(350)
      ])])]

然后您使用[@simpleFade]="node.level?1:0"

<mat-tree [dataSource]="dataSource" [treeControl]="treeControl">
<!--see that you only want the animation when becomes 1, so check the level-->
  <mat-tree-node *matTreeNodeDef="let node" matTreeNodePadding 
                      [@simpleFade]="node.level?1:0">
    <button mat-icon-button disabled></button>
    {{node.name}}
  </mat-tree-node>
<!--see that you only want the animation when becomes 1, so check the level-->
  <mat-tree-node *matTreeNodeDef="let node;when: hasChild" matTreeNodePadding 
                       [@simpleFade]="node.level?1:0">
    <button mat-icon-button matTreeNodeToggle
            [attr.aria-label]="'toggle ' + node.name">
      <mat-icon class="mat-icon-rtl-mirror">
        {{treeControl.isExpanded(node) ? 'expand_more' : 'chevron_right'}}
      </mat-icon>
    </button>
    {{node.name}}
  </mat-tree-node>
</mat-tree>

请参见stackblitz