(5)Vue基础4
Vue过渡和动画
前沿:过渡从一个状态向另一个状态变化的过程;动画是与过渡非常相似,只不过动画控制的过程更加细腻,更加精准。
过渡和动画基础
(一)过渡
(1)Vue为<transition>标签内部的元素提供3个进入过渡的类和3个离开的过渡的类。
- v-enter 进度过渡的开始状态,作用于开始的第一帧 进入前的那一刻,隐藏的状态
- v-enter-active 进入过渡生效的状态,作用于整个过程 进入整个过渡过程
- v-enter-to 进入过渡的结束状态。作用于结束的一帧 进入结束的一刻 显示
- v-leave 离开过渡的开始状态,作用于开始的一帧 离开前的一刻 显示
- v-leave-active 离开过渡生效的开始状态,作用于整个过程 显示的整个过程
- v-leave-to 离开过渡的结束状态,作用于结束的一帧 离开结束的那一刻,隐藏的状态
案例实例:

<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>动画过渡</title> <script type="text/javascript" src="./vue/vue.js"></script> <style type="text/css"> .chart{width:200px; height: 50px; background-color: orange;} /*从有到无 离开状态*/ .box-leave{width:200px;} .box-leave-active{transition:width 3s;} .box-leave-to{width:0;} /*从无到有,显示状态*/ .box-enter{width:0;} .box-enter-active{transition: width 3s;} .box-enter-to{width:200px;} </style> </head> <body> <div id="app"> <button @click="toogle">切换状态</button> <transition name="box"> <div class="chart" v-show="show"></div> </transition> </div> <script type="text/javascript"> var vm = new Vue({ el:"#app", data:{ show:true }, methods:{ toogle(){ this.show = !this.show } } }) </script> </body> </html>
(2)自定义类名:
(3)使用@keyframes创建CSS动画
案例解析:

