Angular LAB:动画列表并使用 AnimationBuilder 实现命令式动画

angular lab:动画列表并使用 animationbuilder 实现命令式动画

您知道 angular 包含一个复杂的动画系统吗?当我想要在元素进入屏幕或被破坏时为其设置动画时,我发现它特别有用!

此外,您还可以使用 animationbuilder 来强制播放、暂停或停止一些自定义动画!让我们看看它是如何完成的。

创建列表

在本练习中,我们首先创建一个列表,如下所示:

@component({  selector: 'app-root',  standalone: true,  template: `        
    @for (user of users(); track user.id) {
  • {{ user.name }}
  • }
`,})export class appcomponent { users = signal([ { id: math.random(), name: 'michele' } ]); adduser() { this.users.update(users => [...users, { id: math.random(), name: 'new user' }]); }}

请注意,我们添加了一个将用户添加到列表中的按钮!

动画列表

现在,如果我们想要为要添加的新用户设置动画该怎么办?首先,我们想通过在主配置中提供它来告诉 angular 我们想要使用它的动画系统:

import { provideanimationsasync } from '@angular/platform-browser/animations/async';bootstrapapplication(appcomponent, {  providers: [    provideanimationsasync(),  ]});

然后,我们可以创建我们的动画:

import { trigger, transition, style, animate } from '@angular/animations';const fadeinanimation = trigger('fadein', [  transition(':enter', [    style({ transform: 'scale(0.5)', opacity: 0 }),    animate(      '.3s cubic-bezier(.8, -0.6, 0.2, 1.5)',       style({ transform: 'scale(1)', opacity: 1 })    )  ])])

有了这些帮助者,我们:

创建了一个名为 fadein 的动画触发器添加了元素进入屏幕时的过渡应用了初始样式立即开始动画,这将导致新的样式应用于元素

更多关于如何编写动画的信息,可以参考官方指南,非常棒!

现在让我们将此动画应用到列表中的每个元素:

