当前位置:首页 > JavaScript

js实现转盘

2026-01-30 21:12:05JavaScript

js实现转盘

实现转盘的基本思路

使用HTML5的Canvas或CSS3的旋转动画结合JavaScript实现转盘效果。核心是通过旋转角度计算奖品位置,并添加动画过渡效果。

HTML结构

<div class="wheel-container">
  <canvas id="wheel" width="400" height="400"></canvas>
  <button id="spin-btn">开始抽奖</button>
</div>

CSS样式

.wheel-container {
  position: relative;
  width: 400px;
  margin: 0 auto;
}

#wheel {
  display: block;
  margin: 0 auto;
  border-radius: 50%;
  box-shadow: 0 0 10px rgba(0,0,0,0.2);
}

#spin-btn {
  display: block;
  margin: 20px auto;
  padding: 10px 20px;
  background: #ff4757;
  color: white;
  border: none;
  border-radius: 5px;
  cursor: pointer;
}

JavaScript实现

const canvas = document.getElementById('wheel');
const ctx = canvas.getContext('2d');
const spinBtn = document.getElementById('spin-btn');
const prizes = ['奖品1', '奖品2', '奖品3', '奖品4', '奖品5', '奖品6'];
const colors = ['#FF6384', '#36A2EB', '#FFCE56', '#4BC0C0', '#9966FF', '#FF9F40'];
let currentAngle = 0;
let spinning = false;

function drawWheel() {
  const centerX = canvas.width / 2;
  const centerY = canvas.height / 2;
  const radius = Math.min(centerX, centerY) - 10;
  const arcAngle = (2 * Math.PI) / prizes.length;

  prizes.forEach((prize, index) => {
    const startAngle = index * arcAngle;
    const endAngle = (index + 1) * arcAngle;

    ctx.beginPath();
    ctx.moveTo(centerX, centerY);
    ctx.arc(centerX, centerY, radius, startAngle, endAngle);
    ctx.fillStyle = colors[index];
    ctx.fill();

    ctx.save();
    ctx.translate(centerX, centerY);
    ctx.rotate(startAngle + arcAngle / 2);
    ctx.textAlign = 'right';
    ctx.fillStyle = '#fff';
    ctx.font = '16px Arial';
    ctx.fillText(prize, radius - 20, 5);
    ctx.restore();
  });
}

function spin() {
  if (spinning) return;
  spinning = true;

  const spinDuration = 3000; // 3秒
  const startTime = Date.now();
  const startAngle = currentAngle;
  const spinAngle = 360 * 5 + Math.random() * 360; // 至少5圈+随机角度

  function animate() {
    const currentTime = Date.now();
    const elapsed = currentTime - startTime;
    const progress = Math.min(elapsed / spinDuration, 1);
    const easeProgress = easeOut(progress);
    currentAngle = startAngle + easeProgress * spinAngle;

    ctx.clearRect(0, 0, canvas.width, canvas.height);
    ctx.save();
    ctx.translate(canvas.width / 2, canvas.height / 2);
    ctx.rotate(currentAngle * Math.PI / 180);
    ctx.translate(-canvas.width / 2, -canvas.height / 2);
    drawWheel();
    ctx.restore();

    if (progress < 1) {
      requestAnimationFrame(animate);
    } else {
      spinning = false;
      const prizeIndex = Math.floor(((360 - currentAngle % 360) / 360) * prizes.length) % prizes.length;
      alert(`恭喜获得: ${prizes[prizeIndex]}`);
    }
  }

  animate();
}

function easeOut(t) {
  return 1 - Math.pow(1 - t, 3);
}

drawWheel();
spinBtn.addEventListener('click', spin);

实现要点

  1. Canvas绘图:使用Canvas API绘制扇形区域和文字,每个扇形代表一个奖品
  2. 旋转动画:通过requestAnimationFrame实现平滑旋转动画
  3. 缓动函数easeOut使旋转动画有自然减速效果
  4. 奖品计算:根据最终停止角度计算中奖奖品
  5. 防止重复点击spinning标志防止动画期间重复触发

扩展功能

  1. 自定义奖品:修改prizes数组可添加更多奖品
  2. 自定义样式:修改colors数组可改变扇形颜色
  3. 调整速度:修改spinDurationspinAngle可控制旋转时间和圈数
  4. 添加指针:可在CSS中添加固定指针元素增强视觉效果

这个实现提供了基础的转盘功能,可根据需要进一步扩展动画效果或奖品逻辑。

js实现转盘

标签: 转盘js
分享给朋友:

相关文章

js实现vue

js实现vue

Vue.js 的基本实现方法 在 JavaScript 中实现 Vue.js 的功能,可以通过直接引入 Vue 库或使用现代构建工具(如 Vite 或 Webpack)。以下是几种常见的实现方式:…

js 实现vue

js 实现vue

实现 Vue 的核心功能 在 JavaScript 中实现 Vue 的核心功能需要模拟数据绑定、虚拟 DOM 和响应式系统。以下是一个简化版的实现思路: 响应式系统 通过 Object.define…

vue实现抽奖转盘实现思路

vue实现抽奖转盘实现思路

实现抽奖转盘的基本思路 使用Vue实现抽奖转盘的核心在于动态旋转动画和结果判定。需要结合CSS动画、随机数生成和Vue的数据响应特性。 准备工作 安装Vue及相关依赖(如需要动画库): npm…

vue实现转盘抽奖

vue实现转盘抽奖

Vue 实现转盘抽奖 基本思路 转盘抽奖的核心是通过 CSS 动画实现旋转效果,Vue 负责控制旋转逻辑和数据绑定。关键点包括转盘扇形区域的绘制、旋转动画的触发与停止、中奖结果的判定。 实现步骤 H…

js实现

js实现

JavaScript 实现方法 JavaScript 是一种广泛使用的编程语言,适用于网页开发、服务器端编程以及移动应用开发。以下是几种常见的 JavaScript 实现方法: 网页交互功能 使用…

js实现

js实现

实现 JavaScript 功能的方法 在 JavaScript 中实现特定功能通常涉及多个步骤。以下是常见的实现方法: 基础语法和变量声明 使用 let 或 const 声明变量: let co…