自制html5+canvas的刮刮卡效果

待我称王封你为后i 2022-06-06 07:39 304阅读 0赞

html部分

  1. <head>
  2. <meta charset="utf-8"/>
  3. <!-- IE=edge告诉IE使用最新的引擎渲染网页,chrome=1则可以激活Chrome Fram -->
  4. <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
  5. <meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0" name="viewport"/>
  6. <title>刮刮卡</title>
  7. <link rel="stylesheet" type="text/css" charset="utf-8" href="../../web/css/base.css">
  8. <link rel="stylesheet" type="text/css" charset="utf-8" href="../../web/css/media_phone.css">
  9. <link rel="stylesheet" type="text/css" charset="utf-8" href="../../web/css/clearCard.css">
  10. </head>
  11. <body>
  12. <div class="clearCard">
  13. <!-- 刮刮卡的画布 -->
  14. <canvas id="canvas">
  15. </canvas>
  16. </div>
  17. <script type="text/javascript" charset="utf-8" src="../../assets/jquery/jquery-3.2.1.js"></script>
  18. <script type="text/javascript" charset="utf-8" src="../../web/js/jquery-clearCard.js"></script>
  19. <script type="text/javascript" charset="utf-8" src="../../web/js/clearCard.js"></script>
  20. </body>

