Angular学习笔记:动画

news/2024/11/28 15:50:23/

本文是自己的学习笔记,主要参考资料如下。

- Angular官方文档:https://angular.io/guide/animations


  • 1、前置工作
    • 1.1、导入依赖
  • 2、代码部分
    • 2.1、有关的imports
    • 2.2、定义触发条件(trigger)
    • 2.3、定义状态(state)
    • 2.4、定义过渡细节(transition)
    • 2.5、动画绑定元素


1、前置工作

这篇文章介绍如何用Angular实现动画效果,比如划入划出,缩小变大。

1.1、导入依赖

先要在app.module.tsimport对应的包BrowserAnimationsModule

import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { AppComponent } from './app.component';
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';@NgModule({declarations: [AppComponent],imports: [BrowserModule,BrowserAnimationsModule],providers: [],bootstrap: [AppComponent]
})
export class AppModule { }

2、代码部分

这部分是一个示例,演示点击一个button后,一个div平滑地变大变小同时改变颜色。
在这里插入图片描述

2.1、有关的imports

在想要有动画效果的组件中引入下面与动画细节相关的组件,

这些组件与动画的具体效果有关,比如一个元素变化前的样子和变化后的样子,元素从A点移到B点花多少时间,恒速度移过去还是速度逐渐提升移过去,等等。

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



2.2、定义触发条件(trigger)

关于动画的部分都是定义在@Component注解中,我新建一个Component来写示例代码ng g component open-close

定义一个trigger,里面是动画的所有细节,同时我们需要为这个trigger命名,名字必须是驼峰或者中间用破折号隔开,比如backgroundColor或者background-Color

命名是需要和元素绑定,元素会通过名字知道需要执行什么动画。

可以看下面这个示例,命名了一个动画叫openClose,动画细节代码暂时省略。

