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{

  1. 19 transition:all 2s;

  2. 20 }

  3. 21 .show-enter,.show-leave-to{

  4. 22 margin-left: 100px;

  5. 23 }

  6. 24 .show-enter-to,.show-leave{

  7. 25 margin-left:0px;

  8. 26 }

  9. 27 </style>

  10. 28 <script src="../vue2.4.4.js"></script>

  11. 29 </head>

  12. 30

  13. 31 <body>

  14. 32 <!-- 定义一个vue的管理区块,(MVVM中的View) -->

  15. 33 <!--

  16. 34 如果要使用动画效果:

  17. 35 第一种方式是使用transition标签加css样式结合完成:

  18. 36 1.给需要运动的元素加入transition标签

  19. 37 2.默认情况下如果控制了transition标签元素的显示和隐藏它会默认

  20. 38 给这个元素加入一些class

  21. 39 隐藏: 加入类名:

  22. 40 v-leave

  23. 41 v-leave-active

  24. 42 v-leave-to

  25. 43

  26. 44 显示: 加入类名:

  27. 45 v-enter 准备进行运动的状态(起始状态)

  28. 46 v-enter-active 整个运动状态

  29. 47 v-enter-to 整个运动状态(强调运动的结果,结束状态)

  30. 48 3.将来如果给transition设置一个name为“show”以后,将来所有的类的名称都需要改变,默认前缀为v-

  31. 49 如果加入了name属性,需要将v- 改为show-

  32. 50 -->

  33. 51 <div id="app">

  34. 52 <button @click="toggle">显示/隐藏</button><br>

  35. 53 <!-- <transition > -->

  36. 54 <transition name="show" >

  37. 55 <span class="show" v-show="isshow">it 传说</span>

  38. 56 </transition>

  39. 57 </div>

  40. 58

  41. 59 </body>

  42. 60

  43. 61 <script>

  44. 62

  45. 63 // 实例化vue对象(MVVM中的View Model)

  46. 64 new Vue({

  47. 65 // vm控制的区块为id为app的div,此div中的所有vue指令均可以被vm解析

  48. 66 el:'#app',

  49. 67 data:{

  50. 68 // 数据 (MVVM中的Model)

  51. 69 isshow:false

  52. 70 },

  53. 71 methods:{

  54. 72 toggle:function(){

  55. 73 this.isshow = !this.isshow;

  56. 74 }

  57. 75 }

  58. 76 })

  59. 77 </script>

  60. 78 </html>

 

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

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

 View Code

