1. 使用 transition 元素,把 需要被动画控制的元素,包裹起来
<transition>
<h3 v-if="isShow">我是底部</h3>
</transition>
2. 自定义两组样式,来控制 transition 内部的元素实现动画
/* v-enter 【这是一个时间点】 是进入之前,元素的起始状态,此时还没有开始进入
v-leave-to 【这是一个时间点】 是动画离开之后,离开的终止状态,此时,元素 动画已经结束了 */
.v-enter,
.v-leave-to {
transform: translate(300px, 0);
opacity: 0;
}
/* v-enter-active 【入场动画的时间段】 */
/* v-leave-active 【离场动画的时间段】 */
.v-enter-active,
.v-leave-active {
transition: all 1s ease-in;
}
如果不想要 v- 前缀的动画,可以在transition标签上添加name属性,自定义前缀:
<transition name="sw">...</transition>
.sw-enter,
.sw-leave-to {
transform: translate(300px, 0);
opacity: 0;
}
...
<link rel="stylesheet" type="text/css" href="./lib/animate.css">
<!-- 入场 bounceIn 离场 bounceOut -->
<!-- 使用 :duration="毫秒值" 来统一设置 入场 和 离场 时候的动画时长 -->
<transition
enter-active-class="bounceIn"
leave-active-class="bounceOut"
:duration="500">
<h3 v-if="isShow" class="animated">我是底部</h3>
</transition>
<!-- 使用 :duration="{ enter: 200, leave: 400 }" 来分别设置 入场的时长 和 离场的时长 -->
<transition
enter-active-class="fadeInRight"
leave-active-class="fadeOutRight"
:duration="{ enter: 500, leave: 800 }">
<div class="animated" v-show="isshow">动画哦</div>
</transition>
<div id="app">
<input type="button" value="切换动画" @click="isshow = !isshow">
<transition
@before-enter="beforeEnter"
@enter="enter"
@after-enter="afterEnter">
<div v-if="isshow" class="show">OK</div>
</transition>
</div>
methods: {
// 动画钩子函数第一个参数el,表示要执行动画的那个DOM元素,是原生JS的DOM对象
// 可以认为el是通过 document.getElementById('')方式获取到的
beforeEnter(el) { // 动画之前的回调
// 在此处可以设置元素动画起始位置
el.style.transform = 'translateX(500px, 0)';
},
enter(el, done) { // 动画完成时候的回调
// 这句话没有实际作用,但是不写会造成没有动画效果
// 可以认为el.offsetWidth 会强制动画刷新
el.offsetWidth;
// 此处可以设置元素动画结束状态的位置
el.style.transform = 'translateX(0px)';
// 必须调用。这里的done,就是 afterEnter 函数,也就是说 done 是 afterEnter 函数的引用
done();
},
afterEnter(el) { // 动画完成之后的回调
this.isshow = !this.isshow;
}
}
.show {
transition: all 0.4s ease;
}
在实现列表过渡的时候,如果需要过渡的元素,是通过 v-for 循环渲染的,不能使用 transition