@component({  ...,  template: `        
    @for (user of users(); track user.id) {
  • {{ user.name }}
  • }
`, // also, add the animation to the metadata of the component animations: [fadeinanimation]})

现在,当添加新项目时,它会变得动画!我们的第一步已经完成。

请注意,为了让我们的动画正常工作,angular 必须跟踪 for 中的每个元素,因为否则它最终可能会在更新模板时重新创建相同的元素,从而导致不必要的结果动画。这是免费的新控制流语法,因为 track 属性是强制性的,但如果您使用旧版本的 angular 和 *ngfor 指令,则必须使用 trackby 选项,如下所示:

  • {{ user.name }}
  • // a class method in your component:trackbyuserid(index, user: user) {  return user.id;}

    现在,让我们向列表中添加另一种类型的动画。

    动画生成器

    让我们为列表的每个元素添加一个按钮:

  • {{ user.name }}
  • 想象一下:我们想让元素在按下按钮时闪烁。那就太酷了!这就是 animationbuilder 服务的用武之地。

    首先,让我们创建一个将应用于每个元素的指令。在此指令中,我们将注入 elementref 和 a​​nimationbuilder:

    import { animationbuilder, style, animate } from '@angular/animations';@directive({  selector: '[blink]',  exportas: 'blink', // <--- notice  standalone: true})export class blinkdirective {  private animationbuilder = inject(animationbuilder);  private el = inject(elementref);}

    请注意,我们导出了指令:我们将在几秒钟内找到原因。

    然后,我们可以创建一个像这样的自定义动画:

    export class blinkdirective {  ...  private animation = this.animationbuilder.build([    style({ transform: 'scale(1)', opacity: 1 }),    animate(150, style({ transform: 'scale(1.1)', opacity: .5 })),    animate(150, style({ transform: 'scale(1)', opacity: 1 }))  ]);}

    我们使用的函数与之前的动画中使用的函数相同,只是样式不同。

    现在我们要创建一个播放器,它将在我们的元素上执行动画:

    export class blinkdirective {  ...  private player = this.animation.create(this.el.nativeelement);}

    现在让我们公开一个真正启动动画的方法!

    export class blinkdirective {  ...  start() {    this.player.play();  }}

    只剩下一步了:我们必须导入指令,将其应用到我们的元素,使用模板变量获取它,并在按下按钮时调用该方法!

    @component({  selector: 'app-root',  standalone: true,  template: `        
      @for (user of users(); track user.id) {
    • {{ user.name }}
    • }
    `, imports: [blinkdirective], animations: [ fadeinanimation ]})

    我们可以获取指令的实例并将其放入局部变量中,因为我们之前使用exportas导出了指令。这就是关键部分!

    现在,尝试单击按钮:该元素将正确设置动画!

    练习已经完成,但这只是冰山一角! animationplayer 有很多命令可用于停止、暂停和恢复动画。非常酷!

    interface animationplayer {  ondone(fn: () => void): void;  onstart(fn: () => void): void;  ondestroy(fn: () => void): void;  init(): void;  hasstarted(): boolean;  play(): void;  pause(): void;  restart(): void;  finish(): void;  destroy(): void;  reset(): void;  setposition(position: number): void;  getposition(): number;  parentplayer: animationplayer;  readonly totaltime: number;  beforedestroy?: () => any;}

    如果您想使用它,这是我们的完整示例:只需将其放入 main.ts 文件中并查看它的实际效果!

    import { Component, signal, Directive, ElementRef, inject } from '@angular/core';import { bootstrapApplication } from '@angular/platform-browser';import { trigger, transition, style, animate, AnimationBuilder } from '@angular/animations';import { provideAnimationsAsync } from '@angular/platform-browser/animations/async';interface User {  id: number;  name: string;}@Directive({  selector: '[blink]',  exportAs: 'blink',  standalone: true})export class BlinkDirective {  private animationBuilder = inject(AnimationBuilder);  private el = inject(ElementRef);  private animation = this.animationBuilder.build([    style({ transform: 'scale(1)', opacity: 1 }),    animate(150, style({ transform: 'scale(1.1)', opacity: .5 })),    animate(150, style({ transform: 'scale(1)', opacity: 1 }))  ]);  private player = this.animation.create(this.el.nativeElement);  start() {    this.player.play();  }}const fadeInAnimation = trigger('fadeIn', [  transition(':enter', [    style({ transform: 'scale(0.5)', opacity: 0 }),    animate(      '.3s cubic-bezier(.8, -0.6, 0.2, 1.5)',       style({ transform: 'scale(1)', opacity: 1 })    )  ])])@Component({  selector: 'app-root',  standalone: true,  template: `        
      @for (user of users(); track user.id) {
    • {{ user.name }}
    • }
    `, imports: [BlinkDirective], animations: [ fadeInAnimation ]})export class App { users = signal([ { id: Math.random(), name: 'Michele' } ]); addUser() { this.users.update(users => [...users, { id: Math.random(), name: 'New user' }]); }}bootstrapApplication(App, { providers: [ provideAnimationsAsync() ]});

    以上就是Angular LAB:动画列表并使用 AnimationBuilder 实现命令式动画的详细内容,更多请关注创想鸟其它相关文章!

    版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
    如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
    发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1493125.html

    (0)
    打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
    React Native 入门 (EXPO):初学者指南
    上一篇 2025年12月19日 15:25:32
    了解如何建立实时聊天
    下一篇 2025年12月19日 15:25:40

    相关推荐

    • Bootstrap和MDB固定导航栏遮挡内容:如何优雅地解决页面跳转后内容被遮挡的问题?

      解决bootstrap和mdb固定导航栏遮挡内容的问题 使用Bootstrap和MDB框架构建网站时,固定导航栏遮挡内容是一个常见问题。尤其在页面跳转后,目标内容区域会被导航栏遮挡。本文提供一种优雅的解决方案,无需修改HTML结构,即可在页面跳转后自动调整滚动位置,避免内容被遮挡。 问题:点击导航链…

      2026年5月10日
      000
    • PHP中基于用户角色的页面访问控制实践

      本教程详细讲解如何在PHP应用程序中利用会话(Session)机制实现基于用户角色的页面访问控制。通过正确的session_start()调用、用户登录时的角色信息存储,以及在受保护页面进行严格的会话和角色类型检查,确保只有特定用户(如“manager”)才能访问指定页面,从而有效防止未经授权的访问…

      2026年5月10日
      100
    • 在点击图片时动态显示其替代文本(Alt Text)的JavaScript教程

      在点击图片时动态显示其替代文本(Alt Text)的JavaScript教程在点击图片时动态显示其替代文本(Alt Text)的JavaScript教程在点击图片时动态显示其替代文本(Alt Text)的JavaScript教程在点击图片时动态显示其替代文本(Alt Text)的JavaScript教程

      本教程详细介绍了如何利用JavaScript在用户点击缩略图时,动态地在大图下方显示其对应的替代文本(Alt Text)。通过修改现有函数,我们能够获取图像的alt属性,并将其内容插入到指定的HTML元素中,从而提升用户体验和信息传达效率。 引言 在网页开发中,图片是不可或缺的元素。为了提升用户体验…

      2026年5月10日 用户投稿
      000
    • menu和menuitem标签用法

      menu和menuitem标签虽在HTML5中被设计用于创建上下文菜单和工具栏,但因主流浏览器支持极差(仅Firefox部分支持),实际应用受限;现代开发普遍采用JavaScript结合ARIA属性(如role=”menu”、aria-haspopup等)构建可访问、可定制的…

      2026年5月10日
      000
    • 使用Laravel Blade动态渲染带标题的表格数据

      本文旨在详细指导如何在Laravel Blade模板中,利用`@foreach`循环和正确的索引策略,高效且准确地从嵌套数组结构中提取数据,并将其渲染成一个结构清晰、内容匹配的HTML表格,避免数据重复和错位问题。 在Web开发中,经常需要根据后端提供的数据动态生成HTML表格。特别是在处理具有行标…

      2026年5月10日
      000
    • html移动端页面怎么做

      制作 HTML 移动端页面涉及以下步骤:使用响应式设计,采用弹性布局和媒体查询。采用移动端优先设计,优化速度、简化导航和调整字体大小。使用 Bootstrap 等移动端框架,简化开发。使用 PWA,提供离线访问、可安装性和快速响应。使用 Google 移动友好测试工具等移动端测试工具,确保兼容性。 …

      2026年5月10日
      000
    • C++ Boost库怎么安装使用_C++准标准库核心功能解析

      Boost库是C++中功能强大的“准标准库”,提供智能指针、正则表达式、文件系统、多线程等丰富功能,提升开发效率。安装方式因平台而异:Windows可使用vcpkg或预编译包,Linux(如Ubuntu)通过sudo apt install libboost-all-dev安装,macOS用Home…

      2026年5月10日
      000
    • 如何解决HTML表格布局混乱的处理方法

      首先检查HTML标签结构是否完整,确保table、thead、tbody、tr、th、td正确嵌套;其次通过CSS设置table-layout: fixed、border-collapse: collapse,并避免使用float或absolute定位;最后为适配移动端,可在外层容器添加overfl…

      用户投稿 2026年5月10日
      000
    • 优化HTML页面box-shadow显示:解决滚动内容区域阴影不完整问题

      在使用bootstrap构建页面时,将`box-shadow`直接应用于`body`元素可能导致当页面内容超出浏览器视口高度时,阴影效果在滚动时显示不完整。本教程将深入分析这一问题,并提供一个通过调整css样式,将`box-shadow`应用到`main`内容区域的解决方案,以确保阴影效果能随着内容…

      2026年5月10日
      000
    • HTMLrev 上的免费 HTML 网站模板

      HTMLrev 是唯一的人工策划的库专门专注于免费 HTML 模板,适用于由来自世界各地慷慨的模板创建者制作的网站、登陆页面、投资组合、博客、电子商务和管理仪表板世界。 这个人就是我自己 Devluc,我已经工作了 1 年多来构建、改进和更新这个很棒的免费资源。我自己就是一名模板制作者,所以我知道如…

      2026年5月10日
      300
    • React 组件事件处理函数传递与兄弟组件通信实践

      React 组件事件处理函数传递与兄弟组件通信实践React 组件事件处理函数传递与兄弟组件通信实践React 组件事件处理函数传递与兄弟组件通信实践React 组件事件处理函数传递与兄弟组件通信实践

      本文深入探讨了在 React 应用中,如何高效地在父子组件间传递事件处理函数,以及如何利用父组件的状态管理机制实现兄弟组件间的数据同步和响应。通过详细的代码示例,我们将学习两种核心模式:直接将函数作为 Prop 传递,以及通过父组件的共享状态来协调兄弟组件的行为,从而构建结构清晰、响应灵敏的交互式界…

      2026年5月10日 用户投稿
      300
    • 如何在点击的Div中获取正确的ID

      本文旨在解决动态生成的HTML元素中,点击事件发生时,如何准确获取与该元素关联的ID值的问题。通过事件委托和DOM遍历,我们将提供一种可靠的方法,确保在复杂的动态环境中,始终能获取到正确的ID,避免因选择器错误而导致的数据获取错误。 在动态生成的HTML结构中,经常会遇到点击事件需要获取特定ID的情…

      2026年5月10日
      000
    • React组件间事件处理器与状态传递:从父组件到多级子组件的实践指南

      本文探讨在React中如何高效地将事件处理器或其产生的状态从父组件传递给子组件,特别是涉及多级嵌套的情况。文章将详细阐述直接传递事件处理函数和通过状态管理传递事件结果的两种核心模式,并提供清晰的代码示例与注意事项,帮助开发者构建响应式用户界面。 理解React组件通信基础:Props 在React中…

      2026年5月10日
      000
    • 控制 PHPUnit 测试执行:仅运行特定命名模式的测试类

      本文旨在解决 PHPUnit 在复杂项目或非标准代码结构中可能遇到的测试执行范围问题,特别是当您希望仅运行类名以 “Test” 结尾的测试时。文章将详细介绍两种主要解决方案:通过重命名非测试方法或修改其可见性来避免其被执行,以及如何实现自定义 TestSuiteLoader …

      2026年5月10日
      000
    • XSLT如何输出HTML?

      &lt;blockquote&gt;XSLT输出HTML需定义xsl:output method=&quot;html&quot;,通过模板匹配XML节点生成HTML结构,利用xsl:value-of提取数据,xsl:attribute设置动态属性,并可嵌入link和…

      用户投稿 2026年5月10日
      000
    • 使用 PHP、MySQL 和 jQuery 实现多行动态依赖下拉菜单

      本文详细介绍了如何使用 PHP、MySQL 和 jQuery/Ajax 技术构建一个支持多行动态添加的表单,其中包含依赖下拉菜单。通过优化数据库查询、完善前端 JavaScript 逻辑以及确保动态生成元素间的正确关联,本教程旨在帮助开发者实现复杂表单的交互功能,并提供清晰的代码示例和最佳实践。 在…

      2026年5月10日
      000
    • FullCalendar在模态框等隐藏容器中渲染异常的解决方案

      当fullcalendar被放置在初始隐藏的容器(如模态框、折叠面板)中时,可能会出现渲染不完整或显示异常的问题。这通常是由于日历在初始化时无法正确计算其容器尺寸所致。解决此问题的核心方法是在容器完全可见后,通过调用fullcalendar实例的`render()`方法,强制其重新渲染和调整布局,确…

      2026年5月10日
      200
    • Yii2框架Gii工具怎么用_Yii2框架Gii代码生成器教程

      答案:Yii2的Gii工具通过自动生成模型、控制器、视图等代码提升开发效率,需在config/web.php中配置gii模块并设置allowedIPs以启用;访问/gii路径可进入界面,使用Model、CRUD等生成器快速创建代码,支持自定义模板统一风格;生成的代码需手动集成权限、验证等功能,避免直…

      2026年5月10日
      100
    • Bootstrap Accordion:防止所有手风琴同时展开及初始状态修复

      Bootstrap Accordion:防止所有手风琴同时展开及初始状态修复 本文旨在解决 Bootstrap 手风琴组件中多个手风琴同时展开的问题,并提供修复页面加载时手风琴箭头方向错误的方案。通过修改 HTML 结构中的 aria-labelledby 和 id 属性,确保每个手风琴项具有唯一的…

      2026年5月10日
      100
    • 解决 Angular 14 升级至 16 后第三方依赖兼容性错误与最佳实践

      将 Angular 应用从版本 14 升级到 16 时,常见的挑战是处理第三方库的兼容性问题,尤其是在使用 `–force` 标志后可能导致大量编译错误。本文将提供一套系统的解决方案,包括识别过时依赖、逐一验证库兼容性、遵循官方升级指南,并强调避免强制安装以确保平滑升级,最终实现稳定运行…

      2026年5月10日
      100

    发表回复

    登录后才能评论
    关注微信