点击查看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(动画)的更多相关文章

  1. AngularJS(14)-动画

    AngularJS 提供了动画效果,可以配合 CSS 使用. AngularJS 使用动画需要引入 angular-animate.min.js 库. <!DOCTYPE html> &l ...

  2. AngularJS:动画

    ylbtech-AngularJS:动画 1.返回顶部 1. AngularJS 动画 AngularJS 提供了动画效果,可以配合 CSS 使用. AngularJS 使用动画需要引入 angula ...

  3. iOS Programming Controlling Animations 动画

    iOS Programming Controlling Animations 动画 The word "animation" is derived from a Latin wor ...

  4. AngularJS学习--- 动画操作 (Applying Animations) ngAnimate step 12

    1.切换目录 git checkout step-12 npm start 2.效果图 这里在点击右边的缩略图时,会有一个很明显的从下向上的动画过程. 3.代码实现: step11和step12之间的 ...

  5. android 之 animations 动画

    android 提供的了两种机制你可以用来创建简单的动画:tweedned animation(渐变动画) 和 frame-by-frame animation(逐帧动画)(有道翻译的,汗!!!) . ...

  6. Android Animations动画使用详解

    一.动画类型 Android的animation由四种类型组成:alpha.scale.translate.rotate XML配置文件中 alpha 渐变透明度动画效果 scale 渐变尺寸伸缩动画 ...

  7. Animations动画和Keyframes关键帧

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. AngularJS 动画

    AngularJS 提供了动画效果,可以配合 CSS 使用. AngularJS 使用动画需要引入 angular-animate.min.js 库. <script src="htt ...

  9. AngularJS动画

    1.AngularJS提供了动画效果,可以配合CSS使用: 2.AngularJS使用动画需要引入angular-animate.min.js库 <script src="http:/ ...

随机推荐

  1. 线性代数-矩阵-转置 C和C++的实现

    原理解析: 本节介绍矩阵的转置.矩阵的转置即将矩阵的行和列元素调换,即原来第二行第一列(用C21表示,后同)与第一行第二列(C12)元素调换位置,原来c31与C13调换.即cij与cji调换 . (此 ...

  2. Nginx学习之HTTP/2.0配置

    哎呀,一不小心自己的博客也是HTTP/2.0了,前段时间对网站进行了https迁移并上了CDN,最终的结果是这酱紫的(重点小绿锁,安全标示以及HTTP/2.0请求). 科普 随着互联网的快速发展,HT ...

  3. Python练习2

    [之前发布到本人的51cto博客,现转过来] 无意看到老男孩的博文:合格linux运维人员必会的30道shell编程面试题及讲解 http://oldboy.blog.51cto.com/256141 ...

  4. asp.net core策略授权

    在<asp.net core认证与授权>中讲解了固定和自定义角色授权系统权限,其实我们还可以通过其他方式来授权,比如可以通过角色组,用户名,生日等,但这些主要取决于ClaimTypes,其 ...

  5. html:table属性cellpadding

    cellpadding:单元格边距(空白区域) colspan:可以横跨的列数(td/th都算一列) 详细:http://www.dreamdu.com/xhtml/attribute_cellpad ...

  6. 下拉菜单效果和tab选项卡切换

    //下拉菜单效果和tab选项卡切换. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" " ...

  7. ref与out的区别、冒泡排序、普通排序,以及二分法查询

    一.首先我们先讲一下ref与out的区别和使用方法: 1.ref与out的区别: out:需要在使用前声明变量,分配地址但不能赋值,但是需要在使用中的时候需要初始化(进入方法体中的时候需要先赋值在使用 ...

  8. 深入理解JAVA I/O系列六:Linux中的IO模型(转载的文章非常值得学习)

    From:http://www.cnblogs.com/dongguacai/p/5770287.html IO模型 linux系统IO分为内核准备数据和将数据从内核拷贝到用户空间两个阶段. 这张图大 ...

  9. C# 导出数据到Excel模板中(转)

    今天做报表的时候遇到了多表头的问题,而且相应的报表的格式都一样.所以就采用了报表模板的方式来进行. 第一步:在开发的当前项目中引入:Microsoft.Office.Interop.Excel:Sys ...

  10. Day-12: 进程和线程

    进程和线程 在操作系统看来,一个任务就是一个进程,而一个进程内部如果要做多个任务就是有多个线程.一个进程至少有一个线程. 真正的并行执行任务是由多个CUP分别执行任务,实际中是由,操作系统轮流让各个任 ...