@Component({selector: 'app-open-close',templateUrl: './open-close.component.html',styleUrls: ['./open-close.component.css'],animations: [trigger('openClose', [// ...]),]
})
export class OpenCloseComponent implements OnInit {
// ···
}

2.3、定义状态(state)

很多动画都可以看成从一个状态到另一个状态,或者说从状态1到状态2再到状态3,总之最小可以拆分成两个状态的变化。

比如从A点移到B点,高度从400缩小到300,从紫色变成红色等等都属于状态变化,当然这些可以一起发生。

在本示例中,div的高度将缩小,并且从黄色变成紫色;也会反过来。

所以下面的代码在trigger中定义两个状态,分别命名为openclose。其中也描述了两个状态的style。

@Component({selector: 'app-open-close',templateUrl: './open-close.component.html',styleUrls: ['./open-close.component.css'],animations: [trigger('openClose', [state('open', style({height: '200px',opacity: 1,backgroundColor: 'yellow'state('closed', style({height: '100px',opacity: 0.8, backgroundColor: 'blue'}))]),]
})
export class OpenCloseComponent implements OnInit {
// ...
}



2.4、定义过渡细节(transition)

光定义了状态还不够,因为动画需要平滑过渡才能有更好的用户体验。从状态1刷地一下直接变到状态2就感受不到动画效果,所以我们还需要定义过渡细节。

在下面的示例中,定义了两个过渡细节,一个是从open => closed,这个状态变化过程花费1s;另一个是从closed => open,花费0.5s。

@Component({selector: 'app-open-close',templateUrl: './open-close.component.html',styleUrls: ['./open-close.component.css'],animations: [trigger('openClose', [// ...state('open', style({height: '200px',opacity: 1,backgroundColor: 'yellow'})),state('closed', style({height: '100px',opacity: 0.8, backgroundColor: 'blue'})),transition('open => closed', [animate('1s')]),transition('closed => open', [animate('0.5s')]),]),]
})
export class OpenCloseComponent implements OnInit {
// ...
}

2.5、动画绑定元素

我们可以在元素的属性中加上[@triggerName]="expression? state1: state2"

其中triggerName就是之前定义的trigger,这里应该写成[@openTrigger]

等号后面的表达式则是决定元素的状态变化。在这个示例中是通过按钮实现状态转变。

之前我们定义了动画的两个状态,分别叫openclosed,点击按钮,状态从open转到closed;再点击按钮,状态从closed转到open

所以这里的expression可以写成[@openClose]="isOpen ? 'open' : 'closed'" ,其中isOpen是变量,可以通过按钮点击事件改编。

下面是html的代码

<nav><button type="button" (click)="toggle()">Toggle Open/Close</button>
</nav><div [@openClose]="isOpen ? 'open' : 'closed'" class="open-close-container"><p>The box is now {{ isOpen ? 'Open' : 'Closed' }}!</p>
</div>

在这里插入图片描述

下面是完整的ts代码。

import { animate, state, style, transition, trigger } from '@angular/animations';
import { Component, OnInit } from '@angular/core';@Component({selector: 'app-open-close',templateUrl: './open-close.component.html',styleUrls: ['./open-close.component.css'],animations: [trigger('openClose', [// ...state('open', style({height: '200px',opacity: 1,backgroundColor: 'yellow'})),state('closed', style({height: '100px',opacity: 0.8, backgroundColor: 'blue'})),transition('open => closed', [animate('1s')]),transition('closed => open', [animate('0.5s')]),]),]
})
export class OpenCloseComponent implements OnInit {constructor() { }ngOnInit(): void {}isOpen = true;toggle() {this.isOpen = !this.isOpen;}}

http://www.ppmy.cn/news/105092.html

相关文章

【2023】华为OD机试真题全语言-题目0241-组合出合法最小数

题目0241-组合出合法最小数 题目描述 给一个数组,数组里面哦都是代表非负整数的字符串,将数组里所有的数值排列组合拼接起来组成一个数字,输出拼接成的最小的数字。 输入描述 一个数组,数组不为空,数组里面都是代表非负整数的字符串,可以是0开头,例如:["13&qu…

oracle--常用维护语句

1、sqlpus 连接 [rootdb-server ~]$su - oracle ##切换oracle用户 [oracledb-server ~]$ sqlplus /nolog ##启动客户端进程 SQL>conn zyl/zyl2022 ##普通用户登录 SQL>conn / as sysdba ##管理员登录 Connected. SQL> 2、启动或关闭数据库 SQL>startup…

SQL server入门一【简单介绍与简单建表】

SQLserver登录方式 Windows身份验证 用户名登录 通常登录名为sa&#xff0c;密码为下载时设置的密码 SQL server建立一个数据库 数据库中建表存储数据(输入命令建表) 数据库的简单介绍与概念 含义 可以对数据进行存储和管理的软件以及数据本身统称为数据库 组成 数据库由表…

用CSS来做一个动画案例

今天来做这么一个案例 添加一个动画实现上下渐变滚动的效果 首先还是我们HTML部分&#xff0c;一个大盒子装着五个子元素 下面别在意&#xff0c;之前写的时候看到有个网站有这么个注解我就复制了下来哈哈哈 <div class"loader"><div class"slider&…

vuex最详细笔记总结,这些东西你真的了解吗?

1.vuex是啥&#xff1f; 简单来说就是管理数据的,相当于一个仓库,里面存放着各种需要共享的数据,所有组件都可以拿到里面的数据 2.什么时候使用vuex 1.多个组件依赖于同一状态 2.来自不同组件的行为需要变更同一状态 总之&#xff0c;就是vuex作为一个仓库&#xff0c;任何组件…

Otsu阈值法原理及实现

文章目录 Otsu算法简介Otsu 算法的逻辑源码实现 欢迎访问个人网络日志&#x1f339;&#x1f339;知行空间&#x1f339;&#x1f339; Otsu算法简介 Otsu阈值法发表于1979年&#xff0c;论文为A threshold selection method from gray level histograms,作者是日本东京大学的…

WEB开发之敏感数据处理(一) - JPA敏感数据自动加解密

实现原理 JPA提供AttributeConverter接口用于实现数据库和实体之间数据的转换。利用这个特性可以在转换时进行加解密&#xff0c;从而实现自动加解密的功能 定义一个 Converter 定义一个SensitiveConverter 实现JPA的 AttributeConverter<String, String>convertToDat…

oop练习题

public static void main(String[] args) { // &#xff08;三&#xff09;无返回&#xff0c;有参数的方法&#xff1a; // 设置当前狗的姓名的方法&#xff0c;要求传入狗的新姓名&#xff0c;修改当前姓名。 // 设置当前狗的性别的方法&#xff0c;要求传入狗的新性别&am…