Verzeichnis suchen
AngularJS API Reference auto auto/service auto/service/$injector auto/service/$provide ng ng/directive ng/directive/a ng/directive/form ng/directive/input ng/directive/input[checkbox] ng/directive/input[date] ng/directive/input[dateTimeLocal] ng/directive/input[email] ng/directive/input[month] ng/directive/input[number] ng/directive/input[radio] ng/directive/input[text] ng/directive/input[time] ng/directive/input[url] ng/directive/input[week] ng/directive/ngApp ng/directive/ngBind ng/directive/ngBindHtml ng/directive/ngBindTemplate ng/directive/ngBlur ng/directive/ngChange ng/directive/ngChecked ng/directive/ngClass ng/directive/ngClassEven ng/directive/ngClassOdd ng/directive/ngClick ng/directive/ngCloak ng/directive/ngController ng/directive/ngCopy ng/directive/ngCsp ng/directive/ngCut ng/directive/ngDblclick ng/directive/ngDisabled ng/directive/ngFocus ng/directive/ngForm ng/directive/ngHide ng/directive/ngHref ng/directive/ngIf ng/directive/ngInclude ng/directive/ngInit ng/directive/ngKeydown ng/directive/ngKeypress ng/directive/ngKeyup ng/directive/ngList ng/directive/ngModel ng/directive/ngModelOptions ng/directive/ngMousedown ng/directive/ngMouseenter ng/directive/ngMouseleave ng/directive/ngMousemove ng/directive/ngMouseover ng/directive/ngMouseup ng/directive/ngNonBindable ng/directive/ngOpen ng/directive/ngPaste ng/directive/ngPluralize ng/directive/ngReadonly ng/directive/ngRepeat ng/directive/ngSelected ng/directive/ngShow ng/directive/ngSrc ng/directive/ngSrcset ng/directive/ngStyle ng/directive/ngSubmit ng/directive/ngSwitch ng/directive/ngTransclude ng/directive/ngValue ng/directive/script ng/directive/select ng/directive/textarea ng/filter ng/filter/currency ng/filter/date ng/filter/filter ng/filter/json ng/filter/limitTo ng/filter/lowercase ng/filter/number ng/filter/orderBy ng/filter/uppercase ng/function ng/function/angular.bind ng/function/angular.bootstrap ng/function/angular.copy ng/function/angular.element ng/function/angular.equals ng/function/angular.extend ng/function/angular.forEach ng/function/angular.fromJson ng/function/angular.identity ng/function/angular.injector ng/function/angular.isArray ng/function/angular.isDate ng/function/angular.isDefined ng/function/angular.isElement ng/function/angular.isFunction ng/function/angular.isNumber ng/function/angular.isObject ng/function/angular.isString ng/function/angular.isUndefined ng/function/angular.lowercase ng/function/angular.module ng/function/angular.noop ng/function/angular.toJson ng/function/angular.uppercase ng/object ng/object/angular.version ng/provider ng/provider/$animateProvider ng/provider/$compileProvider ng/provider/$controllerProvider ng/provider/$filterProvider ng/provider/$httpProvider ng/provider/$interpolateProvider ng/provider/$locationProvider ng/provider/$logProvider ng/provider/$parseProvider ng/provider/$rootScopeProvider ng/provider/$sceDelegateProvider ng/provider/$sceProvider ng/service ng/service/$anchorScroll ng/service/$animate ng/service/$cacheFactory ng/service/$compile ng/service/$controller ng/service/$document ng/service/$exceptionHandler ng/service/$filter ng/service/$http ng/service/$httpBackend ng/service/$interpolate ng/service/$interval ng/service/$locale ng/service/$location ng/service/$log ng/service/$parse ng/service/$q ng/service/$rootElement ng/service/$rootScope ng/service/$sce ng/service/$sceDelegate ng/service/$templateCache ng/service/$timeout ng/service/$window ng/type ng/type/$cacheFactory.Cache ng/type/$compile.directive.Attributes ng/type/$rootScope.Scope ng/type/angular.Module ng/type/form.FormController ng/type/ngModel.NgModelController ngAnimate ngAnimate/provider ngAnimate/provider/$animateProvider ngAnimate/service ngAnimate/service/$animate ngCookies ngCookies/service ngCookies/service/$cookies ngCookies/service/$cookieStore ngMessages ngMessages/directive ngMessages/directive/ngMessage ngMessages/directive/ngMessages ngMock ngMock/function ngMock/function/angular.mock.dump ngMock/function/angular.mock.inject ngMock/function/angular.mock.module ngMock/object ngMock/object/angular.mock ngMock/provider ngMock/provider/$exceptionHandlerProvider ngMock/service ngMock/service/$exceptionHandler ngMock/service/$httpBackend ngMock/service/$interval ngMock/service/$log ngMock/service/$timeout ngMock/type ngMock/type/angular.mock.TzDate ngMockE2E ngMockE2E/service ngMockE2E/service/$httpBackend ngResource ngResource/service ngResource/service/$resource ngRoute ngRoute/directive ngRoute/directive/ngView ngRoute/provider ngRoute/provider/$routeProvider ngRoute/service ngRoute/service/$route ngRoute/service/$routeParams ngSanitize ngSanitize/filter ngSanitize/filter/linky ngSanitize/service ngSanitize/service/$sanitize ngTouch ngTouch/directive ngTouch/directive/ngClick ngTouch/directive/ngSwipeLeft ngTouch/directive/ngSwipeRight ngTouch/service ngTouch/service/$swipe
Figuren

