Vue--过渡动画实现的三种方式

https://www.cnblogs.com/mrszhou/p/7859020.html

Vue--过渡动画实现的三种方式

一.使用vue的transition标签结合css样式完成动画

 

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4 <meta charset="UTF-8">
 5 <meta name="viewport" content="width=device-width, initial-scale=1.0">
 6 <meta http-equiv="X-UA-Compatible" content="ie=edge">
 7 <title>Document</title>   
 8 <style>
 9     /* .v-enter-active,.v-leave-active{
10         transition:all 2s;
11     }
12     .v-enter,.v-leave-to{
13         margin-left: 100px;
14     }
15     .v-enter-to,.v-leave{
16         margin-left:0px;
17     } */
18     .show-enter-active,.show-leave-active{
19         transition:all 2s;
20     }
21     .show-enter,.show-leave-to{
22         margin-left: 100px;
23     }
24     .show-enter-to,.show-leave{
25         margin-left:0px;
26     }
27 </style>
28 <script src="../vue2.4.4.js"></script>
29 </head>
30 
31 <body>
32 <!-- 定义一个vue的管理区块,(MVVM中的View) -->
33 <!-- 
34      如果要使用动画效果:
35         第一种方式是使用transition标签加css样式结合完成:
36         1.给需要运动的元素加入transition标签
37         2.默认情况下如果控制了transition标签元素的显示和隐藏它会默认
38         给这个元素加入一些class
39             隐藏: 加入类名:
40                     v-leave  
41                     v-leave-active 
42                     v-leave-to
43 
44             显示: 加入类名:
45                     v-enter  准备进行运动的状态(起始状态)
46                     v-enter-active  整个运动状态
47                     v-enter-to  整个运动状态(强调运动的结果,结束状态)
48         3.将来如果给transition设置一个name为“show”以后,将来所有的类的名称都需要改变,默认前缀为v-
49           如果加入了name属性,需要将v- 改为show-
50  -->
51 <div id="app">
52       <button @click="toggle">显示/隐藏</button><br>
53       <!-- <transition > -->
54       <transition name="show" >
55             <span class="show" v-show="isshow">it 传说</span>
56       </transition>
57 </div>
58 
59 </body>
60 
61 <script>
62 
63     // 实例化vue对象(MVVM中的View Model)
64     new Vue({
65         // vm控制的区块为id为app的div,此div中的所有vue指令均可以被vm解析
66         el:'#app',
67         data:{
68         // 数据 (MVVM中的Model)
69             isshow:false
70         },
71         methods:{
72             toggle:function(){
73                 this.isshow = !this.isshow;
74             }
75         }
76     })
77 </script>
78 </html>

 

二.利用animate.css结合transition实现动画

animate.css   演示地址 : https://daneden.github.io/animate.css/

 View Code

实例代码:

 

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4 <meta charset="UTF-8">
 5 <meta name="viewport" content="width=device-width, initial-scale=1.0">
 6 <meta http-equiv="X-UA-Compatible" content="ie=edge">
 7 <title>Document</title>   
 8 <link rel="stylesheet" href="../animate.css">
 9 <script src="../vue2.4.4.js"></script>
10 </head>
11 
12 <body>
13 <!-- 定义一个vue的管理区块,(MVVM中的View) -->
14 <div id="app">
15     <button @click="toggle">显示/隐藏</button><br>
16     <transition 
17     enter-active-class="animated fadeInRight"
18     leave-active-class="animated fadeOutRight"
19     >
20     <!-- 坑:span行内元素(行内元素没有宽) 
21          应该改为块级元素
22     -->
23           <!-- <span class="show" v-show="isshow">it创业</span> -->
24           <div style="width:200px" class="show" v-show="isshow">it创业</div> 
25     </transition>
26 </div>
27 </body>
28 
29 <script>
30 
31     // 实例化vue对象(MVVM中的View Model)
32     new Vue({
33         // vm控制的区块为id为app的div,此div中的所有vue指令均可以被vm解析
34         el:'#app',
35         data:{
36         // 数据 (MVVM中的Model)   
37             isshow:false
38         },
39         methods:{
40             toggle:function() {
41                 this.isshow = !this.isshow;
42             }
43         }
44     })
45 </script>
46 </html>

 

