AngularJS中实现显示或隐藏动画效果的3种方式

 

本篇体验在AngularJS中实现在"显示/隐藏"这2种状态切换间添加动画效果。

通过CSS方式实现显示/隐藏动画效果

思路:

→npm install angular-animage
→依赖:var app = angular.module("app",["ngAnimate"]);
→controller中一个变量接收bool值
→界面中提供一个按钮,点击改变bool值
→界面中显示/隐藏的区域提供ng-if和controller中的bool值绑定

app.js

var app = angular.module("app",["ngAnimate"]);

app.controller("AppCtrl", function(){
    this.toggle = true;
})

 

index.html

复制代码
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title></title>
  <link rel="stylesheet" href="../node_modules/bootstrap/dist/css/bootstrap.min.css"/>
  <link rel="stylesheet" href="styles.css"/>
</head>
<body ng-app="app" ng-controller="AppCtrl as app">

<button class="btn" ng-click="app.toggle=!app.toggle">Toggle Animation</button>

<div class="toggle" ng-if="app.toggle">Some content here</div>


<script src="../node_modules/angular/angular.min.js"></script>
<script src="../node_modules/angular-animate/angular-animate.min.js"></script>
<script src="app.js"></script>
</body>
</html>
复制代码

 

styes.css

复制代码
.toggle{
  -webkit-transition: linear 1s;
  -moz-transition: linear 1s;
  -ms-transition: linear 1s;
  -o-transition: linear 1s;
  transition: linear 1s;
}

.toggle.ng-enter{
  opacity: 0;
}

.toggle.ng-enter-active{
  opacity: 1;
}

.toggle.ng-leave{
  opacity: 1;
}

.toggle.ng-leave-active{
  opacity: 0;
}
复制代码

 

通过animation方法实现显示/隐藏动画效果

 

复制代码
app.animation("某个类名", function(){
    return {
        leave: function(element, done){
        
        },
        enter: function(element, done){
        
        }
    }
})
复制代码

 

animation可以在某个类名上加上leave,enter事件,leave和enter函数内部如何实现动画效果呢?可以通过TweenMax.min.js实现。

app1.js

复制代码
ar app = angular.module("app",["ngAnimate"]);

app.controller("AppCtrl", function(){
    this.toggle = true;
})

app.animation(".toggle", function(){
    return {
        leave: function(element, done){
            //element.text("nooooo");
            TweenMax.to(element, 1, {opacity:0, onComplete:done})
        },
        enter: function(element, done){
            TweenMax.from(element, 1, {opacity:0, onComplete:done})
        }
    }
})
复制代码

 

index1.html

复制代码
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title></title>
  <link rel="stylesheet" href="../node_modules/topcoat/css/topcoat-desktop-light.min.css"/>
</head>
<body class="well-lg" ng-app="app" ng-controller="AppCtrl as app">

<button class="topcoat-button--large--cta" ng-click="app.toggle = !app.toggle">点我</button>

<hr/>

<div class="topcoat-notification toggle" ng-if="app.toggle">I'm too your to fade</div>

<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/gsap/1.18.0/TweenMax.min.js"></script>
<script src="../node_modules/angular/angular.min.js"></script>
<script src="../node_modules/angular-animate/angular-animate.min.js"></script>
<script src="app1.js"></script>
</body>
</html>
复制代码

 

其中,npm install topcoat是一个很好的样式库。

使用direcive的方式实现显示/隐藏动画效果

是否可以在显示/隐藏的div部分加上一个属性,比如hide-me="app.isHidden",hide-me这个属性监控app.isHidden,根据值的变化情况再来决定是否显示。

 

app3.js

复制代码
var app=angular.module('app',["ngAnimate"]);

app.controller("AppCtrl", function(){

    this.isHidden = false;

    this.fadeIt = function(){
        //TweenMax.to($("#my-badge"), 1, {opacity:0})
        this.isHidden = !this.isHidden;
    }
})

app.directive("hideMe", function($animate){
    return function(scope, element, attrs){
        scope.$watch(attrs.hideMe, function(newVal){
            if(newVal){
                //TweenMax.to(element, 1, {opacity:0});
                $animate.addClass(element, "fade");
            } else{
                $animate.removeClass(element, "fade");
            }
        })
    }
})

app.animation(".fade", function(){
    return {
        addClass: function(element, className){
            TweenMax.to(element, 1, {opacity:0});
        },
        removeClass: function(element, className){
            TweenMax.to(element, 1, {opacity:1});
        }
    }
})
复制代码

 

index3.html

复制代码
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title></title>
  <link rel="stylesheet" href="../node_modules/bootstrap/dist/css/bootstrap.min.css"/>
</head>
<body ng-app="app" ng-controller="AppCtrl as app">

<button id="my-button" class="btn-primary" ng-click="app.fadeIt()">Click to fade</button>
<div id="my-badge" class="badge" hide-me="app.isHidden">Fade me</div>

<script src="../node_modules/jquery/dist/jquery.min.js"></script>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/gsap/1.18.0/TweenMax.min.js"></script>
<script src="../node_modules/angular/angular.min.js"></script>
<script src="../node_modules/angular-animate/angular-animate.min.js"></script>
<script src="app3.js"></script>
</body>
</html>
复制代码

 

posted @   Darren Ji  阅读(11154)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
历史上的今天:
2014-12-31 写一个限制上传文件大小和格式的jQuery插件
2014-12-31 jQuery统计上传文件的大小

我的公众号:新语新世界,欢迎关注。

点击右上角即可分享
微信分享提示