1.前言
这个先不用单文件组件来演示
因为单文件组件 一般都是项目使用了,项目中一般都是路由动画
2.动态组件动画
html
<div id="my-app">
<label for="">男装</label>
<input type="radio" value="com1" v-model="type">
<label for="">女装</label>
<input type="radio" value="com2" v-model="type">
<hr>
<transition name="yzs">
<keep-alive>
<component :is="type"></component>
</keep-alive>
</transition>
</div>
3. js
var com1 = {
template: `
<div class="sub-root1">
<h1>男装</h1>
<p> 假装 你喜欢的男神风格的衣服</p>
</div>
`,
mounted() {
console.log("com1渲染完毕")
},
destroyed() {
console.log("com1已被销毁")
}
};
var com2 = {
template: `
<div class="sub-root2">
<h1>女装</h1>
<p>假装有很多 图片列表哈哈</p>
</div>
`,
mounted() {
console.log("com2渲染完毕")
},
destroyed() {
console.log("com2已被销毁")
}
}
var app = new Vue({
el: "#my-app",
components: {
com1,
com2
},
data: {
type: "com1"
}
});
4. 样式
<style>
.sub-root1{
background-color: skyblue;
height:500px;
width: 100%;
}
.sub-root2{
background-color: greenyellow;
height:500px;
width: 100%;
}
.yzs-enter-active,
.yzs-leave-active {
/* 为了保证组件切换动画时,两个组件重叠显示,在动画持续时间将做动画的组件根元素设置为绝对行为 */
position: absolute;
transition: all 2s;
}
.yzs-leave-to ,.yzs-enter{
opacity: 0;
}
.yzs-enter-to,.yzs-leave {
opacity: 1;
}
</style>
5. 转场动画-html
transition的name属性可以是固定值,
也可以动态绑定一个变量,这样就可以通过修改变量实现在不同场景下执行不同的动画
<div id="my-app">
<nav>
<label for="">组件1</label>
<input type="radio" v-model="type" value="com1">
<label for="">组件2</label>
<input type="radio" v-model="type" value="com2">
</nav>
<transition :name="aniType">
<keep-alive>
<component :is="type"></component>
</keep-alive>
</transition>
</div>
6.转场动画-js
Vue.component("com1",{
template:`<div class="sub-root1">
组件1
<input>
</div>`
})
Vue.component("com2",{
template:`<div class="sub-root2">组件2</div>`
})
var app = new Vue({
el:"#my-app",
data:{
type:"com1",
aniType:"slide-left"
},
watch:{
// 监听type的变化,判断是要切换到哪个组件,从而改变aniType的类型,执行不同的动画。
type:function(v){
if(v=="com2"){
this.aniType = "slide-left"
}else{
this.aniType = "slide-right";
}
}
}
})
7. 转场动画-style
body{
margin: 0;
}
nav{
border: solid 1px black;
height: 40px;
}
.sub-root1,.sub-root2{
border: solid 1px red;
height: 300px;
width: 100%;
box-sizing: border-box;
}
.sub-root1{
background-color: skyblue;
}
.sub-root2{
background-color: greenyellow;
}
/* 左侧离场,右侧入场 动画 */
.slide-left-leave{
transform: translate(0,0);
}
.slide-left-leave-active,.slide-left-enter-active{
transition: all 0.7s;
/* 为了保证组件切换动画时,两个组件重叠显示,在动画持续时间将做动画的组件根元素设置为绝对行为 */
position: absolute;
}
.slide-left-leave-to{
transform: translate(-100%,0);
}
.slide-left-enter{
transform: translate(100%,0);
}
.slide-left-enter-to{
transform: translate(0,0);
}
/* 右侧离场,左侧入场 动画 */
.slide-right-leave{
transform: translate(0,0);
}
.slide-right-leave-active,.slide-right-enter-active{
transition: all 0.7s;
position: absolute;
}
.slide-right-leave-to{
transform: translate(100%,0);
}
.slide-right-enter{
transform: translate(-100%,0);
}
.slide-right-enter-to{
transform: translate(0,0);
}
body{
overflow-x: hidden;
}
抛砖引玉 更多奇思妙想的 动画等你玩 , 玩去吧
8.后记
代码比较多 ,注释 解释不多 .没有太多的逻辑
自己看 自己练,玩,自己体会