最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解Angular路由動畫及高階動畫函數(shù)

 更新時間:2021年05月21日 15:07:20   作者:starof  
本文主要講解了Angular的路由動畫和高階動畫函數(shù),對此感興趣的同學,可以把代碼親自實驗一下,理解其原理。

一、路由動畫

路由動畫需要在host元數(shù)據(jù)中指定觸發(fā)器。動畫注意不要過多,否則適得其反。

內容優(yōu)先,引導用戶去注意到某個內容。動畫只是輔助手段。

在router.animate.ts中定義一個進場動畫,一個離場動畫。

因為進場動畫和離場動畫用的特別頻繁,有一個別名叫:enter和:leave。

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

export const slideToRight = trigger('routeAnim',[
    state('void',style({'position':'fixed','width':'100%','height':'100%'})),
    state('*',style({'position':'fixed','width':'100%','height':'80%'})),
    transition('void => *',[
        style({transform:'translateX(-100%)'}),
        animate('.5s ease-in-out', style({transform:'translateX(0)'}))
    ]),
    transition('* => void',[
        style({transform:'translateX(0)'}),
        animate('.5s ease-in-out', style({transform:'translateX(100%)'}))
    ]),
]);

在project-list中使用路由動畫。

import { Component, OnInit , HostBinding } from "@angular/core";
import { MatDialog } from "@angular/material";
import { NewProjectComponent } from "../new-project/new-project.component";
import { InviteComponent } from '../invite/invite.component';
import { ConfirmDialogComponent } from '../../shared/confirm-dialog/confirm-dialog.component';
import {slideToRight} from '../../animate/router.animate'

@Component({
  selector: "app-project-list",
  templateUrl: "./project-list.component.html",
  styleUrls: ["./project-list.component.scss"],
  animations:[
    slideToRight
  ]
})
export class ProjectListComponent implements OnInit {
  @HostBinding('@routeAnim') state;

  projects = [
    {
      name: "企業(yè)協(xié)作平臺",
      desc: "這是一個企業(yè)內部項目",
      coverImg: "assets/images/covers/0.jpg"
    },
    {
      name: "自動化測試項目",
      desc: "這是一個企業(yè)內部項目",
      coverImg: "assets/images/covers/2.jpg"
    }
  ];
  constructor(private dialog: MatDialog) { }

  ngOnInit() { }

  openNewProjectDialog() {
    // this.dialog.open(NewProjectComponent,{data:'this is a dialog'});
    const dialogRef = this.dialog.open(NewProjectComponent, {
      data: { title: '新建項目' }
    });
    dialogRef.afterClosed().subscribe((result) => {
      console.log(result);
    });
  }

  lauchInviteDialog() {
    const dialogRef = this.dialog.open(InviteComponent);
  }

  lauchUpdateDialog() {
    const dialogRef = this.dialog.open(NewProjectComponent, {
      data: { title: '編輯項目' }
    });
  }

  lauchConfimDialog() {
    const dialogRef = this.dialog.open(ConfirmDialogComponent, {
      data: { title: '編輯項目', content: '您確認刪除該項目嗎?' }
    });
  }
}

在task-home中使用路由動畫。

import { Component, OnInit , HostBinding } from "@angular/core";
import { NewTaskComponent } from "../new-task/new-task.component";
import { MatDialog } from "@angular/material";
import { CopyTaskComponent } from "../copy-task/copy-task.component";
import { ConfirmDialogComponent } from "../../shared/confirm-dialog/confirm-dialog.component";
import { NewTaskListComponent } from "../new-task-list/new-task-list.component";
import {slideToRight} from '../../animate/router.animate';

@Component({
  selector: "app-task-home",
  templateUrl: "./task-home.component.html",
  styleUrls: ["./task-home.component.scss"],
  animations:[
    slideToRight
  ]
})
export class TaskHomeComponent implements OnInit {
  constructor(private dialog: MatDialog) {}

  @HostBinding('@routeAnim') state;
  ngOnInit() {}

