“Angular 2.0 for TypeScript”(alpha)动画是如何工作的?
Posted
技术标签:
【中文标题】“Angular 2.0 for TypeScript”(alpha)动画是如何工作的?【英文标题】:How does "Angular 2.0 for TypeScript" (alpha) animation work? 【发布时间】:2016-03-13 22:03:42 【问题描述】:我是 Angular 领域的新手。我刚开始为 TypeScript 学习 Angular 2.0,我想知道动画(比如在带有 jQuery 的简单 html 中)是如何在 Angular 2.0 中工作的
在 Angular 2.0 (angular.io > Features) 的主页中,您可以看到,在“Angular 2.0 for TypeScript”中有一种制作动画的方法。
在我的研究中,我发现了这样的事情: http://www.angular-dev.com/angular-connect-slides/#/26/0/
但我认为这只是一个普通的 javascript 代码。我不确定是否 ngAnimate 2.0 就是我要找的那个。
很遗憾,我找不到更多相关信息。
我想做的,很简单:
当我在一个简单的 div 容器中单击时,我希望出现另一个 div 容器(它在开始时是不可见的)。
在 jQuery 中,它会是这样的:http://www.w3schools.com/jquery/tryit.asp?filename=tryjquery_eff_toggle
但我想要的是 TypeScript 中的这个动画。 你知道我是如何实现这个目标的吗?
提前感谢您的回答!
编辑 对不起,我忘了说,我到底想要什么。 我想使用切换,但类似于在 Windows 10 中:
当您按下“Windows + A”时,它会在右侧出现一个侧边栏。 当您单击 div 容器时,这正是我想要的网站动画效果,而不仅仅是简单的出现和消失。
我认为 jQuery 代码会是这样的(仅用于出现时间延迟)
$("divA").click(function()
$("divB").toggle(1000);
);
【问题讨论】:
【参考方案1】:对于您的简单“动画”,您只需要 ng-if:
<div (click)="showDiv2 = !showDiv2">toggle</div>
<div *ng-if="showDiv2">div 2</div>
顺便说一句,Angular 2 动画尚不可用。动画文档has landed。
【讨论】:
对不起,我忘了说,我到底想要什么。我想使用切换,但在 Windows 10 中类似:当你按下“Windows + A”时,它会在右侧出现一个侧边栏。当您单击 div 容器时,这正是我想要的网站上的动画,而不仅仅是简单的出现和消失。我认为 jQuery 代码会是这样的(仅用于出现时间延迟) $("divA").click(function() $("divB").toggle(1000); );那么,您认为 Angular 2.0 中有没有办法实现这种“侧边栏动画”? @SyleKu,欢迎来到 ***。如您所见,明确您需要帮助的具体内容非常重要。我不知道有什么方法可以用当前版本的 Angular 2 做你想做的事。你必须做类似(click)="animateDiv2(div2, 1000)"
的事情,然后编写函数 animateDiv2() 来做 toggle() 所做的事情——我假设表示在指定的持续时间内修改 CSS 属性值。【参考方案2】:
你可以使用 CSS,或者AnimationBuilder
对于 CSS 方式,您可以从他们的 repo 中检查这个 example,它完全符合您的要求。
使用AnimationBuilder
,您可以模拟这样的相同行为
首先,您设置将按住按钮和 div 进行切换的模板
@Component(
// Setting up some styles
template: `
<div animate-box #box="ab" style="height:0; width:50%; overflow: hidden;">Some content</div>
<button (click)="box.toggle(visible = !visible)">Animate</button>
`,
directives : [AnimateBox] // See class below
)
然后你创建将处理动画的指令
@Directive(
selector : '[animate-box]',
exportAs : 'ab' // Necessary, we export it and we can get its 'toggle' method in the template
)
class AnimateBox
constructor(private _ab: AnimationBuilder, private _e: ElementRef)
toggle(isVisible: boolean = false)
let animation = this._ab.css();
animation
.setDuration(1000); // Duration in ms
// If is not visible, we make it slide down
if(!isVisible)
animation
// Set initial styles
.setFromStyles(height: '0', width: '50%', overflow: 'hidden')
// Set styles that will be added when the animation ends
.setToStyles(height: '300px')
// If is visible we make it slide up
else
animation
.setFromStyles(height: '300px', width: '50%')
.setToStyles(height: '0')
// We start the animation in the element, in this case the div
animation.start(this._e.nativeElement);
参考
Animation API,超级简单,真的,真的很简单。备注
这是一个临时 API,名为 ngAnimate 2.0 的新 API 尚不可用。但是你可以在@matsko 的AngularConnect - ngAnimate 2.0 的演讲中查看新内容。
这里有一个 plnkr 的复制品。
希望对你有帮助。
【讨论】:
这正是我想要的!我真的可以使用它。但是你能再帮我一次吗?您的解决方案是完美,但我还必须以另一种方式使用它:我的情况是我有设置许多 div 的 app2.ts。当我单击其中一个 div 时,应该会出现唯一 one 相同的“animation-div”。但是这个“animation-div”在 app.ts 中。我认为一个好的解决方案就是使用我正在使用的 EventEmitter (就像一个状态)。我的问题是:当调用 EventEmitter 的订阅函数时,如何从 app.ts 中的某个#box 调用切换函数? 我刚刚又做了一个决定。我现在正在使用 css 解决方案。这可能更容易。 AnimationBuilder 仍然是解决这个问题的好方法。 不懂toggle
函数。不应该是相反的吗:// If is visible, we make it slide up if(isVisible) animation // Set initial styles .setFromStyles(height: '0', width: '50%', overflow: 'hidden') // Set styles that will be added when the animation ends .setToStyles(height: '300px')
?
重要!!:import AnimationBuilder from 'angular2/src/animate/animation_builder';
,不要从angular2/animate
导入它,因为它不起作用。
@eppsilon 只是这个 PR 介绍了 ngAnimate,但它正在进行中github.com/angular/angular/pull/7698以上是关于“Angular 2.0 for TypeScript”(alpha)动画是如何工作的?的主要内容,如果未能解决你的问题,请参考以下文章