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>
相关推荐
恋猫de小郭几秒前
Android Studio 放着没怎么用,怎么也会越来越卡?
android·前端·flutter
fanzhonghong3 分钟前
javaWeb开发之前端实战(Vue工程化+ElementPlus)
前端·javascript·vue.js·后端·spring
openKaka_5 分钟前
completeWork:真实 DOM 是在哪里被创建的
前端·javascript·react.js
希冀12310 分钟前
【CSS学习第六篇】
前端
Python大数据分析@10 分钟前
说说Markdown为什么不会被HTML取代
前端·html
史迪仔011214 分钟前
[QML] Qt5/6图像色彩空间处理
开发语言·前端·c++·qt
白嫖叫上我16 分钟前
Vue3+iconfont图标选择器封装
前端·vue
ID_1800790547324 分钟前
淘宝店铺所有商品 API 接口:核心能力与数据返回参考
java·服务器·前端
Hello--_--World30 分钟前
vite:什么是热更新?vite 和 webpack 有什么区别?vite常见配置和优化手段?
前端·webpack·node.js
渡我白衣31 分钟前
定时器与时间轮思想
linux·开发语言·前端·c++·人工智能·深度学习·神经网络