  launchNewTaskDialog() {
    // this.dialog.open(NewTaskComponent);
    const dialogRef = this.dialog.open(NewTaskComponent, {
      data: { title: "新建任務" }
    });
  }
  lauchCopyTaskDialog() {
    const dialogRef = this.dialog.open(CopyTaskComponent, {
      data: { lists: this.lists }
    });
  }

  launchUpdateTaskDialog(task) {
    const dialogRef = this.dialog.open(NewTaskComponent, {
      data: { title: "修改任務", task: task }
    });
  }

  launchConfirmDialog() {
    const dialogRef = this.dialog.open(ConfirmDialogComponent, {
      data: { title: "刪除任務列表", content: "您確定要刪除該任務列表嗎?" }
    });
  }

  launchEditListDialog() {
    const dialogRef = this.dialog.open(NewTaskListComponent, {
      data: { title: "更改列表名稱" }
    });
    dialogRef.afterClosed().subscribe(result => console.log(result));
  }
  launchNewListDialog() {
    const dialogRef = this.dialog.open(NewTaskListComponent, {
      data: { title: "新建列表名稱" }
    });
    dialogRef.afterClosed().subscribe(result => console.log(result));
  }
  lists = [
    {
      id: 1,
      name: "待辦",
      tasks: [
        {
          id: 1,
          desc: "任務一: 去星巴克買咖啡",
          completed: true,
          priority: 3,
          owner: {
            id: 1,
            name: "張三",
            avatar: "avatars:svg-11"
          },
          dueDate: new Date(),
          reminder: new Date()
        },
        {
          id: 2,
          desc: "任務一: 完成老板布置的PPT作業(yè)",
          completed: false,
          priority: 2,
          owner: {
            id: 2,
            name: "李四",
            avatar: "avatars:svg-12"
          },
          dueDate: new Date()
        }
      ]
    },
    {
      id: 2,
      name: "進行中",
      tasks: [
        {
          id: 1,
          desc: "任務三: 項目代碼評審",
          completed: false,
          priority: 1,
          owner: {
            id: 1,
            name: "王五",
            avatar: "avatars:svg-13"
          },
          dueDate: new Date()
        },
        {
          id: 2,
          desc: "任務一: 制定項目計劃",
          completed: false,
          priority: 2,
          owner: {
            id: 2,
            name: "李四",
            avatar: "avatars:svg-12"
          },
          dueDate: new Date()
        }
      ]
    }
  ];
}

定義路由

<mat-list-item [routerLink]="['/project']"> 
    <mat-icon mat-list-icon svgIcon="projects"></mat-icon>
    <h4 mat-line>項目首頁</h4>
    <p mat-line mat-subheader> 查看您的所有項目</p>
  </mat-list-item>
  <mat-list-item [routerLink]="['/task']"> 
    <mat-icon mat-list-icon svgIcon="projects"></mat-icon>
    <h4 mat-line>任務首頁</h4>
    <p mat-line mat-subheader> 查看您的所有項目</p>
  </mat-list-item>

注意:一定要用HostBinding形式。

二、Group

用于同時進行一組動畫變換

group([animate(...),animate(...)...])接收一個數(shù)組,數(shù)組里寫多個動畫。

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

export const slideToRight = trigger('routeAnim',[
    state('void',style({'position':'fixed','width':'100%','height':'80%'})),
    state('*',style({'position':'fixed','width':'100%','height':'80%'})),
    transition(':enter',[
        style({transform:'translateX(-100%)',opacity:'0'}),
        group([
            animate('.5s ease-in-out', style({transform:'translateX(0)'})),
            animate('.3s ease-in', style({opacity:1}))
        ])
    ]),
    transition(':leave',[
        style({transform:'translateX(0)',opacity:'1'}),
        group([
            animate('.5s ease-in-out', style({transform:'translateX(100%)'})),
            animate('.3s ease-in', style({opacity:0}))
        ])
    ]),
]);

三、Query & Stagger

Query用于父節(jié)點尋找子節(jié)點,把動畫應用到選中元素。非常強大。

Stagger指定有多個滿足Query的元素,每個的動畫之間有間隔。

