本文引入类库的方式均采用CND的方式,可直接复制代码到编辑器中学习和测试
-
不使用动画切换元素
1 <div id="app"> 2 <input type="button" value="toggle" @click="flag=!flag"> 3 <!-- 需求:点击按钮,让h3显示,再点击让h3隐藏 --> 4 <h3 v-if="flag">这是一个H3</h3> 5 </div> 6 <script> 7 // 创建Vue实例,得到ViewModel 8 var vm = new Vue({ 9 el: '#app', 10 data: { 11 flag: false 12 }, 13 methods: {} 14 }); 15 </script>
-
使用过渡类名实现动画
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<!-- 2. 自定义两组样式,来控制 transition 内部的元素实现动画 --> <style> /* v-enter 【这是一个时间点】 是进入之前,元素的起始状态,此时还没有开始进入 v-leave-to【这是一个时间点】 是动画离开之后,离开的终止状态,此时元素动画已经结束了 */ .v-enter,.v-leave-to { opacity: 0; transform: translateX(150px); } /* v-enter-active 【入场动画的时间段】 v-leave-active 【离场动画的时间段】 */ .v-enter-active,.v-leave-active { transition: all 0.8s ease; } </style> </head> <body> <div id="app"> <input type="button" value="toggle" @click="flag=!flag"> <!-- 需求: 点击按钮,让h3显示,再点击,让h3隐藏 --> <!-- 1. 使用 transition元素,把需要被动画控制的元素包裹起来 --> <!-- transition元素,是Vue官方提供的 --> <transition> <h3 v-if="flag">这是一个H3</h3> </transition> </div> <script> // 创建Vue实例,得到ViewModel var vm = new Vue({ el: '#app', data: { flag: false }, methods: {} }); </script> </body> </html>
-
修改“v-”前缀用上面一种方式实现多个动画
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>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
9 <!-- 2. 自定义两组样式,来控制 transition 内部的元素实现动画 --> 10 <style> 11 /* v-enter 【这是一个时间点】 是进入之前,元素的起始状态,此时还没有开始进入 12 v-leave-to【这是一个时间点】 是动画离开之后,离开的终止状态,此时元素动画已经结束了 */ 13 .v-enter, 14 .v-leave-to { 15 opacity: 0; 16 transform: translateX(150px); 17 } 18 /* v-enter-active 【入场动画的时间段】 19 v-leave-active 【离场动画的时间段】 */ 20 .v-enter-active, 21 .v-leave-active { 22 transition: all 0.8s ease; 23 } 24 25 .my-enter, 26 .my-leave-to { 27 opacity: 0; 28 transform: translateY(70px); 29 } 30 31 .my-enter-active, 32 .my-leave-active { 33 transition: all 0.8s ease; 34 } 35 </style> 36 </head> 37 38 <body> 39 <div id="app"> 40 <input type="button" value="toggle" @click="flag=!flag"> 41 <!-- 需求: 点击按钮,让h3显示,再点击,让h3隐藏 --> 42 <!-- 1. 使用transition元素,把需要被动画控制的元素,包裹起来 --> 43 <!-- transition元素,是Vue官方提供的 --> 44 <transition> 45 <h3 v-if="flag">这是一个H3</h3> 46 </transition> 47 <hr> 48 <input type="button" value="toggle2" @click="flag2=!flag2"> 49 <transition name="my"> 50 <h6 v-if="flag2">这是一个H6</h6> 51 </transition> 52 </div> 53 <script> 54 // 创建Vue实例,得到ViewModel 55 var vm = new Vue({ 56 el: '#app', 57 data: { 58 flag: false, 59 flag2: false 60 }, 61 methods: {} 62 }); 63 </script> 64 </body> 65 66 </html>
-
使用第三方类库来实现
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 <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script> 10 <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/animate.css@3.5.2/animate.min.css"> 11 <!-- 入场 bounceIn 离场 bounceOut --> 12 </head> 13 14 <body> 15 <div id="app"> 16 <input type="button" value="toggle" @click="flag=!flag"> 17 <!-- 使用 :duration="{ enter: 200, leave: 400 }" 来分别设置入场的时长和离场的时长 --> 18 <transition enter-active-class="bounceIn" leave-active-class="bounceOut" :duration="{ enter: 200, leave: 400 }"> 19 <h3 v-if="flag" class="animated">这是一个H3</h3> 20 </transition> 21 </div> 22 23 <script> 24 // 创建Vue实例,得到ViewModel 25 var vm = new Vue({ 26 el: '#app', 27 data: { 28 flag: false 29 }, 30 methods: {} 31 }); 32 </script> 33 </body> 34 35 </html>
-
使用钩子函数模拟-动画的生命周期函数
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>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
9 <style> 10 .ball { 11 width: 15px; 12 height: 15px; 13 border-radius: 50%; 14 background-color: red; 15 } 16 </style> 17 </head> 18 <body> 19 <div id="app"> 20 <input type="button" value="快到碗里来" @click="flag=!flag"> 21 <!-- 1. 使用 transition 元素把 小球包裹起来 --> 22 <transition @before-enter="beforeEnter" @enter="enter" @after-enter="afterEnter"> 23 <div class="ball" v-show="flag"></div> 24 </transition> 25 </div> 26 27 <script> 28 29 // 创建 Vue 实例,得到 ViewModel 30 var vm = new Vue({ 31 el: '#app', 32 data: { 33 flag: false 34 }, 35 methods: { 36 // 注意: 动画钩子函数的第一个参数:el,表示 要执行动画的那个DOM元素,是个原生的 JS DOM对象 37 // 大家可以认为 , el 是通过 document.getElementById('') 方式获取到的原生JS DOM对象 38 beforeEnter(el) { 39 // beforeEnter 表示动画入场之前,此时动画尚未开始,可以在beforeEnter中设置元素开始动画之前的起始样式 40 // 设置小球开始动画之前的起始位置 41 el.style.transform = "translate(0, 0)" 42 }, 43 enter(el, done) { 44 // 这句话没有实际的作用,但是,如果不写,出不来动画效果; 45 // 可以认为 el.offsetWidth 会强制动画刷新 46 el.offsetWidth 47 // enter 表示动画 开始之后的样式,这里,可以设置小球完成动画之后的,结束状态 48 el.style.transform = "translate(150px, 450px)" 49 el.style.transition = 'all 1s ease' 50 51 // 这里的done,起始就是afterEnter这个函数,也就是说:done是afterEnter函数的引用 52 done() 53 }, 54 afterEnter(el) { 55 // 动画完成之后,会调用afterEnter 56 // console.log('ok') 57 this.flag = !this.flag 58 } 59 } 60 }); 61 </script> 62 </body> 63 64 </html>
-
动画列表
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 <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script> 10 <style> 11 li { 12 margin: 5px; 13 line-height: 35px; 14 padding-left: 5px; 15 font-size: 12px; 16 width: 100%; 17 } 18 li:hover { 19 background-color: hotpink; 20 transition: all 0.8s ease; 21 } 22 .v-enter, 23 .v-leave-to { 24 opacity: 0; 25 transform: translateY(80px); 26 } 27 .v-enter-active, 28 .v-leave-active { 29 transition: all 0.6s ease; 30 } 31 /* 下面的 .v-move 和 .v-leave-active配合使用,能够实现列表后续的元素渐渐地漂上来的效果 */ 32 .v-move { 33 transition: all 0.6s ease; 34 } 35 .v-leave-active { 36 position: absolute; 37 } 38 </style> 39 </head> 40 <body> 41 <div id="app"> 42 <div> 43 <label> 44 Id: 45 <input type="text" v-model="id"> 46 </label> 47 <label> 48 Name: 49 <input type="text" v-model="name"> 50 </label> 51 <input type="button" value="添加" @click="add"> 52 </div> 53 <!-- <ul> --> 54 <!-- 在实现列表过渡的时候,如果需要过渡的元素,是通过 v-for 循环渲染出来的,不能使用 transition 包裹,需要使用 transitionGroup --> 55 <!-- 如果要为 v-for 循环创建的元素设置动画,必须为每一个 元素 设置 :key 属性 --> 56 <!-- 给 ransition-group 添加 appear 属性,实现页面刚展示出来时候,入场时候的效果 --> 57 <!-- 通过 为 transition-group 元素,设置 tag 属性,指定transition-group渲染为指定的元素,如果不指定tag属性,默认渲染为span标签 --> 58 <transition-group appear tag="ul"> 59 <li v-for="(item, i) in list" :key="item.id" @click="del(i)"> 60 {{item.id}} --- {{item.name}} 61 </li> 62 </transition-group> 63 <!-- </ul> --> 64 </div> 65 <script> 66 // 创建 Vue 实例,得到 ViewModel 67 var vm = new Vue({ 68 el: '#app', 69 data: { 70 id: '', 71 name: '', 72 list: [ 73 { id: 1, name: 'java' }, 74 { id: 2, name: 'C#' }, 75 { id: 3, name: 'php' }, 76 { id: 4, name: 'javascript' } 77 ] 78 }, 79 methods: { 80 add() { 81 this.list.push({ id: this.id, name: this.name }) 82 this.id = this.name = '' 83 }, 84 del(i) { 85 this.list.splice(i, 1) 86 } 87 } 88 }); 89 </script> 90 </body> 91 </html>