Vue3 过渡动画效果

news/2025/2/2 17:50:19/

文章目录

  • Vue3 过渡动画效果
    • 概述
    • `<Transition>`组件
      • 简单使用
      • 为过渡效果命名
      • 自定义过渡class
      • JavaScript动画效果
      • 元素间过渡
    • `<transition-group>`组件
      • 列表动画
      • 状态动画

Vue3 过渡动画效果

概述

Vue 提供了两个内置组件,可以帮助你制作基于状态变化的过渡和动画:

  • <Transition> 会在一个元素或组件进入和离开 DOM 时应用动画。
  • <TransitionGroup> 会在一个 v-for 列表中的元素或组件被插入,移动,或移除时应用动画。

<Transition>组件

<Transition>是一个内置组件,它可以将进入和离开应用到通过默认插槽传递给它的元素或组件上。

进入或离开可以由以下的条件之一触发:

  • v-if 所触发的切换
  • v-show 所触发的切换

简单使用

在这里插入图片描述

  • v-enter-from:进入动画的起始状态。
  • v-enter-active:进入动画的生效状态。这个 class 可以被用来定义进入动画的持续时间、延迟与速度曲线类型。
  • v-enter-to:进入动画的结束状态。
  • v-leave-from:离开动画的起始状态。
  • v-leave-active:离开动画的生效状态。这个 class 可以被用来定义离开动画的持续时间、延迟与速度曲线类型。
  • v-leave-to:离开动画的结束状态。
<script>
export default {data() {return {show: false,}},methods: {handleClick() {this.show = !this.show;}}
}
</script><template><div><transition><div v-if="show">hello world</div></transition><button @click="handleClick">切换</button></div>
</template>
<style>
/* 入场效果 */
.v-enter-from {opacity: 0;
}/* 定义过渡效果 */
.v-enter-active {transition: opacity 3s ease-out;
}.v-enter-to {opacity: 1;
}/* 出场效果 */
.v-leave-from {opacity: 1;
}.v-leave-active {transition: opacity 3s ease-in;
}.v-leave-to {opacity: 0;
}
</style>

为过渡效果命名

可以给 <Transition> 组件传一个 name prop 来声明一个过渡效果名:

<script>
export default {data() {return {show: false,}},methods: {handleClick() {this.show = !this.show;}}
}
</script>
<template><div><transition name="abc"><div v-if="show">hello world222</div></transition><button @click="handleClick">切换</button></div>
</template>
<style>
@keyframes my-anim {0% {transform: translateX(50px);}50% {transform: translateX(-50px);}100% {transform: translateX(50px);}
}.abc-enter-active {animation: my-anim 3s;
}.abc-leave-active {animation: my-anim 3s ease-out;
}
</style>

自定义过渡class

可以向 <Transition> 传递以下的 props 来指定自定义的过渡 class:

  • enter-from-class
  • enter-active-class
  • enter-to-class
  • leave-from-class
  • leave-active-class
  • leave-to-class
<script>
export default {data() {return {show: false,}},methods: {handleClick() {this.show = !this.show;}}
}
</script>
<template><div><transition enter-active-class="myenter" leave-active-class="myleave"><div v-if="show">hello world333</div></transition><button @click="handleClick">切换</button></div>
</template>
<style>
@keyframes my-anim {0% {transform: translateX(50px);}50% {transform: translateX(-50px);}100% {transform: translateX(50px);}
}.myenter {animation: my-anim 3s;
}.myleave {animation: my-anim 3s;
}
</style>

JavaScript动画效果

可以通过监听 <Transition> 组件事件的方式在过渡过程中挂上钩子函数。

添加一个 :css="false" prop。这显式地向 Vue 表明可以跳过对 CSS 过渡的自动探测。

对于 @enter@leave 钩子来说,回调函数 done 就是必须的。否则,钩子将被同步调用,过渡将立即完成。

