AngularJS–Animations(动画)
点击查看AngularJS系列目录
转载请注明出处:http://www.cnblogs.com/leosx/
在AngularJS 1.3 中,给一些指令(eg: ngRepeat,ngSwitch, ngView等)提供了一个动画的钩子,也就是说,这些指令可以使用 $animate 动画服务(是一个服务哦,可以注入到controller里面去)。 这些动画钩子可以再整个指令的生命周期中随着各种指示,触发等进行动作,显示动画效果,我们可以使用HTML5的各种动画效果,类似 Transition,Keyframe,或者回调函数(这取决于是否给指令配置了动画)。如果在一个factory工厂方法中,使用AngularJS或者Javascript代码定义,设置了规范的命名空间了的时候,就可以使用动画了(这句话感觉翻译的有问题,忘指点迷津…)。
如果你的应用程序没有依赖于 ngAnimate 模块的话,你的所有动画都是没有用的。
下面我们来看一下一个使用 ngShow 和 ngHide 进行显示隐藏的动画:
<style>
.sample-show-hide {
padding:10px;
border:1px solid black;
background:white;
} .sample-show-hide {
-webkit-transition:all linear 0.5s;
transition:all linear 0.5s;
} .sample-show-hide.ng-hide {
opacity:0;
}
</style>
<div ng-app>
<div ng-init="checked=true">
<label>
<input type="checkbox" ng-model="checked" style="float:left; margin-right:10px;"> Is Visible...
</label>
<div class="check-element sample-show-hide" ng-show="checked" style="clear:both;">
Visible...
</div>
</div>
</div>
效果图:

安装动画模块
可以查看动画模块来查看如何安装。
它们是怎么样工作的
在AngularJS中的动画,完全是基于css 样式类的。所以你首先得有这样动画class。我们还是来看看例子吧!
<div ng-repeat="item in items" class="repeated-item">
{{ item.id }}
</div>
我们看看 ngRepeat,它会重复 items里面的每一个元素,生成一个这个模板的副本,对于每一个副本元素的增加,Angualr都会在该元素上增加一个名为ng-enter 的 class 样式,当这个元素被删除的时候,会增加一个 ng-leave的 class样式,当你移动这个元素的时候,它就会增加一个ng-move的 class 类样式。
我们来看看下面的css代码,我们可以看到它使用了CSS3的一些过度,关键帧,变幻等动画效果。而且它们的触发时间呢,比较需要注意,可以看到,它们的触发时间是当你使用了 ngRepeat之后,会出现上面一段我们说到的那几个样式来进行触发的。代码如下:
/*
We're using CSS transitions for when
the enter and move events are triggered
for the element that has the .repeated-item
class
*/
.repeated-item.ng-enter, .repeated-item.ng-move {
-webkit-transition:0.5s linear all;
-moz-transition:0.5s linear all;
-o-transition:0.5s linear all;
transition:0.5s linear all;
opacity:0;
} /*
The ng-enter-active and ng-move-active
are where the transition destination properties
are set so that the animation knows what to
animate.
*/
.repeated-item.ng-enter.ng-enter-active,
.repeated-item.ng-move.ng-move-active {
opacity:1;
} /*
We're using CSS keyframe animations for when
the leave event is triggered for the element
that has the .repeated-item class
*/
.repeated-item.ng-leave {
-webkit-animation:0.5s my_animation;
-moz-animation:0.5s my_animation;
-o-animation:0.5s my_animation;
animation:0.5s my_animation;
} @keyframes my_animation {
from { opacity:1; }
to { opacity:0; }
} /*
Unfortunately each browser vendor requires
its own definition of keyframe animation code...
*/
@-webkit-keyframes my_animation {
from { opacity:1; }
to { opacity:0; }
} @-moz-keyframes my_animation {
from { opacity:1; }
to { opacity:0; }
} @-o-keyframes my_animation {
from { opacity:1; }
to { opacity:0; }
}
当然,如果你要兼容IE什么的,你也可以使用JQuery去实现这些动画效果,对吧,看看下面代码:
myModule.animation('.repeated-item', function() {
return {
enter : function(element, done) {
element.css('opacity',0);
jQuery(element).animate({
opacity: 1
}, done);
// optional onDone or onCancel callback
// function to handle any post-animation
// cleanup operations
return function(isCancelled) {
if(isCancelled) {
jQuery(element).stop();
}
}
},
leave : function(element, done) {
element.css('opacity', 1);
jQuery(element).animate({
opacity: 0
}, done);
// optional onDone or onCancel callback
// function to handle any post-animation
// cleanup operations
return function(isCancelled) {
if(isCancelled) {
jQuery(element).stop();
}
}
},
move : function(element, done) {
element.css('opacity', 0);
jQuery(element).animate({
opacity: 1
}, done);
// optional onDone or onCancel callback
// function to handle any post-animation
// cleanup operations
return function(isCancelled) {
if(isCancelled) {
jQuery(element).stop();
}
}
},
// you can also capture these animation events
addClass : function(element, className, done) {},
removeClass : function(element, className, done) {}
}
});
当这些CSS样式或者Javascript代码被添加到了元素上以后,AngularJS会自动的在对应的触发器中执行力的CSS样式,或者JavaScript代码的。 如果既有CSS,也有JavaScript代码,并且CSS样式名已经在元素上能匹配到了了,那么AngularJS会让两个动画同时执行的。
Class 类样式和 ngClass 动画钩子
AngularJS也有自己的动画钩子,这样的话,我们就可以根据元素的触发器,去添加或者移除动画钩子,也就是相当于如果CSS样式类存在的话,就会把这些动画样式应用于这个元素上。但是有个前提,那就是这个元素是在AngularJS应用程序中的,也就是受AngularJS控制的才行! 不然依然是不会有动画效果的。
我们还是来一个例子来看看效果吧!
<style>
.css-class-add, .css-class-remove {
-webkit-transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 0.5s;
-moz-transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 0.5s;
-o-transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 0.5s;
transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 0.5s;
} .css-class,
.css-class-add.css-class-add-active {
color: red;
font-size:3em;
} .css-class-remove.css-class-remove-active {
font-size:1.0em;
color:black;
}
</style>
<p>
<input type="button" value="set" ng-click="myCssVar='css-class'">
<input type="button" value="clear" ng-click="myCssVar=''">
<br>
<span ng-class="myCssVar">CSS-Animated Text</span>
</p>
点击set按钮效果:

点击Clear按钮的效果如下:

哪些指令支持动画呢?
有少数常见的AngularJS指令是支持和触发动画钩子的。下表详细解释这些动画:
| 指令 | 支持的动画 |
| ngRepeat | enter, leave, and move |
| ngView | enter and leave |
| ngInclude | enter and leave |
| ngSwitch | enter and leave |
| ngIf | enter and leave |
| ngClass or | add and remove |
| ngShow & ngHide | add and remove (the ng-hide class value) |
对于每个指令指令的动画的详细介绍的话,请参考API文档.
我们怎么在我们自定义的指令中使用动画呢?其实比较简单,你只需要在你创建指令的工厂中,注入 $animate 到工厂中,然后你在你的指令中,就可以使用了。
myModule.directive('my-directive', ['$animate', function($animate) {
return function(scope, element, attrs) {
element.on('click', function() {
if(element.hasClass('clicked')) {
$animate.removeClass(element, 'clicked');
} else {
$animate.addClass(element, 'clicked');
}
});
};
}]);
AngularJS–Animations(动画)的更多相关文章
- AngularJS(14)-动画
AngularJS 提供了动画效果,可以配合 CSS 使用. AngularJS 使用动画需要引入 angular-animate.min.js 库. <!DOCTYPE html> &l ...
- AngularJS:动画
ylbtech-AngularJS:动画 1.返回顶部 1. AngularJS 动画 AngularJS 提供了动画效果,可以配合 CSS 使用. AngularJS 使用动画需要引入 angula ...
- iOS Programming Controlling Animations 动画
iOS Programming Controlling Animations 动画 The word "animation" is derived from a Latin wor ...
- AngularJS学习--- 动画操作 (Applying Animations) ngAnimate step 12
1.切换目录 git checkout step-12 npm start 2.效果图 这里在点击右边的缩略图时,会有一个很明显的从下向上的动画过程. 3.代码实现: step11和step12之间的 ...
- android 之 animations 动画
android 提供的了两种机制你可以用来创建简单的动画:tweedned animation(渐变动画) 和 frame-by-frame animation(逐帧动画)(有道翻译的,汗!!!) . ...
- Android Animations动画使用详解
一.动画类型 Android的animation由四种类型组成:alpha.scale.translate.rotate XML配置文件中 alpha 渐变透明度动画效果 scale 渐变尺寸伸缩动画 ...
- Animations动画和Keyframes关键帧
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- AngularJS 动画
AngularJS 提供了动画效果,可以配合 CSS 使用. AngularJS 使用动画需要引入 angular-animate.min.js 库. <script src="htt ...
- AngularJS动画
1.AngularJS提供了动画效果,可以配合CSS使用: 2.AngularJS使用动画需要引入angular-animate.min.js库 <script src="http:/ ...
随机推荐
- 【渗透课程】第四篇-Web安全之信息探测
Web之信息探测,从这篇开始就正式进入了Web渗透实战过程了,嗯,前面都是讲基础,下面我们来讲Web中的信息探测. 信息探测,主要的目的 收集目标服务器系统信息(IP,服务器所用系统等) 收集目标网站 ...
- 高效使用 Python 可视化工具 Matplotlib
Matplotlib是Python中最常用的可视化工具之一,可以非常方便地创建海量类型的2D图表和一些基本的3D图表.本文主要介绍了在学习Matplotlib时面临的一些挑战,为什么要使用Matplo ...
- 慕课网视频破解付费分享-前端开发-Python等
微信小程序 慕课网 BAT大牛经验总结全面深入解读Android面试 前端JS基础面试技巧 vue2.0+node.js+mongodb全栈打造商城 Vue.js高级实战-开发移动端音 ...
- 用webgl打造自己的3D迷宫游戏
用webgl打造自己的3D迷宫游戏 2016/09/19 · JavaScript · WebGL 原文出处: AlloyTeam 背景:前段时间自己居然迷路了,有感而发就想到写一个可以让人迷路 ...
- 201521123083 《Java程序设计》第6周学习总结
1. 本周学习总结 1.1 面向对象学习暂告一段落,请使用思维导图,以封装.继承.多态为核心概念画一张思维导图,对面向对象思想进行一个总结. 1.2 可选:使用常规方法总结其他上课内容. protec ...
- 个人作业3—个人总结(Alpha阶段)
一.个人总结 在Alpha阶段,我们团队通过合作的方式,完成了之前觉得不大可能会完成的事(至少在我看来是这样的),大家其实之前的写代码能力都不太好,这期间大家都是边学边做,边做边学,最后跌跌撞撞的完成 ...
- 201521123016 《Java程序设计》第7周学习总结
1. 本周学习总结 2. 书面作业 1.ArrayList代码分析 1.1 解释ArrayList的contains源代码 public boolean contains(Object o) { re ...
- 201521123114 《Java程序设计》第5周学习总结
1. 本章学习总结 2. 书面作业 Q1.代码阅读:Child压缩包内源代码 1.1 com.parent包中Child.java文件能否编译通过?哪句会出现错误?试改正该错误.并分析输出结果. 不能 ...
- 201521123115 《Java程序设计》第1周学习总结
1. 本周学习总结 之前一直没有用心学,这周上课虽然认真但还是太多不懂加上还要补考没有时间来消化所以很多都是囫囵吞枣,希望能够赶快补上把. 知道了java的前世今生,JVM/JRE/JDK,JVM就是 ...
- 201521123075 《Java程序设计》第10周学习总结
1. 本周学习总结 2. 书面作业 本次PTA作业题集异常.多线程 1.finally 题目4-2 1.1 截图你的提交结果(出现学号) 1.2 4-2中finally中捕获异常需要注意什么? fin ...