vue3过渡动画的详解

yizhihongxing

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日

相关文章

  • CSS3实现歌词进度文字颜色填充变化动态效果的思路详解

    下面详细讲解“CSS3实现歌词进度文字颜色填充变化动态效果的思路详解”的攻略: 1. 思路概述 要实现歌词的进度文字颜色填充变化效果,可以利用CSS3中的渐变和动画属性。 首先,将歌词文字通过CSS的渐变属性(linear-gradient)设置为渐变颜色值。 其次,在歌词进度变化的过程中,通过CSS3动画属性(@keyframes)来控制歌词的颜色填充变化…

    css 2023年6月9日
    00
  • Vue中created和mounted使用场景分析

    当我们在使用Vue框架的时候,经常会遇到使用created和mounted两个生命周期钩子函数的情况。这两个函数经常被混淆,它们的使用场景也有所不同。因此,在本文中,我们将详细讲解Vue中created和mounted使用场景分析这个话题。 1. created和mounted的区别 在介绍二者的使用场景之前,我们先来了解一下created和mounted的…

    css 2023年6月10日
    00
  • vue3+vite assets动态引入图片的三种方法及解决打包后图片路径错误不显示的问题

    下面我将为您详细讲解“vue3+vite assets动态引入图片的三种方法及解决打包后图片路径错误不显示的问题”的完整攻略。 一、问题描述 在使用vue3和vite搭建前端项目时,我们可能会遇到动态引入图片的问题。具体而言,我们需要在vue3的template中动态引入图片资源进行展示,但是在打包部署的时候,我们发现图片路径出现错误,导致图片无法显示。因此…

    css 2023年6月9日
    00
  • 使用CSS3的appearance属性改变任何元素的浏览器默认风格

    使用CSS3的appearance属性可以改变任何元素的浏览器默认风格。这个属性可以用来修改一些标准控件的样式,或者改变一些HTML元素的默认外观,从而打造独特的用户体验。 修改标准控件的样式 如果想要修改标准控件的样式,可以使用appearance属性。下面以修改按钮的样式为例: button { appearance: none; background-…

    css 2023年6月10日
    00
  • 发一个css比较清爽的写法

    要写出比较清爽的 CSS 代码,我们需要遵循以下几个原则: 避免冗余,尽量减少代码的重复。 统一使用缩写属性,如 margin 和 padding 可以使用 margin: 10px 20px 30px 40px; 的方式代替。 注意 CSS 选择器的权重,尽量避免使用过于具体的选择器,以便提高代码的可重用性。 保持结构清晰,让代码易于维护。 下面是两个例子…

    css 2023年6月10日
    00
  • Dreamweaver CS3表格三种视图模式有什么区别?

    当使用Dreamweaver CS3进行表格设计时,可以通过三种不同的视图模式来查看和编辑表格。这三种视图模式是“标准视图”、“分隔线视图”和“布局视图”。下面将对这三种视图模式进行详细解释。 标准视图 标准视图是Dreamweaver CS3表格编辑的默认视图。在标准视图下,表格以标准的HTML语法呈现,包括行和列的标记、边框、背景颜色等。在这个视图中编辑…

    css 2023年6月11日
    00
  • JS前端轻量fabric.js系列之画布初始化

    本文将详细讲解JS前端轻量fabric.js系列之画布初始化的完整攻略。 1. 什么是fabric.js fabric.js是一个强大的Javascript库,它提供了一些基本的图形操作能力,可以方便地在Canvas上创建、操作和呈现图像,是一款非常好用、性价比高的前端辅助工具。 2. 画布初始化 2.1 引入fabric.js库文件 在初始化画布之前,我们…

    css 2023年6月10日
    00
  • React实现组件全屏化的操作方法

    当我们需要在React应用程序中实现组件全屏化时,可以采用以下操作方法。 1. 使用CSS样式 可以通过CSS样式来控制组件的宽高,以达到全屏化的效果。比较简单的方法是使用绝对定位和设置宽高为100%。具体做法如下: .full-screen { position: absolute; top: 0; left: 0; right: 0; bottom: 0…

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