当前位置:首页 > JavaScript

js实现刮刮卡

2026-01-30 17:14:46JavaScript

js实现刮刮卡

js实现刮刮卡

实现刮刮卡效果

使用HTML5 Canvas和JavaScript可以轻松实现刮刮卡效果。以下是具体实现方法:

基础HTML结构

<canvas id="scratchCanvas" width="300" height="150"></canvas>
<div id="prize" style="display:none;">恭喜中奖!</div>

CSS样式

#scratchCanvas {
  border: 1px solid #000;
  cursor: crosshair;
}
#prize {
  position: absolute;
  top: 50px;
  left: 50px;
  font-size: 24px;
  color: red;
}

JavaScript实现

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

// 初始化画布
function initCanvas() {
  ctx.fillStyle = '#ccc';
  ctx.fillRect(0, 0, canvas.width, canvas.height);
  ctx.fillStyle = '#666';
  ctx.font = '20px Arial';
  ctx.fillText('刮开此处查看结果', 50, 75);
}

// 绘制覆盖层
function drawCover() {
  ctx.globalCompositeOperation = 'source-over';
  ctx.fillStyle = '#ddd';
  ctx.fillRect(0, 0, canvas.width, canvas.height);
}

// 处理鼠标/触摸事件
canvas.addEventListener('mousedown', startDrawing);
canvas.addEventListener('mousemove', draw);
canvas.addEventListener('mouseup', stopDrawing);
canvas.addEventListener('mouseout', stopDrawing);

// 触摸设备支持
canvas.addEventListener('touchstart', handleTouch);
canvas.addEventListener('touchmove', handleTouch);
canvas.addEventListener('touchend', stopDrawing);

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

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

  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.globalCompositeOperation = 'destination-out';
  ctx.beginPath();
  ctx.arc(x, y, 15, 0, Math.PI * 2);
  ctx.fill();

  checkScratchPercentage();
}

function handleTouch(e) {
  e.preventDefault();
  if (e.type === 'touchstart') {
    startDrawing(e);
  } else if (e.type === 'touchmove') {
    draw(e);
  }
}

function stopDrawing() {
  isDrawing = false;
}

// 检查刮开比例
function checkScratchPercentage() {
  const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);
  const pixels = imageData.data;
  let transparentPixels = 0;

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

  const percentage = (transparentPixels / (canvas.width * canvas.height)) * 100;

  if (percentage > 50) {
    prize.style.display = 'block';
  }
}

// 初始化
initCanvas();
drawCover();

实现原理说明

  1. 使用Canvas绘制覆盖层作为刮刮卡的遮盖部分
  2. 通过设置globalCompositeOperation = 'destination-out'实现擦除效果
  3. 监听鼠标/触摸事件来触发擦除动作
  4. 定期检查透明像素比例,当超过阈值时显示奖品

进阶优化方向

  1. 添加刮开音效增强用户体验
  2. 实现重置功能,允许用户重新刮卡
  3. 使用更复杂的覆盖图案(如纹理图片)代替纯色
  4. 添加动画效果,如刮开时的粒子效果
  5. 支持移动端手势优化

移动端适配要点

  1. 添加touch事件处理确保移动设备兼容性
  2. 防止触摸事件的默认行为避免页面滚动
  3. 适当调整画布大小以适应不同屏幕
  4. 增加触摸反馈效果

通过以上代码和说明,可以快速实现一个基础的刮刮卡效果,并可根据需求进行进一步扩展和优化。

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

相关文章

js实现打印

js实现打印

使用window.print()方法实现打印 在JavaScript中,可以通过调用window.print()方法直接触发浏览器的打印功能。这会打开系统的打印对话框,用户可以选择打印机和设置打印选项…

js实现拷贝

js实现拷贝

实现文本拷贝 使用 document.execCommand 方法(已废弃但兼容性较好): function copyText(text) { const textarea = document…

js实现瀑布流

js实现瀑布流

实现瀑布流布局 瀑布流布局是一种常见的网页布局方式,常用于图片展示、商品列表等场景。以下是使用 JavaScript 实现瀑布流布局的几种方法。 纯 JavaScript 实现 通过计算元素的位置和…

js 实现链表

js 实现链表

链表的基本概念 链表是一种线性数据结构,由一系列节点组成,每个节点包含数据和指向下一个节点的指针。与数组不同,链表在内存中是非连续存储的,插入和删除操作效率较高。 链表的实现 在 JavaScrip…

js实现祖玛

js实现祖玛

实现祖玛游戏的核心思路 祖玛游戏的核心玩法是发射彩色珠子,形成三个或以上相同颜色的珠子即可消除。以下是使用JavaScript实现的基本框架。 游戏初始化 创建画布并初始化游戏状态: const…

js实现目录

js实现目录

实现目录的基本思路 在JavaScript中实现目录功能通常涉及以下几个核心步骤:解析文档中的标题元素(如h1-h6),动态生成目录结构,并添加交互逻辑(如点击跳转)。以下是具体实现方法: 解析标题…