触发条件
应用过渡和动画效果,主要基于状态变化
状态变化条件
1、v-if
2、v-show
3、动态组件 切换
4、改变属性 key
基于css的过渡效果
知识点说明
1、一般在 .v-enter-from、.v-leave-to,设置 开始点 和 结束点
2、在 .v-enter-active、.v-leave-active 设置过渡效果
过渡效果命名
知识点说明
添加 name 属性,过渡class就不是以v为前缀
举个栗子
js
<Transition name="fade">
...
</Transition>
.fade-enter-active,
.fade-leave-active {
transition: all 0.5s ease;
}
.fade-enter-from,
.fade-leave-to {
transform: translateX(100px);
opacity: 0;
}
Transition + transition
知识点说明
<Transition>
只支持 单个元素 或 组件,作为其插槽内容,如果是组件,必须仅有一个根元素
举个栗子
js
import { ref } from 'vue'
const isShow = ref(false)
<button @click="isShow = !isShow">{{ isShow ? '隐藏' : '显示' }}</button>
<Transition name="fade">
<div v-if="isShow">你好,赵今麦!</div>
</Transition>
.fade-enter-active,
.fade-leave-active {
transition: all 0.5s ease;
}
.fade-enter-from,
.fade-leave-to {
transform: translateX(100px);
opacity: 0;
}
Transition + animation
js
import { ref } from 'vue'
const isShow = ref(false)
<button @click="isShow = !isShow">{{ isShow ? '隐藏' : '显示' }}</button>
<Transition name="bounce">
<div v-if="isShow" style="text-align: center;">这是一段会跳动的文字</div>
</Transition>
@keyframes bounce-in {
0% {
transform: scale(0);
}
50% {
transform: scale(1.25);
}
100% {
transform: scale(1);
}
}
.bounce-enter-active {
animation: bounce-in 0.5s ease;
}
.bounce-leave-active {
animation: bounce-in 0.5s ease reverse;
}
自定义过渡class
自定义过渡class的props
js
enter-from-class
enter-active-class
enter-to-class
leave-from-class
leave-active-class
leave-to-class
覆盖class,在应用第三方动画库非常有用,比如 Animate.css
js
import { ref } from 'vue'
const isShow = ref(false)
<button @click="isShow = !isShow">{{ isShow ? '隐藏' : '显示' }}</button>
<Transition
name="custom-classes"
enter-active-class="animate__animated animate__backInRight"
leave-active-class="animate__animated animate__heartBeat"
>
<div v-if="isShow">是心动的感觉啊...</div>
</Transition>
<style lang="scss" scoped>
@import "https://cdnjs.cloudflare.com/ajax/libs/animate.css/4.1.1/animate.min.css";
</style>
深层级过渡与显式过渡时长
js
<Transition
name="nested"
:duration="550"
// :duration="{ enter: 500, leave: 800 }"
>
<div v-if="show" class="outer">
<div class="inner">
Hello
</div>
</div>
</Transition>
.nested-enter-active .inner,
.nested-leave-active .inner {
transition: all 0.3s ease-in-out;
}
.nested-enter-active .inner {
transition-delay: 0.25s;
}
.nested-enter-from .inner,
.nested-leave-to .inner {
transform: translateX(30px);
opacity: 0;
}
性能考虑
尽量使用 transform 和 opacity 属性,制作动效非常高效
优点
1、动效不影响DOM结构,css布局不会重新计算
2、大多数浏览器在执行 transform 动效时,会利用GPU进行硬件加速
绝对自律,是通往自由的唯一道路 ------ 冬泳怪鸽