vue3过渡动画的详解

Vue3过渡动画的详解

在 Vue3 中,过渡动画的实现更加简单易用,本文将从以下几个方面介绍Vue3的过渡动画:

  • 过渡类名
  • 过渡模式
  • 自定义过渡函数
  • 示例程序

过渡类名

在 Vue3 中,过渡类名的命名规则和 Vue2 一样。当元素被插入、更新或删除时,你可以在元素上添加不同的 class 名称来指定不同的状态。

Vue3 中的过渡类名和 Vue2 中的类名一样,分别包括以下几个:

类名 说明
v-enter 进入的起点状态,注意该类名只会在元素插入时生效
v-enter-active 进入的终点状态,表示元素完成过渡,在动画时间段内需要维持
v-enter-to Vue3新增,进入的终点状态,事实上和v-enter-active表现相同;在动画结束后会被删除
v-leave 需删除的状态,只在使用 <transition> 组件时,组件从 DOM 中移除时生效
v-leave-active 需删除的状态,只在使用 <transition> 组件时,组件从 DOM 中移除时生效
v-leave-to Vue3 新增,需要删除的状态,只有在定义不同的 v-leave 和 v-leave-to 类名时使用;在动画结束后会被删除
v-move 在列表渲染中使用,需要移动的元素的起始状态
v-move-active 在列表渲染中使用,需要移动的元素的终止状态,表示移动完成,在动画时间段内需要维持

在定义转换动画时,我们需要添加这些不同的 class 名称,以指定不同的状态。通常情况下,我们会搭配 CSS3 实现不同状态到另一种状态的变换。

下面是一个简单的例子,展示 <transition> 组件如何在 Vue3 中使用:

<template>
  <div>
    <button @click="show = !show">toggle</button>
    <transition name="fade" @before-enter="beforeEnter" @after-enter="afterEnter">
      <div v-if="show" key="msg">hello</div>
    </transition>
  </div>
</template>

<script>
import {ref} from 'vue'

export default {
  setup () {
    const show = ref(false)
    const beforeEnter = function (el) {
      el.style.opacity = 0
    }
    const afterEnter = function (el) {
      el.style.opacity = 1
    }
    return {
      show,
      beforeEnter,
      afterEnter
    }
  }
}
</script>

<style scoped>
.fade-enter-active, .fade-leave-active {
  transition: opacity .5s;
}
.fade-enter, .fade-leave-to{
  opacity:0;
}
</style>

上面的代码中,我们实现了一个基本的渐变过渡动画。在其中设置 beforeEnterafterEnter 两个生命周期函数回调,对元素样式进行控制。

过渡模式

Vue3 中提供了不同的过渡模式,包括 in-outout-in 或者同时触发。在 Vue3 中,通过设置 mode 来实现不同的过渡模式。默认模式为同时触发。

下面是三种不同过渡模式的示例:

in-out

在 in-out 模式中,新元素被插入到旧元素之后,并且新元素过渡完成后,旧元素被删除。

<template>
  <transition name="fade" mode="in-out">
    <button @click="show = !show" key="toggle">toggle</button>
    <div v-if="show" key="msg">hello</div>
  </transition>
</template>

<style scoped>
.fade-enter-active, .fade-leave-active {
  transition: opacity .5s;
}
.fade-enter, .fade-leave-to{
  opacity:0;
}
</style>

out-in

在 out-in 模式中,旧元素先过渡完成后,新元素被插入到 DOM 中。

<template>
  <transition name="fade" mode="out-in">
    <button @click="show = !show" key="toggle">toggle</button>
    <div v-if="show" key="msg">hello</div>
  </transition>
</template>

<style scoped>
.fade-enter-active, .fade-leave-active {
  transition: opacity .5s;
}
.fade-enter, .fade-leave-to{
  opacity:0;
}
</style>

同时触发

在同时触发模式中,新元素和旧元素同时存在,直到新元素过渡完成。

<template>
  <transition name="fade">
    <button @click="show = !show" key="toggle">toggle</button>
    <div v-if="show" key="msg">hello</div>
  </transition>
</template>

<style scoped>
.fade-enter-active, .fade-leave-active {
  transition: opacity .5s;
}
.fade-enter, .fade-leave-to{
  opacity:0;
}
</style>

自定义过渡函数

有时候,你可能希望使用自定义的过渡函数或者钩子函数,以满足一些应用特殊的过渡效果需求。在 Vue3 中,解决这个问题十分简单。

在 Vue3 中,可以在 <transition> 组件上增加属性 csstypecss 属性用于指定渐变效果使用的过渡函数,type 属性用于指定过渡函数的类型。

示例代码如下:

<template>
  <transition name="fade" :css="false" :type="{beforeEnter: beforeEnter}">
    <button @click="show = !show" key="toggle">toggle</button>
    <div v-if="show" key="msg">hello</div>
  </transition>
</template>

<script>
import { ref } from 'vue'
export default {
  setup () {
    const show = ref(false)
    const beforeEnter = function (el) {
      el.style.opacity = 0
      el.style.transformOrigin = 'center'
      el.style.transform = 'scale(.1)'
    }
    return {
      show,
      beforeEnter,
    }
  }
}
</script>

<style scoped>
.fade-enter-active, .fade-leave-active {
  transition: opacity .5s, transform 1s cubic-bezier(.75,-0.48,.26,1.52);
}
.fade-enter, .fade-leave-to{
  opacity:0;
}
</style>

在上面的代码中,我们通过设置 :css="false" 属性阻止 Vue3 使用默认的 transition 样式。然后,通过添加 type 属性和自定义的钩子函数来实现了 beforeEnter 的自定义过渡函数。

示例程序