<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>@keyframes创建CSS</title> <script type="text/javascript" src="./vue/vue.js"></script> <style type="text/css"> .circular{width: 100px; height: 100px; border-radius: 50%;background-color: red; margin-top: 20px; color:#fff;line-height: 100px; text-align: center; } .bounce-enter-active{animation: anmi 1s;} .bounce-leave-active{animation: anmi 1s reverse;} /*一开始显示,然后变成没有,从有到无 leave*/ @keyframes anmi{ /*相当于v-enter v-leave-to 隐藏状态*/ 0%{ transform:scale(0); background:blue; } 50%{ transform: scale(0.5); } /*相当于v-enter-to v-leave 显示状态*/ 100%{ transform:scale(1); background:red; } } </style> </head> <body> <div id="app"> <button @click="show = !show">改变样式</button> <transition name="bounce"> <div class="circular" v-show="show"></div> </transition> </div> <script type="text/javascript"> var vm = new Vue({ el:"#app", data:{ show:true } }) </script> </body> </html>
(二)多个元素过渡
(1)不同标签名元素过渡。同一个transition只能有一个元素实现过渡,如果是不同的标签过渡,可以使用v-if v-else选择过渡的标签。
(2)相同标签名元素过渡。当有相同的标签名的元素切换时,需要使用Key特性设置唯一值来标记,从而让Vue区分他们,因为Vue为了效率只会替换相同标签的内容。
(3)过渡模式。当新旧两个元素发生过渡时,发生的位置的偏移、闪动等情况需要更精细的设置。 在transition里面加上mode="out-in"或者mode="in-out"。
案例解析:

<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>多元素过渡</title> <script type="text/javascript" src="./vue/vue.js"></script> <style type="text/css"> .red, .green, .orange{height:20px; width:200px;} .red{background-color: red;} .green{background-color: green;} .orange{background-color: orange;} /*过渡的效果*/ .row-enter{width:0;} .row-enter-active{transition:width 3s;} .row-enter-to{width:200px;} </style> </head> <body> <div id="app"> <!-- 不同标签名实现切换 --> <transition> <ul v-if="item.length >0 "> <li>选项1</li> <li>选项2</li> </ul> <p v-else>我是P标签的内容</p> </transition> <!-- 相同标签名实现切换1 要绑定不同的key --> <button @click="isEdit = !isEdit">切换1</button> <transition mode="out-in"> <button v-if="isEdit" key="edit">编辑</button> <button v-else key="save">保存</button> </transition> <br/> <!-- 相同标签名实现切换2 通过绑定不同的Key代替v-if-else --> <button @click="isedit2 = !isedit2">切换2</button> <transition> <button :key="isedit2">{{isedit2 ? "编辑" : "保存"}}</button> </transition> <br/> <!-- 相同的标签名实现多个元素的过渡3 多个v-if --> <button @click="showNum">切换</button> <transition name="row"> <div class="red" v-if="show == 'A' " key="A"></div> <div class="green" v-if="show == 'B' " key="B"></div> <div class="orange" v-if="show == 'C' " key="C"></div> </transition> <br/> <!-- 相同的标签名实现多个元素的过渡4 计算属性监控变化 --> <transition> <span :key="show2">{{showNum2}}</span> </transition> </div> <script type="text/javascript"> var vm = new Vue({ el:'#app', data:{ item:[], isEdit:true, isedit2:true, show:"A", show2:"A" }, methods:{ showNum(){ if(this.show =="A"){ this.show ="B" }else if(this.show =="B"){ this.show="C" }else{ this.show ="A" } } }, computed:{ showNum2(){ switch(this.show2){ case "A" : return "我是a"; break; case "B" : return "我是b"; break; case "C" : return "我是c"; break; } } } }) </script> </body> </html>
(三)多个组件过渡
多个组件之间过渡,只需要使用动态组件即可,动态组件需要通过Vue中的<component>元素绑定is属性来实现多个组件的过渡。
案例解析:

<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>全局配置render</title> <script type="text/javascript" src="./vue/vue.js"></script> <style type="text/css"> .fade-enter-active,.fade-leave-active{transition: color 2s;} .fade-enter-to,.fade-leave{color:red;} .fade-leave-to,.fade-enter{color:#000;} </style> </head> <body> <div id="app"> <a href="javascript:;" @click="exampleNumber ='example1'">登录</a> <a href="javascript:;" @click="exampleNumber ='example2'">注册</a> <transition name="fade" mode="out-in"> <component :is="exampleNumber"></component> </transition> </div> <template id="example1"> <span>我是登录页面</span> </template> <template id="example2"> <span>我是注册页面</span> </template> <script type="text/javascript"> Vue.component("example1",{ template:"#example1" }) Vue.component("example2",{ template:"#example2" }) var vm = new Vue({ el:'#app', data:{ exampleNumber:'' }, }) </script> </body> </html>
(四)列表过渡
(1)列表过度需要使用v-for显示多个元素和transition-group组件给多个元素同时添加过渡效果来实现。
(2)列表过度的进入和离开。当插入和移除元素的时候,虽然有过渡效果,但是周围的元素会瞬间移到新的位置,而不是平滑的过渡,为了实现过度,可借助v-move特性,对于切换时机和过度曲线非常有用。
(3)列表的排序过渡。
v-move:为了实现列表的平滑过渡,可以借助v-move特性。对于设置过渡的切换时机和过渡曲线非常有用。可以通过name属性来定义前缀(name=list,则对应的类名就应该是list-move)也可以通过move-class属性手动设置自定义类名。
(4)列表的交错过渡。
(5)可复用的过渡
(3)钩子函数实现动画
el 表示要做动画的元素标签。
vue结合velocity的一个动画。
案例解析:

<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>列表过渡</title> <script type="text/javascript" src="./vue/vue.js"></script> <style type="text/css"> .list-item{display: inline-block; margin-left:10px; background-color: red; border-radius: 50%; width:25px; height: 25px; text-align: center; line-height: 25px; color:#fff;} .list-enter-active, .list-leave-active{transition: all 1s;} .list-enter, .list-leave-to{opacity:0; transform: translateY(30px)} .list-move{transition:transform 1s;} </style> </head> <body> <div id="app"> <button @click="add">随机插入一个数字</button> <button @click="remove">随机移除一个数字</button> <transition-group name="list"> <span v-for="item in items" :key="item" class="list-item">{{item}}</span> </transition-group> </div> <script type="text/javascript"> var vm = new Vue({ el:'#app', data:{ items:[1,2,3,4,5], nextNum :6 }, methods:{ randomIndex(){ return Math.floor(Math.random() * this.items.length) }, add(){ this.items.splice(this.randomIndex(), 0 , this.nextNum++) }, remove(){ this.items.splice(this.randomIndex(),1) } } }) </script> </body> </html>