做一個示例:新建的時候同時新建2個項目,兩個新建出的項目的動畫依次產生,第一個完成后才開始第二個。

建立list.animate.ts

進場動畫,先隱藏起來,通過stagger間隔1000s做一個1s的動畫。

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

export const listAnimation = trigger('listAnim', [
    transition('* => *', [
      query(':enter', style({opacity: 0}), { optional: true }), //加入optional為true,后面的狀態(tài)動畫都是可選的
      query(':enter', stagger(1000, [
        animate('1s', style({opacity: 1}))
      ]), { optional: true }),
      query(':leave', style({opacity: 1}), { optional: true }),
      query(':leave', stagger(1000, [
        animate('1s', style({opacity: 0}))
      ]), { optional: true })
    ])
  ]);

在project_list中使用

應用query動畫一般都是跟*ngFor在一起的,需要外面套一層div。

<div class="container" [@listAnim]="projects.length">
  <app-project-item *ngFor="let project of projects" [item]="project"
  class="card"
  (onInvite)="lauchInviteDialog()"
  (onEdit)="lauchUpdateDialog()"
  (onDelete)="lauchConfimDialog(project)">
  </app-project-item>
</div>
<button class="ab-buttonmad-fab fab-button" mat-fab type="button" (click)="openNewProjectDialog()">
  <mat-icon>add</mat-icon>
</button>

修改對應的css

// :host{
//     display: flex;
//     flex-direction: row;
//     flex-wrap: wrap;
// }

//把host改為div
.container{
    display: flex;
    flex-direction: row;
    flex-wrap: wrap;
}

修改一下component

import { Component, OnInit , HostBinding } from "@angular/core";
import { MatDialog } from "@angular/material";
import { NewProjectComponent } from "../new-project/new-project.component";
import { InviteComponent } from '../invite/invite.component';
import { ConfirmDialogComponent } from '../../shared/confirm-dialog/confirm-dialog.component';
import {slideToRight} from '../../animate/router.animate'
import { listAnimation } from '../../animate/list.animate';
import { projection } from '@angular/core/src/render3';

@Component({
  selector: "app-project-list",
  templateUrl: "./project-list.component.html",
  styleUrls: ["./project-list.component.scss"],
  animations:[
    slideToRight,listAnimation  //第一步,導入listAnimation
  ]
})
export class ProjectListComponent implements OnInit {
  @HostBinding('@routeAnim') state;

  //第二步,改造一下數(shù)組,加id
  projects = [
    {
      id:1,
      name: "企業(yè)協(xié)作平臺",
      desc: "這是一個企業(yè)內部項目",
      coverImg: "assets/images/covers/0.jpg"
    },
    {
      id:2,
      name: "自動化測試項目",
      desc: "這是一個企業(yè)內部項目",
      coverImg: "assets/images/covers/2.jpg"
    }
  ];
  constructor(private dialog: MatDialog) { }

  ngOnInit() { }

  //第三步,新增元素時hard code一下
  openNewProjectDialog() {
    // this.dialog.open(NewProjectComponent,{data:'this is a dialog'});
    const dialogRef = this.dialog.open(NewProjectComponent, {
      data: { title: '新建項目' }
    });
    dialogRef.afterClosed().subscribe((result) => {
      console.log(result);
      this.projects = [...this.projects, 
        {id:3,name:'一個新項目',desc:'這是一個新項目',coverImg:"assets/images/covers/3.jpg"},
        {id:4,name:'又一個新項目',desc:'這是又一個新項目',coverImg:"assets/images/covers/4.jpg"}]
    });
  }

  lauchInviteDialog() {
    const dialogRef = this.dialog.open(InviteComponent);
  }

  lauchUpdateDialog() {
    const dialogRef = this.dialog.open(NewProjectComponent, {
      data: { title: '編輯項目' }
    });
  }

  //第四步,改造一下刪除項目
  lauchConfimDialog(project) {
    const dialogRef = this.dialog.open(ConfirmDialogComponent, {
      data: { title: '刪除項目', content: '您確認刪除該項目嗎?' }
    });
    dialogRef.afterClosed().subscribe(result=>{
      console.log(result);
      this.projects=this.projects.filter(p=>p.id!=project.id);
    });
  }
}

