当前位置:首页 > JavaScript

js实现洗牌动画

2026-03-16 06:37:34JavaScript

洗牌动画实现思路

洗牌动画的核心是通过JavaScript动态调整DOM元素的顺序和位置,模拟扑克牌洗牌的效果。关键点包括元素位置计算、动画过渡和随机排序。

基本HTML结构

创建一个简单的扑克牌容器,每张牌用div元素表示:

<div class="deck">
  <div class="card">A</div>
  <div class="card">2</div>
  <div class="card">3</div>
  <!-- 更多牌... -->
</div>

CSS样式设置

为卡片添加基本样式和过渡效果:

.deck {
  position: relative;
  width: 300px;
  height: 200px;
}

.card {
  position: absolute;
  width: 50px;
  height: 80px;
  background: white;
  border: 1px solid black;
  border-radius: 5px;
  display: flex;
  align-items: center;
  justify-content: center;
  transition: all 0.5s ease;
}

JavaScript洗牌逻辑

使用Fisher-Yates算法进行随机排序,并添加动画:

function shuffleDeck() {
  const deck = document.querySelector('.deck');
  const cards = Array.from(deck.children);

  // Fisher-Yates洗牌算法
  for (let i = cards.length - 1; i > 0; i--) {
    const j = Math.floor(Math.random() * (i + 1));
    [cards[i], cards[j]] = [cards[j], cards[i]];
  }

  // 更新DOM顺序
  cards.forEach(card => deck.appendChild(card));

  // 添加动画效果
  cards.forEach((card, index) => {
    const x = Math.random() * 200 - 100; // 随机x偏移
    const y = Math.random() * 100 - 50;  // 随机y偏移
    const rot = Math.random() * 30 - 15; // 随机旋转

    card.style.transform = `translate(${x}px, ${y}px) rotate(${rot}deg)`;

    // 延迟重置位置
    setTimeout(() => {
      card.style.transform = `translate(${index * 10}px, 0) rotate(0deg)`;
    }, 500);
  });
}

// 调用洗牌函数
shuffleDeck();

进阶动画效果

添加更真实的洗牌动画,模拟手部洗牌动作:

function advancedShuffle() {
  const deck = document.querySelector('.deck');
  const cards = Array.from(deck.children);
  const animationDuration = 1000;

  // 分阶段动画
  cards.forEach((card, i) => {
    // 第一阶段:散开
    card.style.transition = `transform ${animationDuration/2}ms ease`;
    card.style.transform = `
      translate(${Math.random()*200-100}px, ${Math.random()*100-50}px)
      rotate(${Math.random()*60-30}deg)
    `;

    // 第二阶段:重新收集
    setTimeout(() => {
      card.style.transition = `transform ${animationDuration/2}ms ease`;
      card.style.transform = `translate(${i*10}px, 0) rotate(0deg)`;

      // 更新DOM顺序
      setTimeout(() => deck.appendChild(card), animationDuration/2);
    }, animationDuration/2 + i*50);
  });
}

性能优化建议

对于大量元素的动画,考虑使用CSS硬件加速:

.card {
  will-change: transform;
  transform: translateZ(0);
}

使用requestAnimationFrame替代setTimeout可以获得更流畅的动画效果:

js实现洗牌动画

function animateShuffle() {
  let start = null;
  const duration = 1000;

  function step(timestamp) {
    if (!start) start = timestamp;
    const progress = (timestamp - start) / duration;

    // 更新动画状态
    // ...

    if (progress < 1) {
      requestAnimationFrame(step);
    }
  }

  requestAnimationFrame(step);
}

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

相关文章

js分组实现

js分组实现

分组实现方法 在JavaScript中,可以通过多种方式实现数组或对象的分组操作。以下是几种常见的方法: 使用Array.prototype.reduce() 通过reduce方法可以轻松实现数组分…

js实现抽奖

js实现抽奖

实现抽奖功能的基本思路 抽奖功能的核心是随机选择奖项并展示结果。可以通过数组存储奖项,利用随机数生成索引,最后通过动画增强用户体验。 准备奖项数据 定义一个数组存储奖项信息,每个奖项可以包含名称、图…

vue加载动画实现

vue加载动画实现

Vue 加载动画实现方法 使用 CSS 动画或过渡 在 Vue 组件中可以直接通过 CSS 实现加载动画效果。定义一个简单的旋转动画: .loading-spinner { width: 40p…

vue实现共享动画

vue实现共享动画

Vue 实现共享动画的方法 在 Vue 中实现共享动画(即多个元素间平滑过渡的动画效果)可以通过 Vue 的过渡系统和第三方库(如 GSAP)来实现。以下是几种常见方法: 使用 Vue 的 <…

js实现二叉树

js实现二叉树

二叉树的基本概念 二叉树是一种树形数据结构,每个节点最多有两个子节点,分别称为左子节点和右子节点。二叉树的常见操作包括插入、删除、遍历等。 二叉树的节点定义 在JavaScript中,二叉树的节点可…

js实现滚动

js实现滚动

实现滚动效果的方法 在JavaScript中实现滚动效果可以通过多种方式完成,以下是一些常见的方法: 使用window.scrollTo() window.scrollTo()方法可以将页面滚动到指…