jquery刮刮卡插件

  1. //全局变量
  2. var isClear = false; //表示是否刮卡
  3. ;(function ($) {
  4. $.fn.extend({
  5. 'createCanvas': function (id, obj) {
  6. //获取画布对象
  7. var canvas = document.getElementById(id);
  8. //设置样式
  9. setCanvasStyle(canvas, obj);
  10. if (canvas.getContext) {
  11. var ctx = setCanvas(canvas, "rect", obj['background-color']);
  12. canvasEvent(canvas, ctx, obj['step'], obj['time']);
  13. }
  14. }
  15. });
  16. /* *声明一个函数用于设置画布样式 *canvas表示画布 *obj表示用户定义的样式表 */
  17. function setCanvasStyle(canvas, obj) {
  18. canvas.style.cursor = "pointer";
  19. canvas.style.backgroundImage = "url("+ obj['image'] + ")";
  20. canvas.style.backgroundRepeat = "no-repeat";
  21. canvas.style.backgroundPosition = "center center";
  22. canvas.style.backgroundSize = "contain";
  23. canvas.style.overflow = "hidden";
  24. canvas.style.border = obj['border'];
  25. canvas.style.width = obj['width'] || obj['height'];
  26. canvas.style.height = obj['height'] || obj['width'];
  27. }
  28. /* *声明一个函数用于设置画布的样式 *c表示画布的元素节点 *shape表示绘画的形状 *color表示画布上的颜色 */
  29. function setCanvas(c, shape, color) {
  30. //设置shape和color的默认值
  31. if (!checkOptions(shape, "string")) {
  32. shape = "rect";
  33. }
  34. if(!checkOptions(color, "string")) {
  35. color = "gray";
  36. }
  37. var ctx = c.getContext("2d");
  38. ctx.fillStyle = color;
  39. ctx.beginPath();
  40. switch (shape) {
  41. case "rect":
  42. ctx.rect(0, 0, canvas.width, canvas.height);
  43. break;
  44. default:
  45. return ;
  46. break;
  47. }
  48. ctx.closePath();
  49. ctx.fill();
  50. return ctx;
  51. }
  52. /* *该函数用于处理用户的出发的事件 *canvas表示画布对象 *step表示触点所在正方形的宽度 */
  53. function canvasEvent(canvas, ctx, step, time) {
  54. step -= 0;
  55. time -= 0;
  56. //给step和time设置默认值
  57. if (!checkOptions(step, "number", 0, 100)) {
  58. step = 5;
  59. }
  60. if (!checkOptions(time, "number", 0, 15000)) {
  61. time = 3000;
  62. }
  63. /* *该函数用于获取触点在画布上清除行为 *e表示触点默认传递的参数 *c表示设置的画布对象 *step表示触点所在正方形的宽度 */
  64. function clearCanvas(e) {
  65. if (!isClear) {
  66. return ;
  67. }
  68. e.preventDefault();
  69. e.stopPropagation();
  70. //声明一个变量保存画布通过getBoundingClientRect获取的对象
  71. var box = canvas.getBoundingClientRect();
  72. //声明变量保存当前触点在画布上的准确位置
  73. var curX = 0, curY = 0;
  74. if (isPC) {
  75. e = e || window.event;
  76. curX = (e.clientX - box.left) * (canvas.width / box.width);
  77. curY = (e.clientY - box.top) * (canvas.height / box.height);
  78. } else {
  79. var touch = e.targetTouches[0];
  80. curX = (touch.pageX - box.left) * (canvas.width / box.width);
  81. curY = (touch.pageY - box.top) * (canvas.height / box.height);
  82. }
  83. ctx.clearRect(curX - step, curY - step, curX, curY);
  84. //定义一个定时器,判断鼠标在画布上悬浮的时间
  85. //如果大于规定的,则清除所有的图层,显示刮刮乐的背景图
  86. var timer = setTimeout(function () {
  87. if (isClear) {
  88. ctx.clearRect(0, 0, canvas.width, canvas.height);
  89. }
  90. clearTimeout(timer);
  91. }, time);
  92. }
  93. if (isPC) {
  94. canvas.onmousedown = function () {
  95. isClear = !isClear;
  96. }
  97. canvas.onmouseup = function () {
  98. isClear = !isClear
  99. }
  100. canvas.onmousemove = function (e) {
  101. clearCanvas(e);
  102. }
  103. } else {
  104. canvas.addEventListener("touchstart", function (e) {
  105. isClear = !isClear;
  106. });
  107. canvas.addEventListener("touchend", function (e) {
  108. isClear = !isClear;
  109. });
  110. canvas.addEventListener("touchmove", function (e) {
  111. clearCanvas(e);
  112. }, false);
  113. }
  114. }
  115. /* *该函数用于判断当前设备是否是PC端 *如果返回true则表示当前在PC端 *否则当前再移动端 * */
  116. function isPC() {
  117. var userAgentInfo = navigator.userAgent.toLowerCase();
  118. var Agents = new Array("android", "iphone", "symbianOS", "windows phone", "ipad", "ipod");
  119. var flag = true;
  120. for (var v = 0; v < Agents.length; v++) {
  121. if (userAgentInfo.indexOf(Agents[v]) > 0) {
  122. flag = false; break;
  123. }
  124. }
  125. return flag;
  126. }
  127. /* *该函数用于判断是否满足指定类型,数字判断是否为数字以及超出最大值或最小值,字符串判断是否为空 *value表示要判断的值 *type表示要判断的类型 */
  128. function checkOptions(value, type, min, max) {
  129. if (type === 'string') {
  130. if (value !== null || value !== value || value !== '') {
  131. return true;
  132. } else {
  133. return false;
  134. }
  135. } else if(type === 'number') {
  136. if (isNaN(value) || value<min || value>max) {
  137. return false;
  138. } else {
  139. return true;
  140. }
  141. }
  142. }
  143. }(jQuery));

js引用插件

  1. $(function () {
  2. //canvas表示id名
  3. $(".clearCard").createCanvas("canvas", {
  4. "border": "1px solid #f2f2f2",
  5. "image": "../../web/img/rf-raffle3.jpg", //画布下面的图片
  6. "width": "6rem", //画布的宽
  7. //"height": "4rem", //画布的高
  8. "step": "20", //触点(鼠标)点击每次消失正方形的宽度
  9. "time": "2000" //触点(鼠标)按下停留指定时间后全部消失
  10. });
  11. });

发表评论

表情:
评论列表 (有 0 条评论,304人围观)

还没有评论,来说两句吧...

相关阅读

    相关 H5canvas

    原理:利用globalCompositeOperation 抠出来那个画出来的那个图像设置为透明,然后就能看到这个画布下层的图片 api: globalCompositeO