javascript+canvas实现刮刮卡抽奖效果


Posted in Javascript onJuly 29, 2015

运用canvas做的简单刮刮卡效果,每次刷新可重新测试

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<style type="text/css">
 *{ margin:0; padding:0;} 
 
.cjbox{ margin:100px; height:80px; width:200px; background:#FFF; position:relative;}
#canvas{position:absolute; left:0px; top:0px;z-index:99;}
.sjmes{ position:absolute; left:0px; top:0px; height:80px; width:200px; text-align:center; font-size:40px; line-height:80px; z-index:9;}
</style>
<title>demo1</title>
</head>
<body> 
 
<div style="position:relative; margin:20px 100px; background:#0CF; height:400px; width:500px; margin:0 auto;">
  <div>刮刮卡简单抽奖</div>
  <div class="cjbox">
    <div class="sjmes" id="sjmes"></div>
    <canvas width=200 height=80 id="canvas"></canvas> 
  </div>
</div> 
 
</body>
<script type="text/javascript">
//init 
var cjcon=["一等奖","二等奖","三等奖","谢谢参与"];//奖项设置
var cjper=[3,10,20,100];//奖项率,次数
/*
 * sjmes
 * @Author 透笔度(1530341234@qq.com)          
 * @param {cjcon}   所有奖项   
 */
var percjcon=[];
for(var i=0;i<cjper.length;i++){
  peic(cjper[i],i);
};
function peic(len,ind){
  for(var i=0;i<len;i++){
    percjcon.push(cjcon[ind]);
  }; 
};
var sjmes = document.getElementById("sjmes");
var numrandom=Math.floor(Math.random()*percjcon.length);
sjmes.innerHTML=percjcon[numrandom];
 
var opacityb=0.5;//透明百分比,参考值,什么程度出现提示
var backcolorb="#ffaaaa";
var numl=200*80;//总像素个数
var nump;//出现backcolorb的个数
var opacitya;//透明百分比实际值
 
var canvas = document.getElementById("canvas"); //获取canvas  
var context = canvas.getContext('2d'); //canvas追加2d画图
var flag = 0; //标志,判断是按下后移动还是未按下移动 重要
var penwidth=20; //画笔宽度
context.fillStyle="#faa"; //填充的颜色
context.fillRect(0,0,200,80); //填充颜色 x y坐标 宽 高
 
canvas.addEventListener('mousemove', onMouseMove, false); //鼠标移动事件 
canvas.addEventListener('mousedown', onMouseDown, false); //鼠标按下事件 
canvas.addEventListener('mouseup', onMouseUp, false); //鼠标抬起事件 
var movex=-1;
var movey=-1;
var imgData;//imagedada容器
var rgbabox=[];//存放读取后的rgba数据;
function onMouseMove(evt) {
  if (flag == 1) { 
    movex=evt.layerX;
    movey=evt.layerY;    
    context.fillStyle="#FF0000";
    context.beginPath();
    context.globalCompositeOperation="destination-out";
    context.arc(movex,movey,penwidth,0,Math.PI*2,true); //Math.PI*2是JS计算方法,是圆    
    context.closePath();
    context.fill();
  } 
} 
function onMouseDown(evt) { 
 flag = 1; //标志按下
} 
function onMouseUp(evt) { 
  flag = 0;
  //读取像素数据
  imgData=context.getImageData(0,0,200,80);//获取当前画布数据
  //imgData.data.length 获取图片数据总长度,没4个为一组存放rgba
  for(var i=0; i<imgData.data.length;i+=4){
    var rval=imgData.data[i];
    var gval=imgData.data[i+1];
    var bval=imgData.data[i+2];
    var aval=imgData.data[i+3];
    var rgbaval=rval+"-"+gval+"-"+bval+"-"+aval;
    rgbabox.push(rgbaval);
  }
  //end
  for(var j=0;j<rgbabox.length;j++){
    //alert(rgbabox[j].split("-")[0])
    rgbabox[j]='#'+rgbToHex(rgbabox[j].split("-")[0],rgbabox[j].split("-")[1],rgbabox[j].split("-")[2]);    
  }
  nump=countSubstr(rgbabox.join(","),backcolorb,true);
  opacitya=(numl-nump)/numl;
  if(opacitya>opacityb){
    alert("恭喜你获得"+percjcon[numrandom])
  }else{}
 
} 
function rgbToHex(r, g, b) { return ((r << 16) | (g << 8) | b).toString(16); }//rgb转为16进制 #xxx形式
function countSubstr(str,substr,isIgnore){//计算字符串出现子字符串的个数
  var count;
  var reg="";
  if(isIgnore==true){
  reg="/"+substr+"/gi"; 
  }else{
  reg="/"+substr+"/g";
  }
  reg=eval(reg);
  if(str.match(reg)==null){
  count=0;
  }else{
  count=str.match(reg).length;
  }
  return count;
}
//end
</script>
</html>

以上所述就是本文的全部内容了,希望大家能够喜欢。

Javascript 相关文章推荐
JQuery UI皮肤定制
Jul 27 Javascript
基于JQuery实现异步刷新的代码(转载)
Mar 29 Javascript
JavaScript之HTMLCollection接口代码
Apr 27 Javascript
使用jquery实现简单的ajax
Jul 08 Javascript
jquery获取子节点和父节点的示例代码
Sep 10 Javascript
jQuery中$.fn的用法示例介绍
Nov 05 Javascript
jquery实现文本框数量加减功能的例子分享
May 10 Javascript
jQuery实现异步获取json数据的2种方式
Aug 29 Javascript
javascript 闭包详解
Feb 15 Javascript
Javascript连接Access数据库完整实例
Aug 03 Javascript
layer的prompt弹出框,点击回车,触发确定事件的方法
Sep 06 Javascript
浅谈layer弹出层按钮颜色修改方法
Sep 11 Javascript
js实现登陆遮罩效果的方法
Jul 28 #Javascript
怎么通过onclick事件获取js函数返回值(代码少)
Jul 28 #Javascript
jQuery获取页面及个元素高度、宽度的总结——超实用
Jul 28 #Javascript
简单的jQuery入门指引
Jul 28 #Javascript
PageSwitch插件实现100种不同图片切换效果
Jul 28 #Javascript
异步JavaScript编程中的Promise使用方法
Jul 28 #Javascript
使用Browserify配合jQuery进行编程的超级指南
Jul 28 #Javascript
You might like
php设计模式 Visitor 访问者模式
2011/06/28 PHP
PHP获取数组最大值下标的方法
2015/05/12 PHP
CI框架整合smarty步骤详解
2016/05/19 PHP
Javascript 异步加载详解(浏览器在javascript的加载方式)
2012/05/20 Javascript
js面向对象 多种创建对象方法小结
2012/05/21 Javascript
javascript自定义startWith()和endWith()的两种方法
2013/11/11 Javascript
Javascript中克隆一个数组的实现代码
2013/12/06 Javascript
Javascript学习笔记之 函数篇(一) : 函数声明和函数表达式
2014/06/24 Javascript
JavaScript获取按钮所在form表单id的方法
2015/04/02 Javascript
nodejs实现HTTPS发起POST请求
2015/04/23 NodeJs
jQuery实现可关闭固定于底(顶)部的工具条菜单效果
2015/11/06 Javascript
JS显示日历和天气的方法
2016/03/01 Javascript
js实现带农历和八字等信息的日历特效
2016/05/16 Javascript
jQuery实现对网页节点的增删改查功能示例
2017/09/18 jQuery
angular 用Observable实现异步调用的方法
2018/12/27 Javascript
实用的Vue开发技巧
2019/05/30 Javascript
vscode vue 文件模板的配置方法
2019/07/23 Javascript
解决Vue打包上线之后部分CSS不生效的问题
2019/11/12 Javascript
[01:00:25]NB vs Secret 2018国际邀请赛小组赛BO1 B组加赛 8.19
2018/08/21 DOTA
Python黑魔法@property装饰器的使用技巧解析
2016/06/16 Python
Python实现购物车购物小程序
2018/04/18 Python
深入理解python中sort()与sorted()的区别
2018/08/29 Python
Python如何使用k-means方法将列表中相似的句子归类
2019/08/08 Python
pytorch中的embedding词向量的使用方法
2019/08/18 Python
Django框架模板用法入门教程
2019/11/04 Python
如何利用CSS3制作3D效果文字具体实现样式
2013/05/02 HTML / CSS
日本整理专家Marie Kondo的官方在线商店:KonMari
2020/06/29 全球购物
大学班级学风建设方案
2014/05/01 职场文书
工程售后服务承诺书
2014/05/21 职场文书
大专生自我鉴定怎么写
2014/09/16 职场文书
党员“四风”问题批评与自我批评思想汇报
2014/10/06 职场文书
民事诉讼答辩状范文
2015/05/21 职场文书
工伤认定行政答辩状
2015/05/22 职场文书
三严三实·严以律己心得体会
2016/01/13 职场文书
大学生创业计划书常用模板
2019/08/07 职场文书
【海涛解说】史上最给力比赛,挑战DOTA极限
2022/04/01 DOTA