当前位置:首页 > VUE

vue实现共享动画

2026-01-08 08:10:00VUE

Vue 共享动画实现方法

使用 Vue Transition 组件

Vue 内置的 Transition 组件可以实现元素进入/离开的过渡效果。通过命名过渡和 mode 属性可以控制多个元素的过渡顺序。

<transition name="fade" mode="out-in">
  <component :is="currentComponent"></component>
</transition>
.fade-enter-active, .fade-leave-active {
  transition: opacity 0.5s;
}
.fade-enter, .fade-leave-to {
  opacity: 0;
}

使用 Vue Router 过渡

在路由切换时实现页面间的共享动画效果,可以在 router-view 外包裹 Transition 组件。

vue实现共享动画

<router-view v-slot="{ Component }">
  <transition name="slide" mode="out-in">
    <component :is="Component" />
  </transition>
</router-view>

使用 FLIP 动画技术

FLIP (First, Last, Invert, Play) 技术可以实现高性能的共享元素过渡。

function flipAnimation(el, newRect, duration = 300) {
  const oldRect = el.getBoundingClientRect()
  const dx = oldRect.left - newRect.left
  const dy = oldRect.top - newRect.top
  const dw = oldRect.width / newRect.width
  const dh = oldRect.height / newRect.height

  el.style.transform = `translate(${dx}px, ${dy}px) scale(${dw}, ${dh})`
  el.style.transition = 'transform 0s'

  requestAnimationFrame(() => {
    el.style.transform = ''
    el.style.transition = `transform ${duration}ms`
  })
}

使用第三方库

Vue 生态中有多个专门处理动画的库:

vue实现共享动画

  • VueUse 的 useTransition 组合式 API
  • Vue-Kinesis 提供物理动画效果
  • GSAP 与 Vue 结合使用
import { gsap } from 'gsap'

export default {
  methods: {
    animateElement(el) {
      gsap.from(el, {
        duration: 0.5,
        opacity: 0,
        y: 20,
        ease: 'power2.out'
      })
    }
  }
}

状态驱动的动画

通过 Vue 的响应式系统和计算属性,可以实现基于状态变化的动画。

const app = Vue.createApp({
  data() {
    return {
      progress: 0
    }
  },
  computed: {
    progressStyle() {
      return {
        width: `${this.progress}%`,
        transition: 'width 0.5s ease'
      }
    }
  }
})

组件间通信动画

通过事件总线或状态管理实现跨组件的动画协调。

// 在共享状态中
const store = {
  state: {
    activeElement: null
  },
  setActiveElement(id) {
    this.state.activeElement = id
  }
}

// 在组件中
watch(() => store.state.activeElement, (newVal, oldVal) => {
  if (this.id === newVal || this.id === oldVal) {
    this.animate()
  }
})

性能优化技巧

  • 使用 will-change 属性提示浏览器
  • 优先使用 transform 和 opacity 属性
  • 减少动画期间的 DOM 操作
  • 合理使用 requestAnimationFrame
.animated-element {
  will-change: transform, opacity;
}

标签: 动画vue
分享给朋友:

相关文章

vue实现波形

vue实现波形

实现波形效果的方法 在Vue中实现波形效果可以通过多种方式完成,常见的方法包括使用Canvas绘制、CSS动画或第三方库。以下是几种实现方案: 使用Canvas绘制波形 通过Canvas API动态…

vue 实现弹窗

vue 实现弹窗

Vue 实现弹窗的方法 在 Vue 中实现弹窗功能可以通过多种方式完成,以下是几种常见的方法: 使用组件和 v-if/v-show 控制显示 创建一个独立的弹窗组件,通过 v-if 或 v-show…

vue 实现平面

vue 实现平面

Vue 实现平面的方法 在 Vue 中实现平面效果通常涉及 CSS 样式、UI 框架或自定义组件的使用。以下是几种常见方法: 使用 CSS 样式 通过 Vue 的样式绑定或 scoped CSS 为…

vue实现复制

vue实现复制

Vue 实现复制功能 在 Vue 中实现复制功能可以通过多种方式完成,以下是几种常见的方法: 方法一:使用 Clipboard API Clipboard API 是现代浏览器提供的一种原生 AP…

实现vue message

实现vue message

实现 Vue 消息提示组件 创建 Message 组件 在 src/components 目录下创建 Message.vue 文件,内容如下: <template> <tran…

vue实现tip

vue实现tip

Vue实现Tooltip的方法 使用Vue实现Tooltip可以通过多种方式完成,以下是几种常见的方法: 使用原生HTML的title属性 在Vue模板中直接使用HTML的title属性是最简单的实…