共计 2109 个字符,预计需要花费 6 分钟才能阅读完成。
背景
内置的 <transition> 和 <transition-group> 组件同时支持 CSS 和 JS 钩子
过渡和动画的不同:
过渡就是从一个状态向另一个状态插入值(从起始状态,到结束状态,再回来)
动画不同,可以在一个声明中设置多个状态(比如动画 50% 的位置设置一个关键帧,
然后在 70% 的位置,也可以设置延迟属性实现复杂运动)
CSS 过渡
假设有一个简单的模态窗。通过点击按钮显示或隐藏模态窗。可以这样做:
创建一个按钮的 vue 实例,在实例中创建一个子组件,设置数据的状态
这样可以通过切换布尔值并添加事件处理实现子组件的显示及隐藏。
可以使用 v -if 或者 v -show 来切换组件的可见性。也可以使用 slot 放置模态窗的切换状态
过渡部分结构:
<transition name=”fade”>
<app-child v-if=”isShowing” class=”modal”>
<button @click="toggleShow">
Close
</button>
</app-child>
</transition>
.fade-enter-active, .fade-leave-active {
transition: opacity 0.25s ease-out;
}
.fade-enter, .fade-leave-to {
opacity: 0;
}
CSS 动画
所有有趣的动画都是基于 enter-active 和 leave-active
可以给每一个实例一个特殊类
enter-active-class=”toasty”
leave-active-class=”bounceOut”
动画部分结构:
<transition
name="ballmove"
enter-active-class="bouncein"
leave-active-class="rollout">
<div v-if=”isShowing”>
<app-child class="child"></app-child>
</div>
</transition>
对于反弹对画,如果使用 CSS 的话,需要设置大量关键帧,
@mixin ballb($yaxis: 0) {
transform: translate3d(0, $yaxis, 0);
}
@keyframes bouncein {
1% {@include ballb(-400px); }
20%, 40%, 60%, 80%, 95%, 99%, 100% {@include ballb() }
30% {@include ballb(-80px); }
50% {@include ballb(-40px); }
70% {@include ballb(-30px); }
90% {@include ballb(-15px); }
97% {@include ballb(-10px); }
}
.bouncein {
animation: bouncein 0.8s cubic-bezier(0.25, 0.46, 0.45, 0.94) both;
}
.ballmove-enter {
@include ballb(-400px);
}
@keyframes rollout {
0% {transform: translate3d(0, 300px, 0); }
100% {transform: translate3d(1000px, 300px, 0); }
}
@keyframes ballroll {
0% {transform: rotate(0); }
100% {transform: rotate(1000deg); }
}
.rollout {
width: 60px;
height: 60px;
animation: rollout 2s cubic-bezier(0.55, 0.085, 0.68, 0.53) both;
div {
animation: ballroll 2s cubic-bezier(0.55, 0.085, 0.68, 0.53) both;
}
}
JS 动画
有很多适合动画的易于使用的 JS 钩子。所有的钩子都会传入 el 参数,除了动画钩子 (enter 和 leave)
还会传入 done 作为参数(它的作用就是告知 Vue 动画结束)
<transition
@before-enter=”beforeEnter”
@enter=”enter”
@after-enter=”afterEnter”
@enter-cancelled=”enterCancelled”
@before-Leave=”beforeLeave”
@leave=”leave”
@after-leave=”afterLeave”
@leave-cancelled=”leaveCancelled”
:css=”false”>
</transition>
从最基本的层面看,这是开始动画和结束动画所需的,包括相关的方法:
<transition
@enter=”enterEl”
@leave=”leaveEl”
:css=”false”>
<!– put element here–>
</transition>
methods: {
enterEl(el, done) {
//entrance animation
done();
},
leaveEl(el, done) {
//exit animation
done();
},
}