当前位置:首页 > 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. 初始化卡片数据

    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. 添加过渡样式

    .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
分享给朋友:

相关文章

Vue语法实现

Vue语法实现

Vue 语法实现 Vue.js 是一个渐进式 JavaScript 框架,用于构建用户界面。以下是 Vue 的核心语法实现方式: 模板语法 Vue 使用基于 HTML 的模板语法,允许开发者声明式…

Vue gitbook 实现

Vue gitbook 实现

Vue 与 GitBook 集成实现 将 Vue 集成到 GitBook 中可以通过插件或自定义构建流程实现,以下是具体方法: 使用 gitbook-plugin-vue 插件 安装插件到 Git…

Vue实现手机推送

Vue实现手机推送

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

Vue查看全文实现

Vue查看全文实现

Vue 查看全文实现方法 在Vue中实现查看全文功能通常涉及文本截断和展开/折叠操作,以下是几种常见实现方式: 使用CSS控制文本显示 通过CSS的text-overflow和line-clamp…

Vue实现聊天软件

Vue实现聊天软件

Vue实现聊天软件的关键步骤 环境准备与项目初始化 使用Vue CLI或Vite创建Vue 3项目,安装必要依赖如vue-router、pinia(状态管理)、socket.io-client(实时通…

Vue实现lagger页面

Vue实现lagger页面

Vue实现懒加载页面的方法 懒加载(Lazy Loading)是一种优化技术,用于延迟加载非关键资源,从而提升页面初始加载速度。在Vue中可以通过以下方式实现懒加载: 路由懒加载 使用Vue Ro…