三.利用 vue中的钩子函数实现动画

 

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 
 4 <head>
 5     <meta charset="UTF-8">
 6     <meta name="viewport" content="width=device-width, initial-scale=1.0">
 7     <meta http-equiv="X-UA-Compatible" content="ie=edge">
 8     <title>Document</title>
 9     <style>
10         .show {
11             transition: all 0.5s;
12         }
13     </style>
14     <script src="../vue2.4.4.js"></script>
15 </head>
16 
17 <body>
18     <!-- 定义一个vue的管理区块,(MVVM中的View) -->
19     <div id="app">
20         <button @click="toggle">显示/隐藏</button><br>
21         <transition @before-enter="beforeEnter" @enter="enter" @after-enter="afterEnter">
22             <div class="show"  v-show="isshow">itcast 传智</div>
23         </transition>
24     </div>
25 
26 </body>
27 
28 <script>
29     // 实例化vue对象(MVVM中的View Model)
30     new Vue({
31         // vm控制的区块为id为app的div,此div中的所有vue指令均可以被vm解析
32         el: '#app',
33         data: {
34             // 数据 (MVVM中的Model)   
35             isshow: false
36         },
37         methods: {
38             toggle: function () {
39                 this.isshow = !this.isshow;
40             },
41             // 以下三个与enter相关的方法只会在元素由隐藏变为显示的时候才会执行
42             // el:指的是当前调用这个方法的元素对象
43             // done:用来决定是否要执行后续的代码如果不执行这个方法,那么将来执行完before执行完enter以后动画就会停止  
44             beforeEnter: function (el) {
45                 console.log("beforeEnter");
46                 // 当入场之前会执行 v-enter
47                 el.style = "padding-left:100px";
48             },
49             enter: function (el, done) {
50                 // 当进行的过程中每执行 v-enter-active
51                 console.log("enter");
52                 // 为了能让代码正常进行,在设置了结束状态后必须调用一下这个元素的
53                 // offsetHeight / offsetWeight  只是为了让动画执行
54                 el.offsetHeight;
55 
56                 // 结束的状态最后啊写在enter中
57                 el.style = "padding-left:0px";
58 
59 
60                 // 执行done继续向下执行
61                 done();
62             },
63             afterEnter: function (el) {
64                 // 当执行完毕以后会执行
65                 console.log("afterEnter");
66                 this.isshow = false;
67             }
68         }
69     })
70 
71 </script>
72 
73 </html>

 

四.完成品牌管理案例的vue中的动画完成删除提示

 

  1 <!DOCTYPE html>
  2 <html lang="en">
  3 
  4 <head>
  5     <meta charset="UTF-8">
  6     <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7     <meta http-equiv="X-UA-Compatible" content="ie=edge">
  8     <title>Document</title>
  9     <style>
 10         #app {
 11             width: 600px;
 12             margin: 10px auto;
 13         }
 14 
 15         .tb {
 16             border-collapse: collapse;
 17             width: 100%;
 18         }
 19 
 20         .tb th {
 21             background-color: #0094ff;
 22             color: white;
 23         }
 24 
 25         .tb td,
 26         .tb th {
 27             padding: 5px;
 28             border: 1px solid black;
 29             text-align: center;
 30         }
 31 
 32         .add {
 33             padding: 5px;
 34             border: 1px solid black;
 35             margin-bottom: 10px;
 36         }
 37 
 38         .del li{
 39         list-style: none;
 40         padding: 10px;
 41       }
 42 
 43     .del{
 44         position: absolute;
 45         top:45%;   
 46         left: 45%;                 
 47         width: 300px;
 48         border: 1px solid rgba(0,0,0,0.2);
 49         transition: all 0.5s;
 50     }
 51     </style>
 52     <script src="../vue2.4.4.js"></script>
 53 </head>
 54 
 55 <body>
 56     <div id="app">
 57         <div class="add">
 58             编号: <input id="id" v-color="color" v-focus type="text" v-model="id">品牌名称: <input v-model="name" type="text">
 59             <button @click="add">添加</button>
 60         </div>
 61         <div class="add">品牌名称:<input type="text"></div>
 62         <div>
 63             <table class="tb">
 64                 <tr>
 65                     <th>编号</th>
 66                     <th>品牌名称</th>
 67                     <th>创立时间</th>
 68                     <th>操作</th>
 69                 </tr>
 70                 <tr v-if="list.length <= 0">
 71                     <td colspan="4">没有品牌数据</td>
 72                 </tr>
 73                 <!--加入: key="index" 时候必须把所有参数写完整  -->
 74                 <tr v-for="(item,key,index) in list" :key="index">
 75                     <td>{{item.id}}</td>
 76                     <td>{{item.name}}</td>
 77                     <td>{{item.ctime | dateFrm("/")}}</td>
 78                     <!-- 使用vue来注册事件时,我们在dom元素中是看不到的 -->
 79                     <td><a href="javascript:void(0)" @click="del(item.id)">删除</a></td>
 80                 </tr>
 81             </table>
 82         </div>
 83 
 84         <transition
 85             @before-enter="beforeEnter" 
 86             @enter="enter"
 87             @after-enter ="afterEnter"
 88             @before-leave="beforeLeave" 
 89             @leave="leave"
 90             @after-leave ="afterLeave"
 91         >
 92             <div class="del" v-show="isshow">
 93                 <ul>
 94                     <li>您确定要删除当前数据吗</li>
 95                     <li>
 96                         <button @click="delById">确定</button>
 97                         <button @click="showClose">关闭</button>
 98                     </li>
 99                 </ul>
