typescript Angular (4,5,6,7)-ngIf上滑入滑出动画的简单示例

envsm3lx  于 2022-12-24  发布在  TypeScript
关注(0)|答案(4)|浏览(133)

**Angular4 a a a a a a滑入 * 和 * 滑出 * 容器元素的最低限度和原生方式是什么?

例如:

<div ngIf="show">
    <!-- Content -->
</div>

show变为 true 时,* 滑入 * 内容(从上到下,就像jQuery. slideDown()一样)。
show变为 false 时,Slide Out 内容(适合于具有缓出效果)。

e1xvtsh3

e1xvtsh31#

首先是一些代码,然后是解释。描述这个的官方文档是here

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

@Component({
  ...
  animations: [
    trigger('slideInOut', [
      transition(':enter', [
        style({transform: 'translateY(-100%)'}),
        animate('200ms ease-in', style({transform: 'translateY(0%)'}))
      ]),
      transition(':leave', [
        animate('200ms ease-in', style({transform: 'translateY(-100%)'}))
      ])
    ])
  ]
})

在模板中:

<div *ngIf="visible" [@slideInOut]>This element will slide up and down when the value of 'visible' changes from true to false and vice versa.</div>

我发现有Angular 的方式有点棘手的把握,但一旦你理解了它,它相当容易和强大。
人类语言中的动画部分:

  • 我们将此动画命名为“slideInOut”。
  • 当添加元素(:enter)时,我们执行以下操作:
    • 〉立即将元素向上移动100%(从其自身),以显示在屏幕外。
    • 〉然后动画translateY值,直到我们在0%,在那里的元素将自然。
  • 移除元素后,将translateY值(当前为0)设置为-100%(屏幕外)的动画。

我们使用的缓动功能是缓入,在200毫秒内,你可以根据自己的喜好改变它。

wixjitnu

wixjitnu2#

我回答了一个非常相似的问题,这里有一个方法:
首先,创建一个文件,在其中定义动画并将其导出。只是为了让它在app.component.ts中更清晰
在下面的例子中,我使用了div的最大高度,从0px(隐藏时)到500px,但是您可以根据需要更改它。
此动画使用状态(输入和输出),当我们单击按钮时,将切换状态,这将运行动画。

    • 动画. ts**
import { trigger, state, style, transition,
    animate, group, query, stagger, keyframes
} from '@angular/animations';

export const SlideInOutAnimation = [
    trigger('slideInOut', [
        state('in', style({
            'max-height': '500px', 'opacity': '1', 'visibility': 'visible'
        })),
        state('out', style({
            'max-height': '0px', 'opacity': '0', 'visibility': 'hidden'
        })),
        transition('in => out', [group([
            animate('400ms ease-in-out', style({
                'opacity': '0'
            })),
            animate('600ms ease-in-out', style({
                'max-height': '0px'
            })),
            animate('700ms ease-in-out', style({
                'visibility': 'hidden'
            }))
        ]
        )]),
        transition('out => in', [group([
            animate('1ms ease-in-out', style({
                'visibility': 'visible'
            })),
            animate('600ms ease-in-out', style({
                'max-height': '500px'
            })),
            animate('800ms ease-in-out', style({
                'opacity': '1'
            }))
        ]
        )])
    ]),
]

然后在你的app.组件中,我们导入动画并创建切换动画状态的方法。

    • 应用程序组件. ts**
import { SlideInOutAnimation } from './animations';

@Component({
  ...
  animations: [SlideInOutAnimation]
})
export class AppComponent  {
  animationState = 'in';

  ...

  toggleShowDiv(divName: string) {
    if (divName === 'divA') {
      console.log(this.animationState);
      this.animationState = this.animationState === 'out' ? 'in' : 'out';
      console.log(this.animationState);
    }
  }
}

下面是app. component. html的外观:

<div class="wrapper">
  <button (click)="toggleShowDiv('divA')">TOGGLE DIV</button>
  <div [@slideInOut]="animationState" style="height: 100px; background-color: red;">
  THIS DIV IS ANIMATED</div>
  <div class="content">THIS IS CONTENT DIV</div>
</div>
  • slideInOut * 指动画中定义的动画触发器。ts

下面是我创建的StackBlitz示例:https://angular-muvaqu.stackblitz.io/
边注:如果出现错误并要求您添加 * BrowserAnimationsModule *,只需将其导入您的app. module. ts:

import { BrowserAnimationsModule } from '@angular/platform-browser/animations';

@NgModule({
  imports: [ ..., BrowserAnimationsModule ],
  ...
})
11dmarpk

11dmarpk3#

实际上,当show变量为真时,要使用的最小Angular (如原始问题中所要求的)只是向DOM元素添加一个类,并通过CSS执行动画/过渡。
因此,您的最小角代码为:

<div class="box-opener" (click)="show = !show">
    Open/close the box
</div>

<div class="box" [class.opened]="show">
    <!-- Content -->
</div>

使用此解决方案时,您需要为转换创建CSS规则,如下所示:

.box {
    background-color: #FFCC55;
    max-height: 0px;
    overflow-y: hidden;
    transition: ease-in-out 400ms max-height;
}

.box.opened {
    max-height: 500px;
    transition: ease-in-out 600ms max-height;
}

如果您有浏览器兼容性问题,只需记住在transition中添加供应商前缀。
参见the example here

b5lpy0ml

b5lpy0ml4#

投票最多的答案是不实现真实的的滑入/滑出(或滑下/滑上),如:
1.它没有在height属性上做一个软过渡,在时间为零时,元素已经有了100%的高度,在它下面的元素上产生了一个突然的小故障。
1.当向外/向上滑动时,该元素执行translateY(-100%),然后突然消失,导致其下方的元素出现另一个小故障。
您可以像这样实现滑入和滑出:

我的组件.ts

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

@Component({
  ...
  animations: [
    trigger('slideDownUp', [
      transition(':enter', [style({ height: 0 }), animate(500)]),
      transition(':leave', [animate(500, style({ height: 0 }))]),
    ]),
  ],
})

我的组件.html

<div @slideDownUp *ngIf="isShowing" class="box">
  I am the content of the div!
</div>

我的组件.scss

.box {
  overflow: hidden;
}

相关问题