实例代码:

 

 
  1. 1 <!DOCTYPE html>

  2. 2 <html lang="en">

  3. 3 <head>

  4. 4 <meta charset="UTF-8">

  5. 5 <meta name="viewport" content="width=device-width, initial-scale=1.0">

  6. 6 <meta http-equiv="X-UA-Compatible" content="ie=edge">

  7. 7 <title>Document</title>

  8. 8 <link rel="stylesheet" href="../animate.css">

  9. 9 <script src="../vue2.4.4.js"></script>

  10. 10 </head>

  11. 11

  12. 12 <body>

  13. 13 <!-- 定义一个vue的管理区块,(MVVM中的View) -->

  14. 14 <div id="app">

  15. 15 <button @click="toggle">显示/隐藏</button><br>

  16. 16 <transition

  17. 17 enter-active-class="animated fadeInRight"

  18. 18 leave-active-class="animated fadeOutRight"

  19. 19 >

  20. 20 <!-- 坑:span行内元素(行内元素没有宽)

  21. 21 应该改为块级元素

  22. 22 -->

  23. 23 <!-- <span class="show" v-show="isshow">it创业</span> -->

  24. 24 <div style="width:200px" class="show" v-show="isshow">it创业</div>

  25. 25 </transition>

  26. 26 </div>

  27. 27 </body>

  28. 28

  29. 29 <script>

  30. 30

  31. 31 // 实例化vue对象(MVVM中的View Model)

  32. 32 new Vue({

  33. 33 // vm控制的区块为id为app的div,此div中的所有vue指令均可以被vm解析

  34. 34 el:'#app',

  35. 35 data:{

  36. 36 // 数据 (MVVM中的Model)

  37. 37 isshow:false

  38. 38 },

  39. 39 methods:{

  40. 40 toggle:function() {

  41. 41 this.isshow = !this.isshow;

  42. 42 }

  43. 43 }

  44. 44 })

  45. 45 </script>

  46. 46 </html>

 

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

 

 
  1. 1 <!DOCTYPE html>

  2. 2 <html lang="en">

  3. 3

  4. 4 <head>

  5. 5 <meta charset="UTF-8">

  6. 6 <meta name="viewport" content="width=device-width, initial-scale=1.0">

  7. 7 <meta http-equiv="X-UA-Compatible" content="ie=edge">

  8. 8 <title>Document</title>

  9. 9 <style>

  10. 10 .show {

  11. 11 transition: all 0.5s;

  12. 12 }

  13. 13 </style>

  14. 14 <script src="../vue2.4.4.js"></script>

  15. 15 </head>

  16. 16

  17. 17 <body>

  18. 18 <!-- 定义一个vue的管理区块,(MVVM中的View) -->

  19. 19 <div id="app">

  20. 20 <button @click="toggle">显示/隐藏</button><br>

  21. 21 <transition @before-enter="beforeEnter" @enter="enter" @after-enter="afterEnter">

  22. 22 <div class="show" v-show="isshow">itcast 传智</div>

  23. 23 </transition>

  24. 24 </div>

  25. 25

  26. 26 </body>

  27. 27

  28. 28 <script>

  29. 29 // 实例化vue对象(MVVM中的View Model)

  30. 30 new Vue({

  31. 31 // vm控制的区块为id为app的div,此div中的所有vue指令均可以被vm解析

  32. 32 el: '#app',

  33. 33 data: {

  34. 34 // 数据 (MVVM中的Model)

  35. 35 isshow: false

  36. 36 },

  37. 37 methods: {

  38. 38 toggle: function () {

  39. 39 this.isshow = !this.isshow;

  40. 40 },

  41. 41 // 以下三个与enter相关的方法只会在元素由隐藏变为显示的时候才会执行

  42. 42 // el:指的是当前调用这个方法的元素对象

  43. 43 // done:用来决定是否要执行后续的代码如果不执行这个方法,那么将来执行完before执行完enter以后动画就会停止

  44. 44 beforeEnter: function (el) {

  45. 45 console.log("beforeEnter");

  46. 46 // 当入场之前会执行 v-enter

  47. 47 el.style = "padding-left:100px";

  48. 48 },

  49. 49 enter: function (el, done) {

  50. 50 // 当进行的过程中每执行 v-enter-active

  51. 51 console.log("enter");

  52. 52 // 为了能让代码正常进行,在设置了结束状态后必须调用一下这个元素的

  53. 53 // offsetHeight / offsetWeight 只是为了让动画执行

  54. 54 el.offsetHeight;

  55. 55

  56. 56 // 结束的状态最后啊写在enter中

  57. 57 el.style = "padding-left:0px";

  58. 58

  59. 59

  60. 60 // 执行done继续向下执行

  61. 61 done();

  62. 62 },

  63. 63 afterEnter: function (el) {

  64. 64 // 当执行完毕以后会执行

  65. 65 console.log("afterEnter");

  66. 66 this.isshow = false;

  67. 67 }

  68. 68 }

  69. 69 })

  70. 70

  71. 71 </script>

  72. 72

  73. 73 </html>

 

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

 

 
  1. 1 <!DOCTYPE html>

  2. 2 <html lang="en">

  3. 3

  4. 4 <head>

  5. 5 <meta charset="UTF-8">

  6. 6 <meta name="viewport" content="width=device-width, initial-scale=1.0">

  7. 7 <meta http-equiv="X-UA-Compatible" content="ie=edge">

  8. 8 <title>Document</title>

  9. 9 <style>

  10. 10 #app {

  11. 11 width: 600px;

  12. 12 margin: 10px auto;

  13. 13 }

  14. 14

  15. 15 .tb {

  16. 16 border-collapse: collapse;

  17. 17 width: 100%;

  18. 18 }

  19. 19

  20. 20 .tb th {

  21. 21 background-color: #0094ff;

  22. 22 color: white;

  23. 23 }

  24. 24

  25. 25 .tb td,

  26. 26 .tb th {

  27. 27 padding: 5px;

  28. 28 border: 1px solid black;

  29. 29 text-align: center;

  30. 30 }

  31. 31

  32. 32 .add {

  33. 33 padding: 5px;

  34. 34 border: 1px solid black;

  35. 35 margin-bottom: 10px;

  36. 36 }

  37. 37

  38. 38 .del li{

  39. 39 list-style: none;

  40. 40 padding: 10px;

  41. 41 }

  42. 42

  43. 43 .del{

  44. 44 position: absolute;

  45. 45 top:45%;

  46. 46 left: 45%;

  47. 47 width: 300px;

  48. 48 border: 1px solid rgba(0,0,0,0.2);

  49. 49 transition: all 0.5s;

  50. 50 }

  51. 51 </style>

  52. 52 <script src="../vue2.4.4.js"></script>

  53. 53 </head>

  54. 54

  55. 55 <body>

  56. 56 <div id="app">

  57. 57 <div class="add">

  58. 58 编号: <input id="id" v-color="color" v-focus type="text" v-model="id">品牌名称: <input v-model="name" type="text">

  59. 59 <button @click="add">添加</button>

  60. 60 </div>

  61. 61 <div class="add">品牌名称:<input type="text"></div>

  62. 62 <div>

  63. 63 <table class="tb">

  64. 64 <tr>

  65. 65 <th>编号</th>

  66. 66 <th>品牌名称</th>

  67. 67 <th>创立时间</th>

  68. 68 <th>操作</th>

  69. 69 </tr>

  70. 70 <tr v-if="list.length <= 0">

  71. 71 <td colspan="4">没有品牌数据</td>

  72. 72 </tr>

  73. 73 <!--加入: key="index" 时候必须把所有参数写完整 -->

  74. 74 <tr v-for="(item,key,index) in list" :key="index">

  75. 75 <td>{{item.id}}</td>

  76. 76 <td>{{item.name}}</td>

  77. 77 <td>{{item.ctime | dateFrm("/")}}</td>

  78. 78 <!-- 使用vue来注册事件时,我们在dom元素中是看不到的 -->

  79. 79 <td><a href="javascript:void(0)" @click="del(item.id)">删除</a></td>

  80. 80 </tr>

  81. 81 </table>

  82. 82 </div>

  83. 83

  84. 84 <transition

  85. 85 @before-enter="beforeEnter"

  86. 86 @enter="enter"

  87. 87 @after-enter ="afterEnter"

  88. 88 @before-leave="beforeLeave"

  89. 89 @leave="leave"

  90. 90 @after-leave ="afterLeave"

  91. 91 >

  92. 92 <div class="del" v-show="isshow">

  93. 93 <ul>

  94. 94 <li>您确定要删除当前数据吗</li>

  95. 95 <li>

  96. 96 <button @click="delById">确定</button>

  97. 97 <button @click="showClose">关闭</button>

  98. 98 </li>

  99. 99 </ul>

  100. 100 </div>

  101. 101 </transition>

  102. 102

  103. 103 </div>

  104. 104 </body>

  105. 105

  106. 106 </html>

  107. 107

  108. 108 <script>

  109. 109 // 使用全局过滤器(公有过滤器)

  110. 110 Vue.filter("dateFrm", function (time,spliceStr) {

  111. 111 // return "2017-11-16";

  112. 112 var date = new Date(time);

  113. 113 //得到年

  114. 114 var year = date.getFullYear();

  115. 115 // 得到月

  116. 116 var month = date.getMonth() + 1;

  117. 117 // 得到日

  118. 118 var day = date.getDate();

  119. 119 return year + spliceStr + month + spliceStr + day;

  120. 120 });

  121. 121

  122. 122

  123. 123 // 先将自定义指令定义好

  124. 124 // directive有两个参数

  125. 125 //参数一: 自定义指令 v-focus

  126. 126 //参数二: 对象,对象中可以添加很多方法

  127. 127 // 添加一个inserted方法:而这个方法中又有两个参数:

  128. 128 //参数一:el 当前使用自定义指令的对象

  129. 129 //参数二:obj 是指它(v-color="color" )后面设置的表达式

  130. 130 //{expression:"color",value:"red",}

  131. 131 Vue.directive("focus", {

  132. 132 inserted: function (el, obj) {

  133. 133 // console.log(el);

  134. 134 el.focus();

  135. 135 }

  136. 136 });

  137. 137 Vue.directive("color", {

  138. 138 inserted: function (el, obj) {

  139. 139 // obj.style.color = "red";

  140. 140 obj.style.color = obj.value;//????????????

  141. 141 console.log(obj.value);

  142. 142 }

  143. 143 });

  144. 144

  145. 145 var vm = new Vue({

  146. 146 el: "#app",

  147. 147 data: {

  148. 148 delId:"",// 用来将要删除数据的id进行保存

  149. 149 isshow:false,

  150. 150 color: "green",

  151. 151 id: 0,

  152. 152 name: '',

  153. 153 list: [

  154. 154 { "id": 1, "name": "itcast", "ctime": Date() },

  155. 155 { "id": 2, "name": "黑马", "ctime": Date() }

  156. 156 ]

  157. 157 },

  158. 158 // mounted(){

  159. 159 // this.getFocus()

  160. 160 // },

  161. 161 methods: {

  162. 162 add: function () {

  163. 163 //将id和namepush到list数组中

  164. 164 this.list.push({ "id": this.id, "name": this.name, "ctime": Date() });

  165. 165 },

  166. 166 del: function (id) {

  167. 167 this.isshow = true;

  168. 168 // 将得到的id保存到delId里面

  169. 169 this.delId = id;

  170. 170 },

  171. 171 beforeEnter:function(el) {

  172. 172 el.style.left = "100%";

  173. 173 },

  174. 174 enter:function(el,done) {

  175. 175 el.offsetHeight;

  176. 176 el.style.left = "35%";

  177. 177 },

  178. 178 afterEnter:function(el){

  179. 179

  180. 180 },

  181. 181 beforeLeave:function(el){

  182. 182 el.style.left = "35%";

  183. 183 },

  184. 184 leave:function(el,done){

  185. 185 el.offsetHeight;

  186. 186 el.style.left = "100%";

  187. 187 setTimeout(function(){

  188. 188 done();

  189. 189 },500);

  190. 190 },

  191. 191 afterLeave:function(el){

  192. 192

  193. 193 },

  194. 194 showClose:function(el){

  195. 195 this.isshow = false;

  196. 196 },

  197. 197 delById:function() {

  198. 198 _this = this;

  199. 199 // 根据DelId删除对应的数据

  200. 200 var index = this.list.findIndex(function(item){

  201. 201 return item.id ==_this.delId;

  202. 202 });

  203. 203 this.list.splice(index,1);

  204. 204 // 关闭删除框

  205. 205 this.isshow = false;

  206. 206 }

  207. 207 }

  208. 208 });

  209. 209

  210. 210 </script>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值