当前位置:首页 > JavaScript

js实现刮刮卡

2026-03-01 08:19:27JavaScript

实现刮刮卡效果

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

HTML结构

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

js实现刮刮卡

<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);

功能扩展

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

js实现刮刮卡

// 重置刮刮卡
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实现类

JavaScript 实现类的几种方式 JavaScript 是一种基于原型的语言,但在 ES6 之后引入了 class 语法糖,使得实现类更加直观。以下是几种常见的实现方式: 使用构造函数 传统的…

js防抖和节流实现

js防抖和节流实现

防抖(Debounce)的实现 防抖的核心思想是在事件被触发后,延迟执行回调函数。如果在延迟时间内再次触发事件,则重新计时。适用于输入框搜索、窗口大小调整等场景。 function debounce…

js实现游标

js实现游标

使用JavaScript实现游标 在JavaScript中,可以通过操作DOM元素的cursor样式属性来实现自定义游标效果。以下是几种常见的实现方法: 修改默认鼠标指针样式 通过CSS的curso…

js实现上传图片

js实现上传图片

使用HTML5的File API实现图片上传 HTML5的File API允许通过JavaScript访问用户选择的文件。需要创建一个文件输入元素,并监听其change事件。 <input t…

实现图片旋转js

实现图片旋转js

使用CSS transform属性旋转图片 通过CSS的transform属性可以轻松实现图片旋转。以下是一个简单的示例代码: const image = document.getElement…

js 实现截图

js 实现截图

使用html2canvas库实现截图 html2canvas是一个流行的JavaScript库,可将HTML元素转换为Canvas,进而导出为图片。 安装库: npm instal…