100             </div>
101         </transition>
102 
103     </div>
104 </body>
105 
106 </html>
107 
108 <script>
109     // 使用全局过滤器(公有过滤器)
110     Vue.filter("dateFrm", function (time,spliceStr) {
111         // return "2017-11-16";
112         var date = new Date(time);
113         //得到年
114         var year = date.getFullYear();
115         // 得到月
116         var month = date.getMonth() + 1;
117         // 得到日
118         var day = date.getDate();
119         return year + spliceStr + month + spliceStr + day;
120     });
121 
122 
123     // 先将自定义指令定义好
124     // directive有两个参数
125     //参数一: 自定义指令 v-focus
126     //参数二: 对象,对象中可以添加很多方法
127     // 添加一个inserted方法:而这个方法中又有两个参数:
128     //参数一:el 当前使用自定义指令的对象
129     //参数二:obj 是指它(v-color="color" )后面设置的表达式
130     //{expression:"color",value:"red",}
131     Vue.directive("focus", {
132         inserted: function (el, obj) {
133             // console.log(el);
134             el.focus();
135         }
136     });
137     Vue.directive("color", {
138         inserted: function (el, obj) {
139             // obj.style.color = "red";
140             obj.style.color = obj.value;//????????????
141             console.log(obj.value);
142         }
143     });
144 
145     var vm = new Vue({
146         el: "#app",
147         data: {
148             delId:"",// 用来将要删除数据的id进行保存
149             isshow:false,
150             color: "green",
151             id: 0,
152             name: '',
153             list: [
154                 { "id": 1, "name": "itcast", "ctime": Date() },
155                 { "id": 2, "name": "黑马", "ctime": Date() }
156             ]
157         },
158         // mounted(){
159         //     this.getFocus()
160         // },
161         methods: {
162             add: function () {
163                 //将id和namepush到list数组中
164                 this.list.push({ "id": this.id, "name": this.name, "ctime": Date() });
165             },
166             del: function (id) {
167                 this.isshow = true;
168                 // 将得到的id保存到delId里面
169                 this.delId = id;    
170             },
171             beforeEnter:function(el) {
172                 el.style.left = "100%";
173             },
174             enter:function(el,done) {
175                 el.offsetHeight;
176                 el.style.left = "35%";                
177             },
178             afterEnter:function(el){
179                 
180             },
181             beforeLeave:function(el){
182                 el.style.left = "35%";
183             },
184             leave:function(el,done){
185                 el.offsetHeight;
186                 el.style.left = "100%";
187                 setTimeout(function(){
188                     done();
189                 },500);
190             },
191             afterLeave:function(el){
192                 
193             },
194             showClose:function(el){
195                 this.isshow = false;
196             },
197             delById:function() {
198                 _this = this;
199                 // 根据DelId删除对应的数据 
200                  var index = this.list.findIndex(function(item){
201                     return item.id ==_this.delId;
202                 });
203                 this.list.splice(index,1);
204                 // 关闭删除框
205                 this.isshow = false;
206             }
207         }
208     });
209 
210 </script>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值