<script>
export default {data() {return {show: false,}},methods: {handleClick() {this.show = !this.show;},handleBeforeEnter(el) {el.style.color = "red";},handleEnter(el, done) {let animation = setInterval(() => {let color = el.style.color;if (color === "red") {el.style.color = "green";} else {el.style.color = "red";}}, 1000)setTimeout(() => {clearInterval(animation);done(); //通知动画结束}, 3000)},handleAfterEnter(el) {alert("结束")},}
}
</script>
<template><div><transition :css="false" @before-enter="handleBeforeEnter" @enter="handleEnter" @after-enter="handleAfterEnter"><div v-if="show">hello world444</div></transition><button @click="handleClick">切换</button></div>
</template>

元素间过渡

除了通过 v-if / v-show 切换一个元素,我们也可以通过 v-if / v-else / v-else-if 在几个组件间进行切换,只要确保任一时刻只会有一个元素被渲染即可。

如果你想在某个节点初次渲染时应用一个过渡效果,你可以添加 appear prop:

<script>
export default {data() {return {show: false,}},methods: {handleClick() {this.show = !this.show;}}
}
</script>
<template><div><transition mode="out-in" appear><div v-if="show">hello</div><div v-else="show">world</div></transition><button @click="handleClick">切换</button></div>
</template>
<style>
.v-enter-to,
.v-leave-from {opacity: 1;
}.v-enter-from,
.v-leave-to {opacity: 0;
}.v-enter-active,
.v-leave-active {transition: opacity 1s ease-in;
}
</style>

<transition-group>组件

<transition-group>是一个内置组件,用于对 v-for 列表中的元素或组件的插入、移除和顺序改变添加动画效果。

列表动画

<script>
export default {data() {return {list: [1, 2, 3]}},methods: {handleClick() {this.list.unshift(this.list.length + 1);}}
}
</script>
<template><div><transition-group><span class="list-item" v-for="item in list" :key="item">{{ item }}</span></transition-group><button @click="handleClick">添加</button></div>
</template>
<style>
.list-item {display: inline-block;margin-right: 10px;
}.v-enter-from {opacity: 0;transform: translateY(30px);
}.v-enter-to {opacity: 1;transform: translateY(0);
}.v-enter-active {transition: all 0.5s ease-in;
}.v-move {transition: all 0.5s ease-in;
}
</style>

状态动画

<script>
export default {data() {return {animNum: 1}},methods: {handleClick() {if (this.animNum < 10) {let interval = setInterval(() => {this.animNum++;if (this.animNum === 10) {clearInterval(interval);}}, 100);}}}
}
</script>
<template><div><transition-group><div>{{ animNum }}</div></transition-group><button @click="handleClick">添加</button></div>
</template>

http://www.ppmy.cn/news/143334.html

相关文章

Latax公式——INSCODE测试

在LaTeX中&#xff0c;公式是一个重要的部分。使用LaTeX创建公式非常简单且易于阅读。在本文中&#xff0c;将介绍LaTeX公式的基础知识和一些实用技巧。 基础语法 LaTeX公式由数学模式环境包含。可以通过两个美元符号 $ $ 或者 [ ] 将公式括起来。例如&#xff1a; y m x b…

凝心聚力,共创未来 | 2023 开放原子全球开源峰会 OpenCloudOS 社区年会即将启幕

近年来&#xff0c;随着云原生技术的不断发展&#xff0c;催生出越来越多的新场景。作为企业 IT 系统的底层技术&#xff0c;其操作系统所面临的问题也变得越来越复杂。面对云原生等新技术对操作系统提出的新挑战、新要求&#xff0c;如何凝聚生态合作伙伴的优势力量&#xff0…

ikbc键盘 win解锁

非静音款&#xff1a; 上锁&#xff1a;fn左win 解锁&#xff1a;fn 右win 静音款&#xff1a; 上锁&#xff1a;fnf12 解锁&#xff1a;fnPrtSc

Ikbc编程

Ikbc编程 进入选键模式 Fn Ctrl 选择要设置的键 Q(根据自己情况设置) 输入要设置的内容 123(根据自己情况) 保存 PN 退出选键 Fn Ctrl 使用 Fn Q(你选择的你的那个键)

IKBC W200 键盘 win 键失效

原因可能是被锁定了 win (键盘左侧) Fn 锁定 win (键盘右侧) Fn 解锁

蓝牙耳机连接电脑,提示无法安装驱动程序

1&#xff0c;打开控制面板->系统和安全->管理工具->服务 2&#xff0c;双击BitLocker Drive Encryption Service&#xff0c;手动开启服务 3&#xff0c;如果仍显示为感叹号&#xff0c;需要重新下载驱动&#xff1a; 4&#xff0c;外围蓝牙设备请用intel官网的驱动官…

2W025-08/2W040-10/2W160-15/2W200-20/2W250-25/2W350-35/2W400-40/2W500-50电磁控制封区

2W025-08/2W040-10/2W160-15/2W200-20/2W250-25/2W350-35/2W400-40/2W500-50流体控制电磁阀是一种用于控制气体流动的装置。它通常用于工业自动化、石油化工、航空航天等领域&#xff0c;以实现对气流、气体和液体的精确控制。电磁阀的主要组成部分包括阀体、阀门、密封件、电磁…

vue 多层表格嵌套

** vue 多层表格嵌套 ** 后台数据 在这里插入代码片var table1 [ {id: 1,name: "加强组织领导夯实基础工作",sore: "18分",children: [{id: 11,name: "创建氛围",sore: "9分",children: []},{id: 11,name: "创建氛围",s…