AngularJS: API: ngAnimate


ngAnimate

ThengAnimatemodule provides support for JavaScript, CSS3 transition and CSS3 keyframe animation hooks within existing core and custom directives.

用法

To see animations in action, all that is required is to define the appropriate CSS classes or to register a JavaScript animation via the myModule.animation() function. The directives that support animation automatically are:ngRepeat,ngInclude,ngIf,ngSwitch,ngShow,ngHide,ngViewandngClass. Custom directives can take advantage of animation by using the$animateservice.

Below is a more detailed breakdown of the supported animation events provided by pre-existing ng directives:

Directive Supported Animations
ngRepeat enter, leave and move
ngView enter and leave
ngInclude enter and leave
ngSwitch enter and leave
ngIf enter and leave
ngClass add and remove (the CSS class(es) present)
ngShow & ngHide add and remove (the ng-hide class value)
form & ngModel add and remove (dirty, pristine, valid, invalid & all other validations)
ngMessages add and remove (ng-active & ng-inactive)
ngMessage enter and leave

You can find out more information about animations upon visiting each directive page.

Below is an example of how to apply animations to a directive that supports animation hooks:

Type="text/css">.slide.ng-enter,.slide.ng-leave{-webkit-transition:0.5slinear all;transition:0.5slinear all;}.slide.ng-enter{}/* starting animations for enter */.slide.ng-enter.ng-enter-active{}/* terminal animations for enter */.slide.ng-leave{}/* starting animations for leave */.slide.ng-leave.ng-leave-active{}/* terminal animations for leave */class="slide"ng-include="...">

记住,默认情况下, if an animation is running, any child elements cannot be animated until the parent element's animation has completed. This blocking feature can be overridden by placing theng-animate-childrenattribute on a parent container tag.

class="slide-animation"ng-if="on"ng-animate-children>class="fade-animation"ng-if="on">class="explode-animation"ng-if="on">...

When theonexpression value changes and an animation is triggered then each of the elements within will all animate without the block being applied to child elements.

CSS-defined Animations

The animate service will automatically apply two CSS classes to the animated element and these two CSS classes are designed to contain the start and end CSS styling. Both CSS transitions and keyframe animations are supported and can be used to play along with this naming structure.

The following code below demonstrates how to perform animations usingCSS transitionswith Angular:

Type="text/css">/* The animate class is apart of the element and the ng-enter class is attached to the element once the enter animation event is triggered */.reveal-animation.ng-enter{-webkit-transition:1slinear all;/* Safari/Chrome */transition:1slinear all;/* All other modern browsers and IE10+ *//* The animation preparation code */opacity:0;}/* 记住, that you want to combine both CSS classes together to avoid any CSS-specificity conflicts */.reveal-animation.ng-enter.ng-enter-active{/* The animation code itself */opacity:1;}class="view-container">ng-viewclass="reveal-animation">

