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 相关文章推荐
js 事件小结 表格区别
Aug 13 Javascript
jquery检测input checked 控件是否被选中的方法
Mar 26 Javascript
jQuery中$.extend()用法实例
Jun 24 Javascript
微信小程序之MaterialDesign--input组件详解
Feb 15 Javascript
js判断PC端与移动端跳转
Dec 24 Javascript
ionic2懒加载配置详解
Sep 01 Javascript
JavaScript如何获取到导航条中HTTP信息
Oct 10 Javascript
JavaScript 异步调用
Oct 25 Javascript
vue动画效果实现方法示例
Mar 18 Javascript
p5.js码绘“跳动的小正方形”的实现代码
Oct 22 Javascript
js页面加载后执行的几种方式小结
Jan 30 Javascript
JavaScript实现好看的跟随彩色气泡效果
Feb 06 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
推荐一篇入门级的Class文章
2007/03/19 PHP
javascript中对对层的控制
2006/12/29 Javascript
js 日期转换成中文格式的函数
2009/07/07 Javascript
javascript 静态对象和构造函数的使用和公私问题
2010/03/02 Javascript
jQuery 核心函数以及jQuery对象
2010/03/23 Javascript
javascript中自定义对象的属性方法分享
2013/07/12 Javascript
javascript动态判断html元素并执行不同的操作
2014/06/16 Javascript
Javascript基础教程之argument 详解
2015/01/18 Javascript
JavaScript中数组去除重复的三种方法
2016/04/22 Javascript
AngularJS基础 ng-srcset 指令简单示例
2016/08/03 Javascript
利用JQuery阻止事件冒泡
2016/12/01 Javascript
实例解析angularjs的filter过滤器
2016/12/14 Javascript
JavaScript中创建对象的7种模式详解
2017/02/21 Javascript
JavaScript简单实现合并两个Json对象的方法示例
2017/10/16 Javascript
详解Vue.js v-for不支持IE9的解决方法
2018/12/29 Javascript
layui实现tab的添加拒绝重复的方法
2019/09/04 Javascript
详解element-ui中表单验证的三种方式
2019/09/18 Javascript
layer.open 获取不到表单信息的解决方法
2019/09/26 Javascript
微信小程序中的上拉、下拉菜单功能
2020/03/13 Javascript
Vue前端判断数据对象是否为空的实例
2020/09/02 Javascript
python开发游戏的前期准备
2019/05/05 Python
机器学习实战之knn算法pandas
2019/06/22 Python
Python通过递归获取目录下指定文件代码实例
2019/11/07 Python
解决flask接口返回的内容中文乱码的问题
2020/04/03 Python
Jupyter Notebook 实现正常显示中文和负号
2020/04/24 Python
TensorFlow保存TensorBoard图像操作
2020/06/23 Python
详解CSS中iconfont的使用
2015/08/04 HTML / CSS
护士岗位求职应聘自荐书范文
2014/02/12 职场文书
学雷锋活动总结报告
2014/06/26 职场文书
材料专业大学毕业生自荐书
2014/07/02 职场文书
大学社团招新的通讯稿
2014/09/10 职场文书
不同意离婚答辩状
2015/05/22 职场文书
2015年教研员工作总结
2015/05/26 职场文书
信息简报范文
2015/07/21 职场文书
关于python类SortedList详解
2021/09/04 Python
使用python绘制分组对比柱状图
2022/04/21 Python