Vue封装的过渡与动画

本文介绍了如何在Vue中实现过渡和动画效果,包括单一元素的动画、多个元素过渡,以及如何集成并使用第三方动画库animate.css,通过设置不同属性实现元素的进入和离开动画。

作用:在插入,更新或移除DOM元素时,在合适的时候给元素添加样式类名
请添加图片描述

动画效果

利用<transition>标签(只能控制一个元素)实现过渡,添加appear属性可以实现出现时就有动画效果

@keyframes定义动画名

@keyframes trans{
        from{
            transform: translateX(-100%);
        }
        to{
            transform: translateX(0);

        }
    }

animation调用该动画

<button @click="isShow=!isShow">切换</button>
<transition>
	<h1 v-show="isShow">Animation</h1>
</transition>
 
/*不指定name时用v-,指定name后将v换成name即可*/
.v-enter-active{
	animation: trans 1s;
}

.v-leave-active{
	animation: trans 1s reverse;
}

如果有多个动画,就需要给<transition>标签添加name属性和修改类名(将v换成指定name即可)

<button @click="isShow=!isShow">切换</button>
<transition name="hello">
	<h1 v-show="isShow">Animation</h1>
</transition>
 
/*将v换成指定name即可*/
.hello-enter-active{
	animation: trans 1s;
}

.hello-leave-active{
	animation: trans 1s reverse;
}

过渡效果

<button @click="isShow=!isShow">切换</button>
<transition name="hello" appear>
	<h1 v-show="isShow">Animation</h1>
</transition>
        
/* 进入的起点和离开的终点 */
.hello-enter,.hello-leave-to{
	transform: translateX(-100%);
}

/* 进来和离开的过程 */
.hello-enter-active,.hello-leave-active{
	transition: 0.5s linear;
}

/* 进入的终点和离开的起点 */
.hello-enter-to,.hello-leave{
	transform: translateX(0);
}

多个元素过渡

多个元素使用同一个过渡效果,使用<transition-group>实现,每个需要用该过渡效果的元素都需要有自己独一无二的key

<button @click="isShow=!isShow">切换</button>
<transition-group name="hello" appear>
	<h1 v-show="isShow" key="1">Animation</h1>
	<h1 v-show="!isShow" key="2">Animation</h1>
</transition-group>

集成第三方动画库

安装Animate.css
npm install animate.css --save
使用

引入:

import 'animate.css'

官网地址:animate.css官网(可能会进的比较慢,网址没问题)

需要给<transition>标签配置name属性为animate__animated animate__bounceenter-active-class属性为在官网复制的进入动画名,leave-active-class属性为在官网复制的离开动画名

<button @click="isShow=!isShow">切换</button>
<transition 
	appear
	name="animate__animated animate__bounce" 
	enter-active-class="animate__swing"
	leave-active-class="animate__bounceOut"
>
	<h1 v-show="isShow">Animation</h1>
</transition>
### Vue3封装过渡动画的实现方法 在 Vue3 中,可以通过 `transition` 自定义组件的方式实现并封装过渡动画。以下是详细的说明: #### 使用 Transition 组件 Vue 提供了内置的 `<transition>` 组件来处理元素进入离开时的状态变化。通过该组件,可以轻松地为 DOM 元素或组件添加 CSS 动画或 JavaScript 驱动的动画。 ```html <template> <div> <button @click="isShow = !isShow">Toggle</button> <transition name="fade"> <p v-if="isShow">这是一个过渡动画的内容。</p> </transition> </div> </template> <script> export default { data() { return { isShow: true, }; }, }; </script> <style> .fade-enter-active, .fade-leave-active { transition: opacity 0.5s ease; } .fade-enter-from, .fade-leave-to { opacity: 0; } </style> ``` 上述代码展示了如何使用 `<transition>` 创建一个淡入淡出的效果[^1]。 --- #### 封装动画组件 如果某些动画效果需要多次重复使用,则可以将其封装成独立的组件以便于重用。以下是一个基于 Props Slots 的封装示例: ##### (1) 基础动画组件 创建一个基础动画组件,支持通过 Prop 控制显示/隐藏以及 Slot 插槽填充内容。 ```html <!-- BaseTransition.vue --> <template> <transition :name="animationName"> <slot v-if="isVisible"></slot> </transition> </template> <script> export default { props: { isVisible: { type: Boolean, required: true, }, animationName: { type: String, default: &#39;fade&#39;, }, }, }; </script> <style scoped> /* 默认样式 */ .fade-enter-active, .fade-leave-active { transition: all 0.3s ease; } .fade-enter-from, .fade-leave-to { opacity: 0; transform: translateY(-20px); } </style> ``` ##### (2) 调用封装好的动画组件 在父级组件中引入并调用此封装好的动画组件。 ```html <template> <div> <button @click="toggleVisibility">切换可见性</button> <BaseTransition :isVisible="isVisible" animationName="slide-up"> <p>这是动态加载的内容。</p> </BaseTransition> </div> </template> <script> import BaseTransition from &#39;./components/BaseTransition.vue&#39;; export default { components: { BaseTransition }, data() { return { isVisible: false, }; }, methods: { toggleVisibility() { this.isVisible = !this.isVisible; }, }, }; </script> ``` 此处展示了一个可配置样式的动画组件,并允许外部传递不同的动画名称[^2]。 --- #### 利用 JS 钩子函数增强动画逻辑 除了纯 CSS 动画外,还可以结合 JavaScript 钩子函数进一步扩展功能。例如,在动画过程中执行额外的操作。 ```html <template> <div> <button @click="startAnimation">启动动画</button> <transition @before-enter="beforeEnter" @enter="enter" @after-enter="afterEnter" @before-leave="beforeLeave" @leave="leave" @after-leave="afterLeave" > <p v-if="showElement">JavaScript驱动的动画。</p> </transition> </div> </template> <script> export default { data() { return { showElement: false, }; }, methods: { startAnimation() { this.showElement = !this.showElement; }, beforeEnter(el) { console.log(&#39;Before Enter:&#39;, el); el.style.color = &#39;red&#39;; }, enter(el, done) { console.log(&#39;Enter:&#39;, el); setTimeout(() => { el.style.fontSize = &#39;2em&#39;; done(); }, 1000); }, afterEnter(el) { console.log(&#39;After Enter:&#39;, el); el.style.border = &#39;1px solid green&#39;; }, beforeLeave(el) { console.log(&#39;Before Leave:&#39;, el); el.style.color = &#39;blue&#39;; }, leave(el, done) { console.log(&#39;Leave:&#39;, el); setTimeout(() => { el.style.opacity = &#39;0&#39;; done(); }, 1000); }, afterLeave(el) { console.log(&#39;After Leave:&#39;, el); }, }, }; </script> ``` 这段代码演示了如何利用生命周期钩子来自定义复杂的动画行为[^4]。 --- #### 总结 以上介绍了三种方式:直接使用 `<transition>`、封装通用动画组件以及结合 JavaScript 钩子函数实现更灵活的功能。这些技术可以帮助开发者快速构建高质量的过渡动画效果。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值