当前位置:首页 > VUE

使用Vue实现洗牌动画

2026-02-21 05:05:30VUE

实现洗牌动画的基本思路

洗牌动画的核心是通过随机打乱元素顺序并配合过渡效果实现视觉上的洗牌过程。Vue的列表过渡(<transition-group>)和动态数据绑定非常适合此类需求。

使用Vue TransitionGroup实现

  1. 准备数据与模板结构

    <template>
      <div>
        <button @click="shuffle">洗牌</button>
        <transition-group name="shuffle" tag="div" class="card-container">
          <div v-for="card in cards" :key="card.id" class="card">
            {{ card.value }}
          </div>
        </transition-group>
      </div>
    </template>
  2. 初始化卡片数据

    使用Vue实现洗牌动画

    data() {
      return {
        cards: Array.from({ length: 10 }, (_, i) => ({
          id: i,
          value: i + 1
        }))
      }
    }
  3. 实现洗牌逻辑

    methods: {
      shuffle() {
        this.cards = [...this.cards]
          .sort(() => Math.random() - 0.5)
          .map((card, index) => ({
            ...card,
            id: index // 强制更新key触发动画
          }))
      }
    }
  4. 添加过渡样式

    使用Vue实现洗牌动画

    .shuffle-move {
      transition: transform 0.8s ease;
    }
    .card-container {
      display: flex;
      flex-wrap: wrap;
      gap: 10px;
    }
    .card {
      width: 60px;
      height: 80px;
      background: #fff;
      border-radius: 4px;
      display: flex;
      justify-content: center;
      align-items: center;
      box-shadow: 0 2px 4px rgba(0,0,0,0.2);
    }

进阶实现:3D翻转效果

  1. 修改卡片样式实现3D效果

    .card {
      transition: all 0.6s;
      transform-style: preserve-3d;
    }
    .shuffle-enter-active, .shuffle-leave-active {
      transition: all 0.6s;
    }
    .shuffle-enter, .shuffle-leave-to {
      opacity: 0;
      transform: rotateY(180deg);
    }
  2. 调整洗牌方法增加延迟

    async shuffle() {
      // 先让所有卡片翻转
      this.cards = this.cards.map(card => ({
        ...card,
        isFlipped: true
      }))
    
      await new Promise(resolve => setTimeout(resolve, 300))
    
      // 打乱顺序
      this.cards = [...this.cards]
        .sort(() => Math.random() - 0.5)
        .map((card, index) => ({
          ...card,
          id: index,
          isFlipped: false
        }))
    }

性能优化建议

使用FLIP动画技术(First-Last-Invert-Play)优化大规模列表动画:

  1. 记录元素初始位置(First)
  2. 执行DOM操作后获取最终位置(Last)
  3. 计算差异并应用transform反转(Invert)
  4. 播放过渡动画(Play)
// 示例FLIP实现
function flipAnimation(el) {
  const first = el.getBoundingClientRect()

  // 执行DOM变化后...
  const last = el.getBoundingClientRect()

  const dx = first.left - last.left
  const dy = first.top - last.top

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

  requestAnimationFrame(() => {
    el.style.transform = ''
    el.style.transition = 'transform 0.5s'
  })
}

注意事项

  • 确保每个列表项有唯一的:key
  • 对于复杂动画考虑使用GSAP等专业动画库
  • 移动端注意硬件加速(使用transform而非position动画)
  • 大量元素动画时考虑虚拟滚动优化

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

相关文章

Vue实现postMessage

Vue实现postMessage

Vue 中使用 postMessage 进行跨窗口通信 在 Vue 中使用 postMessage 可以实现跨窗口通信,适用于不同窗口或 iframe 之间的数据传递。以下是实现方法: 发送消息 在…

Vue实现手机推送

Vue实现手机推送

Vue 中实现手机推送的方法 在 Vue 项目中实现手机推送功能,通常需要结合第三方推送服务(如 Firebase Cloud Messaging、极光推送等)或原生移动端能力(通过 Cordova/…

Vue实现歌曲列表

Vue实现歌曲列表

Vue实现歌曲列表的方法 使用Vue实现歌曲列表可以通过组件化开发、数据绑定和事件处理来完成。以下是具体实现步骤: 数据准备 定义一个包含歌曲信息的数组,每个元素包含歌曲名称、歌手、时长等属性。数据…

Vue 实现登出功能

Vue 实现登出功能

实现登出功能的方法 在Vue中实现登出功能通常涉及清除用户认证信息、重置应用状态并跳转到登录页面。以下是几种常见的实现方式: 清除本地存储的token localStorage.removeIte…

vue 实现动画效果

vue 实现动画效果

Vue 实现动画效果的方法 Vue 提供了多种方式实现动画效果,包括内置的过渡系统、第三方动画库以及 CSS 动画。以下是几种常见的方法: 使用 Vue 内置过渡系统 Vue 的 <trans…

vue实现跑车动画

vue实现跑车动画

Vue 实现跑车动画的方法 在Vue中实现跑车动画可以通过多种方式完成,包括使用CSS动画、JavaScript动画库或结合SVG等技术。以下是几种常见的方法: 使用CSS动画和Vue过渡 通过Vu…