canvas实现刮刮乐

一、文字版

  • 分为画板、奖品区、提示文字三部分
  • 画板填充涂层,鼠标按下移动时清除15*15矩形,以达到视觉效果的刮涂层
  • 在鼠标抬起时清除移动事件
  • 奖品区随机展示一个奖品结果,利用css层级,隐藏在涂层之下
xml 复制代码
<!DOCTYPE html>
<html lang="ch-en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>刮刮乐</title>
</head>
<body>
  <div class="box">
    <canvas width="300" height="150" id="canvas"></canvas>
    <div class="prize"></div>
    <div class="prompt">刮奖区</div>
  </div>
</body>
<script>
  window.onload = () => {
    var canvas = document.getElementsByTagName('canvas')[0];
    var ctx = canvas.getContext('2d');
    //绘制矩形,填充涂层
    ctx.fillStyle = '#999';
    ctx.fillRect(0, 0, 300, 150);
    //按下且移动事件
    canvas.onmousedown = (e) => {
      canvas.onmousemove = (e2) => {
        let x = e2.clientX
        let y = e2.clientY;
        // 清除一个15*15的矩形区域
        ctx.clearRect(x, y, 15, 15);
      }
    }
    //清除移动事件
    canvas.onmouseup = (e) => {
      canvas.onmousemove = null;
    }
    // 随机奖品
    var arr = ["奖品1", "奖品2", "奖品3", "奖品4"];
    var i = Math.floor(Math.random() * arr.length);
    document.getElementsByClassName("prize")[0].innerText = arr[i];
  }
</script>
<style>
  .box {
    width: 300px;
    height: 200px;
    position: relative;
  }
  .prize {
    position: absolute;
    width: 300px;
    height: 150px;
    text-align: center;
    line-height: 150px;
    font-size: 30px;
    color: red;
  }
  #canvas {
    border: 1px solid #000;
    position: absolute;
    z-index: 2;
  }
  .prompt {
    position: absolute;
    bottom: 10px;
    left: 50%;
    transform: translateX(-50%);
  }
</style>

</html>

二、图片版

  • 分为画板、图片区、提示文字三部分
  • 画板填充涂层,鼠标按下移动时清除15*15矩形,以达到视觉效果的刮涂层
  • 在鼠标抬起时清除移动事件
  • 奖品区随机展示一张图片,利用css层级,隐藏在涂层之下
xml 复制代码
<!DOCTYPE html>
<html lang="ch-en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>刮刮乐</title>
</head>
<body>
  <div class="box">
    <canvas width="300" height="150" id="canvas"></canvas>
    <img class="prize" src="" alt="">
    <div class="prompt">刮奖区</div>
  </div>
</body>
<script>
  window.onload = () => {
    var canvas = document.getElementsByTagName('canvas')[0];
    var ctx = canvas.getContext('2d');
    //绘制矩形,填充涂层
    ctx.fillStyle = '#999';
    ctx.fillRect(0, 0, 300, 150);
    //按下且移动事件
    canvas.onmousedown = (e) => {
      canvas.onmousemove = (e2) => {
        let x = e2.clientX
        let y = e2.clientY;
        // 清除一个15*15的矩形区域
        ctx.clearRect(x, y, 15, 15);
      }
    }
    //清除移动事件
    canvas.onmouseup = (e) => {
      canvas.onmousemove = null;
    }
    // 随机奖品
    var arr = ["https://p3.itc.cn/q_70/images03/20210531/ee932a2f55ba444e80320227b2e79a3a.jpeg", "http://gd-hbimg.huaban.com/28ea2e5cf17173f84ef74064e95627cc3ba75fe627e71-hKNgS4_fw658", "https://c-ssl.dtstatic.com/uploads/item/201202/23/20120223143146_xRHZy.thumb.1000_0.jpg", "http://hbimg.huaban.com/373229144a51bff1d78b09fd539a51d73d71d5c53ca80-qzvIEH_fw658"];
    var i = Math.floor(Math.random() * arr.length);
    console.log(arr[i]);
    document.querySelector('.prize').src = arr[i]
  }
</script>
<style>
  .box {
    width: 300px;
    height: 200px;
    position: relative;
  }
  .prize {
    position: absolute;
    width: 300px;
    height: 150px;
  }
  #canvas {
    border: 1px solid #000;
    position: absolute;
    z-index: 2;
  }
  .prompt {
    position: absolute;
    bottom: 10px;
    left: 50%;
    transform: translateX(-50%);
  }
</style>

</html>
相关推荐
随祥1 分钟前
Tauri+vue开发桌面程序环境搭建
前端·javascript·vue.js
万少4 小时前
HarmonyOS官方模板集成创新活动-流蓝卡片
前端·harmonyos
-To be number.wan7 小时前
C++ 赋值运算符重载:深拷贝 vs 浅拷贝的生死线!
前端·c++
噢,我明白了7 小时前
JavaScript 中处理时间格式的核心方式
前端·javascript
飞哥数智坊8 小时前
30多岁的我,为什么开始写自媒体?
程序员
纸上的彩虹8 小时前
半年一百个页面,重构系统也重构了我对前端工作的理解
前端·程序员·架构
be or not to be9 小时前
深入理解 CSS 浮动布局(float)
前端·css
LYFlied9 小时前
【每日算法】LeetCode 1143. 最长公共子序列
前端·算法·leetcode·职场和发展·动态规划
老华带你飞9 小时前
农产品销售管理|基于java + vue农产品销售管理系统(源码+数据库+文档)
java·开发语言·前端·数据库·vue.js·spring boot·后端
小徐_23339 小时前
2025 前端开源三年,npm 发包卡我半天
前端·npm·github