The following code below demonstrates how to perform animations usingCSS animationswith Angular:

Type="text/css">.reveal-animation.ng-enter{-webkit-animation:enter_sequence1slinear;/* Safari/Chrome */animation:enter_sequence1slinear;/* IE10+ and Future Browsers */}@-webkit-keyframes enter_sequence{from{opacity:0;}to{opacity:1;}}@keyframes enter_sequence{from{opacity:0;}to{opacity:1;}}class="view-container">ng-viewclass="reveal-animation">

Both CSS3 animations and transitions can be used together and the animate service will figure out the correct duration and delay timing.

Upon DOM mutation, the event class is added first (something likeng-enter), then the browser prepares itself to add the active class (in this caseng-enter-active) which then triggers the animation. The animation module will automatically detect the CSS code to determine when the animation ends. Once the animation is over then both CSS classes will be removed from the DOM. If a browser does not support CSS transitions or CSS animations then the animation will start and end immediately resulting in a DOM element that is at its final state. This final state is when the DOM element has no CSS transition/animation classes applied to it.

Structural transition animations

Structural transitions (such as enter, leave and move) will always apply a0snonetransition value to force the browser into rendering the styles defined in the setup (.ng-enter, .ng-leave or .ng-move) class. This means that any active transition animations operating on the element will be cut off to make way for the enter, leave or move animation.

Class-based transition animations

Class-based transitions refer to transition animations that are triggered when a CSS class is added to or removed from the element (via$animate.addClass,$animate.removeClass,$animate.setClass, or by directives such asngClass,ngModelandform). They are different when compared to structural animations since theydo not cancel existing animationsnor do theyblock successive transitionsfrom rendering on the same element. This distinction allows formultiple class-based transitionsto be performed on the same element.

In addition to ngAnimate supporting the default (natural) functionality of class-based transition animations, ngAnimate also decorates the element with starting and ending CSS classes to aid the developer in further styling the element throughout the transition animation. Earlier versions of ngAnimate may have caused natural CSS transitions to break and not render properly due to $animate temporarily blocking transitions using0snonein order to allow the setup CSS class (the-addor-removeclass) to be applied without triggering an animation. However, as ofversion 1.3, this workaround has been removed with ngAnimate and all non-ngAnimate CSS class transitions are compatible with ngAnimate.

There is, however, one special case when dealing with class-based transitions in ngAnimate. When rendering class-based transitions that make use of the setup and active CSS classes (如:.fade-addand.fade-add-activefor when.fadeis added) be sure to define the transition valueon the active CSS classand not the setup class.

.fade-add{/* remember to place a 0s transition here to ensure that the styles are applied instantly even if the element already has a transition style */transition:0slinear all;/* starting CSS styles */opacity:1;}.fade-add.fade-add-active{/* this will be the length of the animation */transition:1slinear all;opacity:0;}

The setup CSS class (in this case.fade-add) also has a transition style property, however, it has a duration of zero. This may not be required, however, incase the browser is unable to render the styling present in this CSS class instantly then it could be that the browser is attempting to perform an unnecessary transition.

This workaround, however, does not apply to standard class-based transitions that are rendered when a CSS class containing a transition is applied to an element:

.fade{/* this works as expected */transition:1slinear all;opacity:0;}

Please keep this in mind when coding the CSS markup that will be used within class-based transitions. Also, try not to mix the two class-based animation flavors together since the CSS code may become overly complex.

CSS Staggering Animations

A Staggering animation is a collection of animations that are issued with a slight delay in between each successive operation resulting in a curtain-like effect. The ngAnimate module, as of 1.2.0, supports staggering animations and the stagger effect can be performed by creating ang-EVENT-staggerCSS class and attaching that class to the base CSS class used for the animation. The style property expected within the stagger class can either be atransition-delayor ananimation-delayproperty (or both if your animation contains both transitions and keyframe animations).

