学习笔记-AngularJs(九)

到目前为止,我们所做的学习案例都是没有加任何动画效果的,对于以往来说,我们经常会去使用一些动画插件或是css框架(如:animate.css)来点缀我们的网页,这样显得生动,高大上,那么接下来我们可以学习一下,怎么在AngularJs下来实现叼酷炫的动画操作,主要使用的命令是ngAnimate。

与之前的ngResource,ngRoute一样,需要注入ngAnimate和引入ng-animate.js才可以使用此服务,想在你的angular应用程序使用ngAnimate来实现动画功能,前提条件是将ngAnimate包含到您的应用程序,动画是由使用CSS转换/动画或JavaScript回调来实现。angular本身各种核心ng指令将提供动画钩子,支持动画的的指令有ngRepeat, ngInclude, ngIf, ngSwitch,ngShow, ngHide, ngView and ngClass,当然自定义命令也是可以通过使用$animate服务来进行动画操作,其各个指令对动画支持情况如下表:

  • ng-enter  class 主要用于新添加的元素并渲染到页面中,添加后会添加class ng-enter-active
  • ng-move  class 主要用于当元素被移动时,移动后会添加class ng-move-active
  • ng-leave  class主要用于被删除时,删除后会添加class ng-leave-active
  • ng-hide,ng-show  class用于是否判断执行,对应的还会有几个css,ng-hide-add,ng-hide-add-active,ng-hide-remove,ng-hide-remove-active,会在使用ng-show或是ng-hide指令操作dom时动态添加的class
  • 对于表单,在之前的学习笔记上也有通过不同验证的属性,而得到的class(如input无效则会加上class="ng-invalid"),从而来定义其显示样式

  必须要明白:(1)父元素动画没执行完,子元素动画不执行,但是可以将此行为屏蔽掉,加上ng-animate-children   

        (2)在使用$http获取远程数据时,会自动延长动画时间,应用加载,动画不马上执行!

  通过审查phonecat上面(http://angular.github.io/angular-phonecat/step-12/app/#/phones)的元素,观察其变化,不难看出,AngularJs可以通过ngAnimate模块在不同时间点给上不同的class,然后通过定义这些class的css,来实现动画操作!觉得还是需要举例子来学习,比较容易懂!主要分两部分来举例,CSS-defined Animations和JavaScript-defined Animations。

CSS-defined Animations

还记得之前的学习笔记-AngularJs(三)使用了filter对ng-repeat进行过滤吗?我们现在修改一下之前的代码,把它改成过滤检索歌曲,代码如下:

<!doctype html><html ng-app=‘animate-css‘>
    <head>
        <meta charset="utf8"/>
        <script src="angular.min.js"></script>
        <script src="angular-animate.js"></script> //使用ngAnimate模块需要引入angular-animate.js
        <script>
            angular.module(‘animate-css‘, [‘ngAnimate‘])//注入ngAnimate,这样animate动画效果便自动应用在了项目中,于是就需要定义css改变样式
            .controller(‘songController‘, [‘$scope‘, function($scope) {
                $scope.songs=[‘爱你一万年‘,‘开心的马骝‘,‘北京欢迎你‘,‘笑傲江湖‘ ,‘练习‘,‘爱情买卖‘,‘七里香‘ ,‘死了都要爱‘,‘北京爱情故事‘,‘星星点灯‘,‘星空‘,‘豆浆和油条‘,‘神话‘];
            }]);
       </script>

        <style>       /*上文已有提到,angular不同时间点会有不同的class,正是利用这些class来制作动画,必须了解ng-enter,ng-enter-active,ng-leave,ng-leave-active,ng-move,ng-move-active这些class的先后顺序*/
            li{list-style: none; }
            body{margin: 50px; background-color: #333; color: #ccc; overflow: hidden;}
            h3{color: #fff;}
            .song-list.ng-enter,
            .song-list.ng-leave,
            .song-list.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;
            }

            .song-list.ng-enter,
            .song-list.ng-move {
              opacity: 0;
              height: 0;
              overflow: hidden;
            }

            .song-list.ng-move.ng-move-active,
            .song-list.ng-enter.ng-enter-active {
              opacity: 1;
              height: 120px;
            }

            .song-list.ng-leave {
              opacity: 1;
              overflow: hidden;
            }

            .song-list.ng-leave.ng-leave-active {
              opacity: 0;
              height: 0;
              padding-top: 0;
              padding-bottom: 0;
            }
        </style>
    </head>
    <body>    

        <div ng-controller="songController">
            <input type="text" ng-model="search">
            <button type="submit">Filter</button>
            <ul>
            <li class="song-list" ng-repeat="song in songs | filter:search">
            {{song}}
            </li>
            </ul>
        </div>
    </body>
</html>

JavaScript-defined Animations

如果你不想使用CSS3转换或CSS3动画,如果你想提供动画还不支持CSS的浏览器转换/动画,那么你可以使用JavaScript动画定义AngularJS模块内,也就是自定义动画,实现个性化的动画效果,先来看官网是如何去使用javascript动画定义的:

//!annotate="YourApp" Your AngularJS Module|Replace this or ngModule with the module that you used to define your application.
var ngModule = angular.module(‘YourApp‘, [‘ngAnimate‘]);
ngModule.animation(‘.my-crazy-animation‘, function() {
  return {
    enter: function(element, done) {
      //run the animation here and call done when the animation is complete
      return function(cancelled) {
        //this (optional) function will be called when the animation
        //completes or when the animation is cancelled (the cancelled
        //flag will be set to true if cancelled).
      };
    },
    leave: function(element, done) { },
    move: function(element, done) { },

    //animation that can be triggered before the class is added
    beforeAddClass: function(element, className, done) { },

    //animation that can be triggered after the class is added
    addClass: function(element, className, done) { },

    //animation that can be triggered before the class is removed
    beforeRemoveClass: function(element, className, done) { },

    //animation that can be triggered after the class is removed
    removeClass: function(element, className, done) { }
  };
});

不难看出是可以不仅自己定义enter(添加元素)、move(移动元素)、leave(删除元素)等状态,而且还可以增加addClass、beforeRemoveClass、removeClass等监听事件。那么我们对上面过滤歌名的demo修改一下:

<!doctype html>
<html ng-app=‘animate-javascript‘>
    <head>
        <meta charset="utf8"/>
        <script src="jquery.js"></script>
        <script src="angular.min.js"></script>
        <script src="angular-animate.js"></script>
        <script>
            var jav = angular.module(‘animate-javascript‘, [‘ngAnimate‘]);
            jav.controller(‘songController‘, [‘$scope‘, function($scope) {
                $scope.songs=[‘爱你一万年‘,‘开心的马骝‘,‘北京欢迎你‘,‘笑傲江湖‘ ,‘练习‘,‘爱情买卖‘,‘七里香‘ ,‘死了都要爱‘,‘北京爱情故事‘,‘星星点灯‘,‘星空‘,‘豆浆和油条‘,‘神话‘];
            }]);
            jav.animation(".repeat-animation",function(){  //我们引入angular-animate.js和注入ngAnimate模块后,便可以使用.animation(element,function(){...})来定义动画,这里我们定义了一个class为.repeat-animation的的动画
                  return {
                    enter : function(element, done) { //对于动画行为的函数格式是function(element,done){...},这里的element指得是一个jquery对象(前提必须引入jquery.js),done是结束的回调函数
                      var width = element.width();
                      element.css({
                        position: ‘relative‘,
                        left: -20,
                        opacity: 0
                      });
                      element.animate({
                        left: 0,
                        opacity: 1
                      }, done);
                    },
                    leave : function(element, done) {
                      element.css({
                        position: ‘relative‘,
                        left: 0,
                        opacity: 1
                      });
                      element.animate({
                        left: -10,
                        opacity: 0
                      }, done);
                    },
                    move : function(element, done) {
                      element.css({
                        left: "5px",
                        opacity: 0.2
                      });
                      element.animate({
                        left: "0px",
                        opacity: 1
                      }, done);
                    }
                  };
            })
        </script>

        <style>
            li{list-style: none; }
            body{margin: 50px; background-color: #333; color: #ccc; overflow: hidden;}
            h3{color: #fff;}
        </style>
    </head>
    <body>    

        <div ng-controller="songController">
            <input type="text" ng-model="search">
            <button type="submit">Filter</button>
            <ul>
            <li class="song-list repeat-animation" ng-repeat="song in songs | filter:search">
            {{song}}
            </li>
            </ul>
        </div>
    </body>
</html>

这是对ng-animate的一个大概的了解,其中还有许多遗漏的点(比如说$animate服务等),随后学到了,会补充上去,随后会把其他指令的自定义动画的代码demo更新到github上!

时间: 2024-12-26 03:22:09

学习笔记-AngularJs(九)的相关文章

简单的玩玩etimer &lt;contiki学习笔记之九&gt;

好吧,我承认etimer有点小复杂,主要是它似乎和contiki的process搅在一起,到处都在call_process.那就先搜搜contiki下的etimer的example看看,然后再试着写一个demo玩玩. 在写demo之前,先说说自己是怎么找到etimer 的example的文件的. 在core/sys/etimer.h 文件中,在描述etimer的数据结构的时候,作者显示的指出,如果要使用etimer,就必须先使用 etimer_set()这个函数进行一些工作,如图: 是的,数据结

MySQL学习笔记之九 字符串模式匹配

我们在使用查询的时候,经常会碰到模糊条件查询,而模糊查询就涉及到了字符串模式匹配. 在这里,主要讲两个:标准的SQL模式匹配.扩展正则表达式模式匹配.     一.标准的SQL模式匹配 SQL的模式匹配允许你使用"_"匹配任何单个字符,而"%"匹配任意数目字符(包括零个字符).在MySQL中,SQL的模式缺省是忽略大小写的.下面显示一些例子.注意在你 使用SQL模式时,你不能使用=或!=:而使用LIKE或NOT LIKE比较操作符. 为了找出包含正好5个字符的名字,

简单的玩玩etimer &lt;contiki学习笔记之九 补充&gt;

这幅图片是对前面  <<contiki学习笔记之九>>  的一个补充说明. 简单的玩玩etimer <contiki学习笔记之九> 或许,自己正在掀开contiki process最后的一层面纱: 或许,还有一段路要走: 或许,已经掀开... --------------- 一切,都只是process:只有有了process,才会轮到etimer_process  发言,除非,抛却一切机制,裸机实现etimer... process,是什么? 一个链表,还是单向的,仅此

angular学习笔记(十九)

本篇主要介绍angular使用指令修改DOM: 使用angular指令可以自己扩展html语法,还可以做很多自定义的事情.在后面会专门讲解这一块的知识,这一篇只是起到了解入门的作用. 与控制器,过滤器,服务,一样,可以通过模块实例的directive的方法来创建指令: var someModule = angular.module('SomeModule',[]); someModule.directive('directiveName',function(){ return { link: f

学习笔记-AngularJs(三)

学习笔记-AngularJs(二)写了个所有程序语言入门时都必须要写的Hello World,那么从现在开始做那个之前说过的互联网大佬介绍的学习例子,当然这里开始会慢慢按照之前说过的目录来搭建这个学习的demo,将控制器.过滤器.指令.服务.基本配置都独立成一个个js文件,直接贴张效果图: (有点简陋,之后再把样式写好看些!) 这里实现的功能是这样的,在前台遍历phones的对象数组,然后可以按照年龄和名字排序,也可以通过输入字符串过滤检索.代码如下: html: <!doctype html>

VSTO学习笔记(九)浅谈Excel内容比较

原文:VSTO学习笔记(九)浅谈Excel内容比较 说起文件内容比较,或许我们首先想到的是UltraCompare这类专业比较的软件,其功能非常强大,能够对基于文本的文件内容作出快速.准确的比较,有详细的差异报告,非常便于分析.其实,各种版本控制软件中也包含有或多或少的比较功能,如TFS.CVS.SVN等.但是如果待比较的文件不是基于文本类型的,那就无能为力了.今天我就来谈一谈Excel的比较方法及其特点,也和大家共同探讨一下,如果你有更好的方法,欢迎分享. 一.Excel的文件架构 Excel

汇编入门学习笔记 (九)—— call和ret

疯狂的暑假学习之  汇编入门学习笔记 (九)--  call和ret 參考: <汇编语言> 王爽 第10章 call和ret都是转移指令. 1. ret和retf ret指令:用栈中的数据,改动IP内容,从而实现近转移 相当于: pop ip retf指令:用栈中的数据.改动CS和IP,从而实现远转移 相当于: pop ip pop cs 样例:ret assume cs:code,ss:stack stack segment db 16 dup(1) stack ends code segm

GDI+学习笔记(九)带插件的排序算法演示器(MFC中的GDI+实例)

带插件的排序算法演示器 本节将通过一个实例来说明GDI+在MFC中的应用.这个算法演示器其实是本人算法系列的一个开端,由于csdn没有树状的目录结构,咱也只好使用链表了不是?好了,废话不多说,开始今天的文章. (一)功能说明 我们初步制定功能如下: (1). 能够通过柱状图,自动展示排序算法的交换比较过程 (2). 能够使用插件的形式进行开发.即,当新完成一个算法后,只需要完成一个插件文件(我们这里使用动态库dll),由主程序加载插件,即可进行执行,而不再需要重新编译主程序. (3). 保证主程

Android学习笔记(九)——更复杂的进度对话框

显示操作进度的对话框 1.使用上一篇创建的同一项目,在activity_main.xml文件中添加一个Button: <Button android:id="@+id/btn_dialog3" android:layout_width="fill_parent" android:layout_height="wrap_content" android:onClick="onClick3" android:text=&qu