AngularJS 动画是构建动态用户界面的强大工具,它通过在 DOM 变化时添加平滑的过渡效果,显著提升用户体验,AngularJS 内置了对动画的支持,通过 ngAnimate 模块实现,能够与 ngRepeat、ngShow、ngHide、ngView、ngInclude 等指令无缝集成,本文将通过多个 Demo 深入探讨 AngularJS 动画的核心概念、实现方法及最佳实践。

AngularJS 动画的核心机制
AngularJS 动画的本质是监听 DOM 事件的变化,并在变化前后触发 CSS 类名的切换。ngAnimate 模块不会直接操作样式,而是通过添加和移除特定的 CSS 类(如 ng-enter、ng-leave、ng-move 等),让开发者通过 CSS 定义过渡或关键帧动画,这种机制将动画逻辑与业务逻辑分离,既保持了代码的整洁,又提供了极大的灵活性。
要启用动画功能,首先需要在 AngularJS 应用中依赖注入 ngAnimate 模块:
var app = angular.module('myApp', ['ngAnimate']);
之后,任何被 ngAnimate 监听的指令在执行 DOM 操作时,都会自动添加相应的动画类,当使用 ngRepeat 渲染列表项时,新添加的元素会获得 ng-enter 类,离开的元素会获得 ng-leave 类,而位置发生变化的元素则会获得 ng-move 类。
基于 CSS 过渡的动画实现
CSS 过渡是实现 AngularJS 动画最简单的方式,适用于元素属性(如透明度、高度、宽度)的渐变效果,以 ngShow 和 ngHide 为例,这两个指令通过切换 display 属性来控制元素的显示与隐藏,而 ngAnimate 会在此基础上添加动画类。
Demo 1:淡入淡出效果
以下代码展示了如何为 ngShow 实现淡入淡出动画:
<div ng-app="myApp" ng-controller="DemoController">
<button ng-click="toggleShow()">切换显示</button>
<div class="fade-box" ng-show="isShow"></div>
</div>
<style>
.fade-box {
width: 200px;
height: 100px;
background-color: #3498db;
margin-top: 10px;
transition: opacity 0.5s ease;
}
.fade-box.ng-hide {
opacity: 0;
}
.fade-box.ng-hide-add,
.fade-box.ng-hide-remove {
transition: opacity 0.5s linear;
}
</style>
<script>
angular.module('myApp', ['ngAnimate'])
.controller('DemoController', function($scope) {
$scope.isShow = true;
$scope.toggleShow = function() {
$scope.isShow = !$scope.isShow;
};
});
</script>
解析:

- 当
isShow为false时,ng-hide类被添加到元素上,触发opacity从1到0的过渡。 - 当
isShow为true时,ng-hide类被移除,opacity从0过渡回1。 transition属性定义了动画的持续时间和缓动函数,确保效果平滑。
基于 CSS 关键帧的动画实现
对于更复杂的动画效果(如位移、缩放、旋转),CSS 关键帧是更好的选择,关键帧允许定义动画在不同时间点的状态,实现丰富的视觉变化。
Demo 2:列表项的进入与离开动画
以下代码使用 ngRepeat 和关键帧动画,实现列表项的滑入滑出效果:
<div ng-app="myApp" ng-controller="ListController">
<input type="text" ng-model="newItem" placeholder="添加新项">
<button ng-click="addItem()">添加</button>
<ul>
<li ng-repeat="item in items" class="list-item">
{{item}}
<button ng-click="removeItem($index)">删除</button>
</li>
</ul>
</div>
<style>
.list-item {
list-style: none;
padding: 8px;
margin: 5px 0;
background-color: #2ecc71;
color: white;
border-radius: 4px;
animation: slideIn 0.5s ease;
}
.list-item.ng-enter {
animation: slideIn 0.5s ease;
}
.list-item.ng-leave {
animation: slideOut 0.5s ease;
}
@keyframes slideIn {
from {
transform: translateX(-100%);
opacity: 0;
}
to {
transform: translateX(0);
opacity: 1;
}
}
@keyframes slideOut {
from {
transform: translateX(0);
opacity: 1;
}
to {
transform: translateX(100%);
opacity: 0;
}
}
</style>
<script>
angular.module('myApp', ['ngAnimate'])
.controller('ListController', function($scope) {
$scope.items = ['苹果', '香蕉', '橙子'];
$scope.newItem = '';
$scope.addItem = function() {
if ($scope.newItem) {
$scope.items.push($scope.newItem);
$scope.newItem = '';
}
};
$scope.removeItem = function(index) {
$scope.items.splice(index, 1);
};
});
</script>
解析:
ng-enter关联slideIn关键帧,新元素从左侧滑入并淡入。ng-leave关联slideOut关键帧,元素向右滑出并淡出。animation属性确保动画在元素被添加到 DOM 时自动触发。
动画性能优化与最佳实践
尽管 AngularJS 动画能提升用户体验,但不当的使用可能导致性能问题,以下是优化建议:
-
优先使用
transform和opacity
这两个属性由 GPU 加速,能避免浏览器重排(reflow)和重绘(repaint),确保动画流畅,尽量避免对height、width、margin等属性进行动画。 -
合理设置动画时长
过长的动画会让用户等待,过短的动画则可能无法被察觉,过渡动画持续2s到5s,关键帧动画可根据复杂度适当延长。
-
使用
will-change属性
对于复杂的动画,可以提前告知浏览器元素将要变化,让浏览器提前优化:.list-item { will-change: transform, opacity; } -
避免嵌套动画
嵌套动画会增加计算负担,导致卡顿,尽量简化动画结构,减少动画元素的数量。
AngularJS 动画通过 ngAnimate 模块与 CSS 的结合,为开发者提供了简单而强大的动态效果实现方案,无论是基础的淡入淡出,还是复杂的列表项动画,都可以通过 CSS 过渡或关键帧轻松实现,遵循性能优化的最佳实践,确保动画既美观又流畅,从而打造出更具吸引力的用户界面,掌握 AngularJS 动画,不仅能提升开发效率,更能让应用在用户体验上脱颖而出。