Stagger使得在多個元素時候,動畫交錯開,而不是一起。

以上就是詳解Angular路由動畫及高階動畫函數(shù)的詳細內容,更多關于Angular路由動畫及高階動畫函數(shù)的資料請關注腳本之家其它相關文章!

相關文章

  • AngularJS中ng-class用法實例分析

    AngularJS中ng-class用法實例分析

    這篇文章主要介紹了AngularJS中ng-class用法,結合實例形式分析了ng-class的功能、使用方法與相關注意事項,需要的朋友可以參考下
    2017-07-07
  • AngularJS中的Promise詳細介紹及實例代碼

    AngularJS中的Promise詳細介紹及實例代碼

    這篇文章主要介紹了AngularJS中的Promise詳細介紹及實例代碼的相關資料,Promise是一種模式,以同步操作的流程形式來操作異步事件,避免了層層嵌套,可以鏈式操作異步事件,需要的朋友可以參考下
    2016-12-12
  • Ionic + Angular.js實現(xiàn)圖片輪播的方法示例

    Ionic + Angular.js實現(xiàn)圖片輪播的方法示例

    圖片輪播在我們日常開發(fā)中是再熟悉不過的了,下面這篇文章主要給大家介紹了Ionic + Angular實現(xiàn)圖片輪播的方法,文中給出了詳細的示例代碼供大家參考學習,需要的朋友們下面來一起看看吧。
    2017-05-05
  • Angular實踐之將Input與Lifecycle轉換成流示例詳解

    Angular實踐之將Input與Lifecycle轉換成流示例詳解

    這篇文章主要為大家介紹了Angular實踐之將Input與Lifecycle轉換成流示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-02-02
  • angular4 獲取wifi列表中文顯示亂碼問題的解決

    angular4 獲取wifi列表中文顯示亂碼問題的解決

    這篇文章主要介紹了angular4 獲取wifi列表中文顯示亂碼問題的解決,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-10-10
  • angular將html代碼輸出為內容的實例

    angular將html代碼輸出為內容的實例

    今天小編就為大家分享一篇angular將html代碼輸出為內容的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-09-09
  • AngularJs導出數(shù)據(jù)到Excel的示例代碼

    AngularJs導出數(shù)據(jù)到Excel的示例代碼

    本篇文章主要介紹了AngularJs導出Excel的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-08-08
  • 淺談angularjs中響應回車事件

    淺談angularjs中響應回車事件

    下面小編就為大家?guī)硪黄獪\談angularjs中響應回車事件。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-04-04
  • Angular實現(xiàn)一個簡單的多選復選框的彈出框指令實例

    Angular實現(xiàn)一個簡單的多選復選框的彈出框指令實例

    下面小編就為大家?guī)硪黄狝ngular實現(xiàn)一個簡單的多選復選框的彈出框指令實例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-04-04
  • Angular項目如何使用攔截器?httpClient?請求響應處理

    Angular項目如何使用攔截器?httpClient?請求響應處理

    這篇文章主要介紹了Angular項目簡單使用攔截器httpClient請求響應處理,目前我的Angular版本是Angular?17.3,版本中實現(xiàn)請求和響應的攔截處理了,這種機制非常適合添加如身份驗證頭、錯誤統(tǒng)一處理、日志記錄等功能,需要的朋友可以參考下
    2024-06-06

最新評論

攀枝花市| 龙井市| 绥棱县| 游戏| 龙门县| 沅陵县| 新蔡县| 无锡市| 烟台市| 石景山区| 万荣县| 宜兰市| 共和县| 长沙市| 安陆市| 邻水| 武邑县| 遂平县| 平南县| 交口县| 老河口市| 榆中县| 通化县| 天长市| 浏阳市| 延津县| 陇川县| 丹阳市| 将乐县| 汕头市| 抚州市| 林口县| SHOW| 喀什市| 怀集县| 临武县| 宁国市| 万安县| 集安市| 西安市| 当雄县|