Angular 动画

angular animation现在是angular默认之外的一个官方组件库,在angular2的时候它是作为核心组件库的一部分,到了angular4的时候为了减小核心库的体积,就把它单独移出了核心组件,但是这并不说明它不重要,angular动画是angular应用中重要的组成部分,而且它也是官方内建提供的支持,只不过不在angular core核心组件里了,

安装动画库:

cnpm i --save @angular/animations

安装完之后要在app.module.ts文件中导入
这里写图片描述

导入动画模块之后在app.component.ts文件中会有一个animations的元数据,元数据里面会规定好一些触发器,触发器的名字会在响应的元素中模板当中 ,@后面跟的是触发器的名字。

import { environment } from '../environments/environment';
import { Component } from '@angular/core';
import { OverlayContainer } from '@angular/material';
import { trigger,state,transition,style,animate} from '@angular/animations';
@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.scss'],
  animations: [
    trigger('square',
      [
        state('green', style({ 'background-color': 'green','height':'100px','transform':'translateX(0)' })),
        state('red', style({ 'background-color': 'red','height':'50px','transform':'translateX(100%)' })),
        transition('green => red', animate('0.2s 1s')),
        transition('red => green', animate(500))
      ]
    )
  ]
})
export class AppComponent {

  squareState='red';
  darkTheme = false;

  constructor(private oc: OverlayContainer) { 

  }

  swichTheme(dark) {
    this.darkTheme = dark.checked;
    this.oc.themeClass = dark ? 'myapp-dark-theme' : null;
  }

  onClick() {
    this.squareState = this.squareState==='red' ? 'green' : 'red';
  }
}

 <div class="square" [@square]="squareState" (click)="onClick()"></div>

animations元数据的要素:
它会定义一个触发器,当然你可以在animations当中定义多个触发器,触发器就是我规定好一个动画,这个动画由 state,transition这两个基本元素来构成,动画就是从一个状态(state)迁移(state)到另一个状态,transition用来说明这个状态的迁移是什么样的,以什么速度,什么时间来迁移。animate那个函数是用来辅助transition的,animate就是说以什么样的形式来迁移。
animate函数有三个参数,最后一个参数是缓动函数(缓动函数是指动画效果在执行时的速度,使其看起来更加真实)

W3C的Web Animation标准暂时无法支持所有的cubic-bezier函数

帧-就是动画中最小单位的单幅影像画面。
关键帧-物体运动或变化中的关键动作所处的那一帧

用关键帧实现的栗子:(主要用到keyframes方法)

import { environment } from '../environments/environment';
import { Component } from '@angular/core';
import { OverlayContainer } from '@angular/material';
import { trigger,state,transition,style,animate,keyframes} from '@angular/animations';
@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.scss'],
  animations: [
    trigger('square',
      [
        state('green', style({ 'background-color': 'green','height':'100px','transform':'translateY(-100%)' })),
        state('red', style({ 'background-color': 'red','height':'100px','transform':'translateY(100%)' })),
        transition('green => red', animate('0.8s ease-in')),
        transition('red => green', animate(5000, keyframes([
          style({ 'transform': 'translateY(100%)' }),
          style({ 'transform': 'translateY(98%)' }),
          style({ 'transform': 'translateY(95%)' }),
          style({ 'transform': 'translateY(90%)' }),
          style({ 'transform': 'translateY(80%)' }),
          style({ 'transform': 'translateY(60%)' }),
          style({'transform':'translateY(30%)'}),
          style({ 'transform': 'translateY(0%)' }),
          style({ 'transform': 'translateY(-10%)' }),
          style({ 'transform': 'translateY(-5%)' }),
          style({ 'transform': 'translateY(-2%)' }),
          style({ 'transform': 'translateY(0%)' }),
          style({ 'transform': 'translateY(10%)' }),
          style({ 'transform': 'translateY(150%)' }),
          style({ 'transform': 'translateY(-15%)' }),
          style({ 'transform': 'translateY(-40%)' }),
          style({ 'transform': 'translateY(80%)' }),
          style({ 'transform': 'translateY(90%)' }),
          style({ 'transform': 'translateY(95%)' }),
          style({ 'transform': 'translateY(100%)' }),
        ])))
      ]
    )
  ]
})
export class AppComponent {

  squareState='red';
  darkTheme = false;

  constructor(private oc: OverlayContainer) { 

  }

  swichTheme(dark) {
    this.darkTheme = dark.checked;
    this.oc.themeClass = dark ? 'myapp-dark-theme' : null;
  }

  onClick() {
    this.squareState = this.squareState==='red' ? 'green' : 'red';
  }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值