transition动画组件
Vue 提供了 transition
的封装组件,在下列情形中,可以给任何元素和组件添加进入/离开过渡:
- 条件渲染 (使用 v-if)
- 条件展示 (使用 v-show)
- 动态组件
- 组件根节点
1、 自定义transtions动画组件过度效果
自定义 transition 过度效果,你需要对transition
组件的name
属性自定义。并在css中写入对应的样式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90
| <!-- * @Description: * @Author: xiuji * @Date: 2022-08-31 21:14:30 * @LastEditTime: 2022-09-15 16:01:53 * @LastEditors: Do not edit --> <template> <div class="content"> <el-button type="primary" @click="show = !show">切换 </el-button> <!-- transition中必须定义name属性,用于在style标签中定义对应样式 --> <transition name="tran"> <div v-if="show" class="tran-box"></div> </transition> </div> </template>
<script setup lang="ts"> import { ref } from 'vue'; const show = ref<boolean>(true) </script>
<style lang="scss" scoped> .content { position: relative; flex: 1; height: 100%; margin: 20px; border: 1px solid #ccc; overflow: auto;
&-tabs { display: flex;
&-box { padding: 10px; border: 1px solid #ccc; } }
&-box { padding: 10px; border: 1px solid #ccc; }
.tran-box { width: 200px; height: 200px; background-color: yellowgreen; }
// 开始的过度 .tran-enter-from { width: 0; height: 0; }
// 开始过度了 .tran-enter-active { transition: all 1s linear; }
// 过度完成 .tran-enter-to { width: 200px; height: 200px; transform: rotate(180deg); background-color: yellowgreen; }
// 离开的过度 .tran-leave-from { width: 200px; height: 200px; transform: rotateX(180deg); background-color: yellowgreen; }
// 离开中过度 .tran-leave-active { transition: all 1s ease; }
// 离开完成 .tran-leave-to { width: 0; height: 0; } } </style>
|
2、 通过props属性自定义样式
也可以在transition组件上通过组件props
属性传入自定义类名,props属性名如下:
enter-from-class
enter-active-class
enter-to-class
leave-from-class
leave-active-class
leave-to-class
通过props
属性名可与第三方库结合使用,比如css动画库animate css
3、 自定义过度时间
1 2 3 4
| <transition :duration="1000">...</transition> <transition :duration="{ enter: 500, leave: 800 }">...</transition>
|
4、 transition生命周期
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| @before-enter="beforeEnter" //对应enter-from @enter="enter"//对应enter-active @after-enter="afterEnter"//对应enter-to @enter-cancelled="enterCancelled"//显示过度打断 @before-leave="beforeLeave"//对应leave-from @leave="leave"//对应enter-active @after-leave="afterLeave"//对应leave-to @leave-cancelled="leaveCancelled"//离开过度打断
const beforeEnter = (el: Element) => { console.log('进入之前from', el); }
const Enter = (el: Element,done:Function) => { console.log('过度曲线'); setTimeout(()=>{ done() },3000) }
const AfterEnter = (el: Element) => { console.log('to'); }
|
通过transtions动画组件生命周期结合GreenSock动画库使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
| <!-- * @Description: * @Author: xiuji * @Date: 2022-08-31 21:14:30 * @LastEditTime: 2022-10-07 14:58:49 * @LastEditors: Do not edit --> <template> <div class="content"> <el-button type="primary" @click="show = !show">切换</el-button> <transition @before-enter="beforeEnter" @enter="enterActive" @leave="leave"> <div v-if="show" class="tran-box"></div> </transition> </div> </template>
<script setup lang="ts"> import { ref } from 'vue'; import gsap from 'gsap' const show = ref<boolean>(true)
const beforeEnter = (el: Element) => { gsap.set(el, { width: 0, height: 0 }) }
const enterActive = (el: Element, done: GSAPCallback) => { gsap.to(el, { width: 200, height: 200, onComplete: done }) }
const leave = (el: Element, done: GSAPCallback) => { gsap.to(el, { width: 0, height: 0, onComplete: done }) } </script>
|
5、 appear
通过appear属性可以设置初始节点过渡,就是页面加载完成就动画效果就开始,加载对应三个状态,该属性也可与animate.css
动画库结合使用。
注意:仅仅是页面初始化时的加载动画,后续操作元素可用生命周期调整动画
1 2 3
| <transition appear appear-active-class="animate__animated animate__bounce"> <div v-if="show" class="tran-box"></div> </transition>
|