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>