.my-animation.ng-enter{/* standard transition code */-webkit-transition:1slinear all;transition:1slinear all;opacity:0;}.my-animation.ng-enter-stagger{/* this will have a 100ms delay between each successive leave animation */-webkit-transition-delay:0.1s;transition-delay:0.1s;/* in case the stagger doesn't work then these two values must be set to 0 to avoid an accidental CSS inheritance */-webkit-transition-duration:0s;transition-duration:0s;}.my-animation.ng-enter.ng-enter-active{/* standard transition styles */opacity:1;}

Staggering animations work by default in ngRepeat (so long as the CSS class is defined). Outside of ngRepeat, to use staggering animations on your own, they can be triggered by firing multiple calls to the same event on $animate. However, the restrictions surrounding this are that each of the elements must have the same CSS className value as well as the same parent element. A stagger operation will also be reset if more than 10ms has passed after the last animation has been fired.

The following code will issue theng-leave-staggerevent on the element provided:

varkids=parent.children();$animate.leave(kids[0]);//stagger index=0$animate.leave(kids[1]);//stagger index=1$animate.leave(kids[2]);//stagger index=2$animate.leave(kids[3]);//stagger index=3$animate.leave(kids[4]);//stagger index=4$timeout(Function(){//stagger has reset itself$animate.leave(kids[5]);//stagger index=0$animate.leave(kids[6]);//stagger index=1},100,false);

Stagger animations are currently only supported within CSS-defined animations.

JavaScript-defined Animations

In the event that you do not want to use CSS3 transitions or CSS3 animations or if you wish to offer animations on browsers that do not yet support CSS transitions/animations, then you can make use of JavaScript animations defined inside of your AngularJS module.

//!annotate="YourApp" Your AngularJS Module|Replace this or ngModule with the module that you used to define your application.varngModule=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 completereturnFunction(cancelled){//this (可选) 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 addedbeforeAddClass:Function(element,className,done){},//animation that can be triggered after the class is addedaddClass:Function(element,className,done){},//animation that can be triggered before the class is removedbeforeRemoveClass:Function(element,className,done){},//animation that can be triggered after the class is removedremoveClass:Function(element,className,done){}};});

JavaScript-defined animations are created with a CSS-like class selector and a collection of events which are set to run a javascript callback function. When an animation is triggered, $animate will look for a matching animation which fits the element's CSS class attribute value and then run the matching animation event function (if found). In other words, if the CSS classes present on the animated element match any of the JavaScript animations then the callback function will be executed. It should be also noted that only simple, single class selectors are allowed (compound class selectors are not supported).

Within a JavaScript animation, an object containing various event callback animation functions is expected to be returned. As explained above, these callbacks are triggered based on the animation event. Therefore if an enter animation is run, and the JavaScript animation is found, then the enter callback will handle that animation (in addition to the CSS keyframe animation or transition code that is defined via a stylesheet).

Installation

First includeangular-animate.jsin your HTML:

src="angular.js">src="angular-animate.js">

You can download this file from the following places:

  • Google CDN
    例如//ajax.googleapis.com/ajax/libs/angularjs/X.Y.Z/angular-animate.js
  • Bower
    例如
    bower install angular-animate@X.Y.Z
  • code.angularjs.org
    例如
    "//code.angularjs.org/X.Y.Z/angular-animate.js"

where X.Y.Z is the AngularJS version you are running.

Then load the module in your application by adding it as a dependent module:

angular.module('app',['ngAnimate']);

With that you're ready to get started!

模块组件

Provider

名称 描述
$animateProvider

The$animateProviderallows developers to register JavaScript animation event handlers directly inside of a module. When an animation is triggered, the $animate service will query the $animate service to find any animations that match the provided name value.

Service

名称 描述
$animate

The$animateservice provides animation detection support while performing DOM operations (enter, leave and move) as well as during addClass and removeClass operations. When any of these operations are run, the $animate service will examine any JavaScript-defined animations (which are defined by using the $animateProvider provider object) as well as any CSS-defined animations against the CSS classes present on the element once the DOM operation is run.


Vorheriger Artikel: Nächster Artikel: