当前位置:首页 > JavaScript

js实现刮刮卡

2026-03-01 08:19:27JavaScript

实现刮刮卡效果

使用HTML5 Canvas和JavaScript可以轻松实现刮刮卡效果。以下是实现步骤和代码示例:

HTML结构

创建基本的HTML结构,包含Canvas元素和结果显示区域:

<div class="scratch-card">
  <canvas id="scratchCanvas"></canvas>
  <div class="result">恭喜中奖!</div>
</div>

CSS样式

设置Canvas和结果区域的样式:

.scratch-card {
  position: relative;
  width: 300px;
  height: 150px;
}

#scratchCanvas {
  position: absolute;
  top: 0;
  left: 0;
  background: #ccc;
  cursor: crosshair;
}

.result {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: 24px;
  color: #ff0000;
  pointer-events: none;
}

JavaScript实现

const canvas = document.getElementById('scratchCanvas');
const ctx = canvas.getContext('2d');
let isDrawing = false;

// 设置Canvas尺寸
function initCanvas() {
  canvas.width = canvas.offsetWidth;
  canvas.height = canvas.offsetHeight;

  // 绘制遮盖层
  ctx.fillStyle = '#cccccc';
  ctx.fillRect(0, 0, canvas.width, canvas.height);
  ctx.globalCompositeOperation = 'destination-out';
}

// 事件监听
canvas.addEventListener('mousedown', startDrawing);
canvas.addEventListener('mousemove', draw);
canvas.addEventListener('mouseup', stopDrawing);
canvas.addEventListener('touchstart', startDrawing);
canvas.addEventListener('touchmove', draw);
canvas.addEventListener('touchend', stopDrawing);

function startDrawing(e) {
  isDrawing = true;
  draw(e);
}

function draw(e) {
  if (!isDrawing) return;

  e.preventDefault();

  const rect = canvas.getBoundingClientRect();
  const x = (e.clientX || e.touches[0].clientX) - rect.left;
  const y = (e.clientY || e.touches[0].clientY) - rect.top;

  ctx.beginPath();
  ctx.arc(x, y, 15, 0, Math.PI * 2);
  ctx.fill();

  checkScratchCompletion();
}

function stopDrawing() {
  isDrawing = false;
}

function checkScratchCompletion() {
  const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);
  const pixels = imageData.data;
  let transparentCount = 0;

  for (let i = 3; i < pixels.length; i += 4) {
    if (pixels[i] === 0) {
      transparentCount++;
    }
  }

  const transparentRatio = transparentCount / (pixels.length / 4);
  if (transparentRatio > 0.6) {
    canvas.style.opacity = '0';
  }
}

// 初始化
window.addEventListener('load', initCanvas);
window.addEventListener('resize', initCanvas);

功能扩展

可以添加更多功能增强用户体验:

// 重置刮刮卡
function resetScratchCard() {
  canvas.style.opacity = '1';
  ctx.globalCompositeOperation = 'source-over';
  ctx.fillStyle = '#cccccc';
  ctx.fillRect(0, 0, canvas.width, canvas.height);
  ctx.globalCompositeOperation = 'destination-out';
}

// 添加奖品随机生成
const prizes = ['谢谢参与', '10元优惠券', '50元现金', '神秘大奖'];
document.querySelector('.result').textContent = prizes[Math.floor(Math.random() * prizes.length)];

移动端适配

确保在移动设备上也能正常使用:

// 防止触摸事件导致页面滚动
document.body.addEventListener('touchmove', function(e) {
  if (isDrawing) {
    e.preventDefault();
  }
}, { passive: false });

性能优化

对于较大的刮刮卡区域,可以优化检测逻辑:

function checkScratchCompletion() {
  const step = 10; // 检测步长
  let transparentCount = 0;
  let total = 0;

  for (let x = 0; x < canvas.width; x += step) {
    for (let y = 0; y < canvas.height; y += step) {
      total++;
      const pixel = ctx.getImageData(x, y, 1, 1).data;
      if (pixel[3] === 0) {
        transparentCount++;
      }
    }
  }

  if (transparentCount / total > 0.6) {
    canvas.style.opacity = '0';
  }
}

以上代码实现了一个完整的刮刮卡效果,支持鼠标和触摸操作,当刮开面积超过60%时会显示底层结果。可以根据需要调整Canvas大小、刮擦半径和完成阈值等参数。

js实现刮刮卡

标签: 刮刮卡js
分享给朋友:

相关文章

js 进度条的实现

js 进度条的实现

使用 HTML 和 CSS 创建基础进度条 HTML 结构可以简单使用一个 div 元素作为容器,内部嵌套另一个 div 表示进度: <div class="progress-containe…

js实现复制功能

js实现复制功能

使用 document.execCommand 方法 这种方法适用于较旧的浏览器,但在现代浏览器中可能被逐步淘汰。通过创建一个临时的 textarea 元素,将文本内容放入其中,然后执行复制命令。…

jquery.js

jquery.js

jQuery 是一个快速、简洁的 JavaScript 库,简化了 HTML 文档遍历、事件处理、动画设计和 Ajax 交互等操作。以下是关于 jQuery.js 的核心信息和使用方法: 获取 j…

js实现列表

js实现列表

使用 JavaScript 实现列表 JavaScript 提供了多种方式来实现列表功能,包括数组操作、DOM 元素动态生成等。以下是几种常见的实现方法: 使用数组存储列表数据 数组是 JavaS…

js实现换肤

js实现换肤

使用CSS变量实现换肤 通过CSS变量可以轻松实现主题切换功能。CSS变量在根元素中定义,通过JavaScript动态修改这些变量值。 :root { --primary-color: #34…

js实现vr

js实现vr

使用WebXR API实现VR体验 WebXR是浏览器中实现VR和AR体验的标准API,它取代了早期的WebVR。现代浏览器如Chrome、Edge和Firefox已支持WebXR。 // 初始化…