共用 v-
1 2 3 4 5 6 7 8 9 10 11 12 13 14
|
.v-enter,
.v-leave-to{ opacity: 0; transform: translate(200px); }
.v-enter-active, .v-leave-active{ transition: all 0.4s ease; }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| <div id="app"> <p>需求: 使用过度类名实现动画点击h3显示,再点击隐藏</p> <input type="button" name="" value="toggle" @click="flag=!flag"> <transition> <h3 v-if="flag">这是一个h3</h3> </transition> <hr> <input type="button" name="" value="toggle2" @click="flag2=!flag2"> <transition> <h6 v-if="flag2">这是一个h6</h6> </transition> </div>
|
1 2 3 4 5 6 7 8
| var vm = new Vue({ el:'#app', data:{ flag: false, flag2: false }, methods:{}, })
|
演示
自定义v-前缀
注意:添加两组transition类区别有无name属性
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| .v-enter,
.v-leave-to{ opacity: 0; transform: translateX(200px); }
.v-enter-active, .v-leave-active{ transition: all 0.4s ease; }
.my-enter,
.my-leave-to{ opacity: 0; transform: translateY(200px); }
.my-enter-active, .my-leave-active{ transition: all 0.4s ease; }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| <div id="app"> <p>需求: 使用过度类名实现动画实现 上面按钮从右向左 下面从下到上</p> <input type="button" name="" value="toggle" @click="flag=!flag"> <transition> <h3 v-if="flag">这是一个h3</h3> </transition> <hr> <input type="button" name="" value="toggle2" @click="flag2=!flag2"> <transition name="my"> <h6 v-if="flag2">这是一个h6</h6> </transition> </div>
|
1 2 3 4 5 6 7 8
| var vm = new Vue({ el:'#app', data:{ flag: false, flag2: false }, methods:{}, })
|
演示
第三方动态库实现动画
如:https://animate.style/
源码
1
| <link href="https://cdn.jsdelivr.net/npm/animate.css@3.5.1" rel="stylesheet" type="text/css">
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| <div id="app"> <div id="example-3"> <button @click="flag = !flag"> toggle </button> <transition name="custom-classes-transition" enter-active-class="animated tada" leave-active-class="animated bounceOutRight" > <p v-if="flag">Animate.css</p> </transition> </div> </div>
|
1 2 3 4 5 6 7
| var vm = new Vue({ el:'#example-3', data:{ flag: false }, methods:{}, })
|
演示
半场动画(例如加入购物车)【借助于 函数】
1 2 3 4 5 6 7 8 9 10 11 12 13
| <transition v-on:before-enter="beforeEnter" v-on:enter="enter" v-on:after-enter="afterEnter" v-on:enter-cancelled="enterCancelled"
v-on:before-leave="beforeLeave" v-on:leave="leave" v-on:after-leave="afterLeave" v-on:leave-cancelled="leaveCancelled" > </transition>
|
演示
钩子小球动画
代码
1 2 3 4 5 6 7 8 9 10 11 12 13
| body{ color: #fff; background-color: #000 } .ball{ width: 15px; height: 15px; background-color: red; border-radius: 50% } input[type="button"]:hover{ cursor: pointer; }
|
1 2 3 4 5 6 7 8 9 10 11 12
| <div id="app"> <input type="button" value="快到碗里来" name="" @click="flag=!flag"> <transition @before-enter="beforeEnter" @enter="enter" @after-enter="afterEnter"> <div class="ball" v-show="flag"></div> </transition> <span style="position: absolute;left: 120px;top: 500px">“形象”的碗</span> </div>
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| var vm = new Vue({ el:'#app', data:{ flag: false }, methods:{ beforeEnter:function (el) { el.style.transform = "translate(0,0)" }, enter: function (el,done){ el.offsetWidth el.style.transform = "translate(150px,450px)" el.style.transition = "all 1s ease"
done() }, afterEnter: function (el){ this.flag = !this.flag
} }, })
|
transition-group 列表动画
源码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| ul{ padding: 0 } li{ width: 100%; list-style-type: none; border: 1px dashed #999; padding: 8px; line-height: 35px;
} li:hover{ background-color: pink; transition: all 0.4s ease } .v-enter, .v-leave-to{ opacity: 0; transform: translateY(80px); } .v-enter-active, .v-leave-active{ transition: all 0.8s ease }
.v-move{ transition: all 0.8s ease } .v-leave-active{ position: absolute; }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| <div id="app"> <div> <label> ID: <input type="text" name="" v-model="id"> </label> <label> Name: <input type="text" name="" v-model="name"> </label> <input type="button" name="" value="添加" @click="add"> </div> <p>奸臣一表:【点击删除】</p> <transition-group appear tag="ul"> <li v-for="item in list" :key="item.id" @click="del(item.id)"> {{item.id}} ---- {{item.name}} </li> </transition-group> </div>
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| var vm = new Vue({ el:'#app', data:{ id: '', name: '', list:[ {id:1,name:'赵高'}, {id:2,name:'魏忠贤'}, {id:3,name:'脑补不出来'}, {id:4,name:'你们来吧'} ] }, methods:{ add: function(){ this.list.push({id:this.id,name:this.name}) this.id = this.name ='' }, del:function(id){ var index = this.list.findIndex(item=>{ if (item.id == id) { return true } }) this.list.splice(index,1) } }, })
|
演示
注意:我们发现 transition-group
渲染成一个span标签,span标签内包含v-for 遍历的list数组,不符合w3c
的行内元素不能包裹块状元素的原则,所以需要给transition-group
加一个tag属性渲染ul
,若不指定默认渲染为span
。