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 相关文章推荐
Javascript操纵Cookie实现购物车程序
Nov 23 Javascript
更正确的asp冒泡排序
May 24 Javascript
Jquery Ajax方法传值到action的方法
May 11 Javascript
详谈JavaScript 匿名函数及闭包
Nov 14 Javascript
jquery实现的V字形显示效果代码
Oct 27 Javascript
三种Node.js写文件的方式
Mar 08 Javascript
基于JS实现仿京东搜索栏随滑动透明度渐变效果
Jul 10 Javascript
JavaScript基于对象方法实现数组去重及排序操作示例
Jul 10 Javascript
vue 动态绑定背景图片的方法
Aug 10 Javascript
vue.js 子组件无法获取父组件store值的解决方式
Nov 08 Javascript
vue组件中实现嵌套子组件案例
Aug 31 Javascript
vue中axios封装使用的完整教程
Mar 03 Vue.js
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中VC6 X86和VC9 X86的区别及 Non Thread Safe的意思
2013/06/28 PHP
PHP 线程安全与非线程安全版本的区别深入解析
2013/08/06 PHP
PHP实现把文本中的URL转换为链接的auolink()函数分享
2014/07/29 PHP
PHP中的类型提示(type hinting)功能介绍
2015/07/01 PHP
WordPress中调试缩略图的相关PHP函数使用解析
2016/01/07 PHP
ie下动态加态js文件的方法
2011/09/13 Javascript
jquery Mobile入门—多页面切换示例学习
2013/01/08 Javascript
jQuery中json对象的复制方式介绍(数组及对象)
2013/06/08 Javascript
js简单实现根据身份证号码识别性别年龄生日
2013/11/29 Javascript
原生js的弹出层且其内的窗口居中
2014/05/14 Javascript
jQuery获取iframe的document对象的方法
2014/10/10 Javascript
angularjs 处理多个异步请求方法汇总
2015/01/06 Javascript
JavaScript实现表格点击排序的方法
2015/05/11 Javascript
基于Bootstrap的Metronic框架实现页面链接收藏夹功能
2016/08/29 Javascript
谈谈jQuery之Deferred源码剖析
2016/12/19 Javascript
Bootstrap导航条鼠标悬停下拉菜单
2017/01/04 Javascript
原生javascript实现分页效果
2017/04/21 Javascript
Angular中的$watch方法详解
2017/09/18 Javascript
vue引入新版 vue-awesome-swiper插件填坑问题
2018/01/25 Javascript
详解使用vue-admin-template的优化历程
2018/05/20 Javascript
javascript设计模式 ? 原型模式原理与应用实例分析
2020/04/10 Javascript
python中enumerate的用法实例解析
2014/08/18 Python
Python中转换角度为弧度的radians()方法
2015/05/18 Python
python函数装饰器用法实例详解
2015/06/04 Python
python中字符串类型json操作的注意事项
2017/05/02 Python
Python实现的中国剩余定理算法示例
2017/08/05 Python
Python帮你微信头像任意添加装饰别再@微信官方了
2019/09/25 Python
python实现局域网内实时通信代码
2019/12/22 Python
scrapy中如何设置应用cookies的方法(3种)
2020/09/22 Python
pycharm中选中一个单词替换所有重复单词的实现方法
2020/11/17 Python
国际象棋商店:The Chess Store
2018/07/09 全球购物
后勤主管工作职责
2013/12/07 职场文书
家电业务员岗位职责
2014/03/10 职场文书
质量保证书格式
2015/02/27 职场文书
休学证明范本
2015/06/19 职场文书
详解Python为什么不用设计模式
2021/06/24 Python