参考Vue2的官方示例,这里提供了一个简单的Vue3过渡动画示例代码,包含了过渡类名、模式以及自定义过渡函数的使用。

<template>
  <div id="demo">
    <button v-on:click="toggle">Toggle</button>
    <transition :name="transitionName" :mode="transitionMode" :duration="{ appear: 5000, enter: 5000, leave: 5000 }" @before-enter="beforeEnter" @after-enter="afterEnter">
      <div v-if="show">
        Demo!
      </div>
    </transition>
  </div>
</template>

<script>
import { ref } from 'vue'

export default {
  name: 'hello',

  setup: function () {
    const show = ref(true)
    const transitionName = ref('')
    const transitionMode = ref('')

    const beforeEnter = function (el) {
      el.style.opacity = 0
      el.style.transformOrigin = 'center'
    }

    const afterEnter = function (el) {
      el.style.opacity = 1
    }

    const toggle = function () {
      show.value = !show.value
      transitionName.value = 'fade'
      transitionMode.value = 'out-in'
      if (show.value) {
        beforeEnter(document.getElementById('demo').children[1])
      }
    }
    return {
      show,
      toggle,
      transitionName,
      transitionMode,
      beforeEnter,
      afterEnter
    }
  }
}
</script>

<style scoped>
.fade-enter-active {
  transition: all .5s ease;
}

.fade-enter,
.fade-leave-to {
  transform: translateX(100%);
  opacity:0;
}
</style>

总结

通过本文介绍,我们了解了如何在 Vue3 中使用过渡动画。我们可以通过设置过渡类名、过渡模式以及自定义过渡函数来实现不同的效果。

我们希望,本文的介绍能够对您有所帮助,欢迎留言探讨。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:vue3过渡动画的详解 - Python技术站

(0)
上一篇 2023年6月10日
下一篇 2023年6月10日

相关文章

  • 关于css水平居中的小小探讨

    既然您想了解“关于css水平居中的小小探讨”的攻略,我先来简单介绍一下这个话题的背景。在前端开发中,一个常见的问题是如何将一个元素居中显示。其中,水平居中是一个比较常见的需求。下面,我会详细讲解实现水平居中的几种方法以及这些方法的适用场景。 1. text-align方法 text-align属性是设置文本水平对齐的CSS属性,可以用于快速对一个元素内的子元…

    css 2023年6月10日
    00
  • jQuery编写设置和获取颜色的插件

    下面是关于“jQuery编写设置和获取颜色的插件”的完整攻略。 插件准备 在开始编写颜色插件之前,我们需要准备一些基本工具和必要设定。具体如下: 安装jQuery库 我们需要确保在网站中引入了jQuery库,可以通过CDN或下载方式引入,在代码中添加如下代码,确保jQuery库被成功加载: <script src="https://cdn.b…

    css 2023年6月9日
    00
  • css屏幕居中的方法(推荐)

    下面我给您详细讲解“CSS屏幕居中的方法(推荐)”的完整攻略。 方法1:使用 Flexbox实现居中 步骤1:设置父元素的display为flex,让子元素可以排列 .container{ display: flex; } 步骤2:使用justify-content和align-items设置子元素的居中方式 justify-content属性是用来设置主轴…

    css 2023年6月9日
    00
  • DIV+CSS常见问题的14条原因分析

    下面我将详细讲解“DIV+CSS常见问题的14条原因分析”的完整攻略。 1. 稀奇古怪的盒模型问题 在使用 CSS 进行布局时,盒模型是非常重要的概念。不同的浏览器对于盒模型的 interpretation 会不同。建议在统一获取盒模型使用的方法或在使用时进行方法兼容。 2. 代码扁平化问题 在代码设计时,为了方便维护和后期开发,应该尽量采用扁平化的代码层级…

    css 2023年6月11日
    00
  • 详解如何解决position:fixed固定定位偏移问题

    下面将详细讲解如何解决position:fixed固定定位偏移问题的完整攻略。 问题描述 使用position: fixed可以使元素相对于浏览器窗口固定在某一位置,不随页面滚动而移动。但是,有时候会发现position: fixed定位的元素位置偏移了预期位置,出现了莫名其妙的位移情况。 这是由于使用position: fixed时,元素生成的”新层级”比…

    css 2023年6月9日
    00
  • 判断div滑动到底部的scroll实例代码

    要判断一个div是否滑动到底部,需要监听它的滚动事件,该事件触发时,可以通过判断scrollHeight和scrollTop之和是否等于clientHeight来判断是否滑动到底部。下面是完整的markdown格式文本示例代码: HTML代码 <div id="myDiv" style="height: 200px; ov…

    css 2023年6月10日
    00
  • CSS3对背景图片的裁剪及尺寸和位置的设定方法

    CSS 3 增加了对背景图片的裁剪、尺寸和位置的控制,使得在网页设计中可以更加方便地使用背景图片。下面,我们将详细讲解“CSS3对背景图片的裁剪及尺寸和位置的设定方法”的完整攻略。 控制背景尺寸 在 CSS3 中,可以使用 background-size 属性来控制背景图像的尺寸。该属性可以使用以下值: auto:默认值,表示不改变背景图片的原始尺寸。 &l…

    css 2023年6月9日
    00
  • CSS实现反方向圆角的示例代码

    CSS实现反方向圆角主要是通过使用border-radius属性来实现的。border-radius是CSS3新增的属性,用于设置元素的圆角半径,可以设置4个参数来分别控制4个角的圆角大小,也可以设置2个参数来控制水平方向的圆角半径和竖直方向的圆角半径。由于border-radius默认设置的是正方形的圆角,因此需要使用特定的技巧来实现反方向的圆角。 下面是…

    css 2023年6月10日
    00
合作推广
合作推广
分享本页
返回顶部