利用HTML5的画布Canvas实现刮刮卡效果


Posted in Javascript onSeptember 06, 2015

先给大家展示效果:

利用HTML5的画布Canvas实现刮刮卡效果

查看演示   源码下载

你玩过刮刮卡么?一不小心可以中奖的那种。今天我给大家分享一个基于HTML5技术实现的刮刮卡效果,在PC上只需按住鼠标,在手机上你只需按住指头,轻轻刮去图层就可以模拟真实的刮奖效果。

我们利用HTML5的画布Canvas,结合其提供的API,在Canvas元素上绘制一个灰色蒙层,然后通过检测用户鼠标移到和手势来绘制一个透明的图形,这样就能看到Canvas背景下的真实图片,就达到刮刮卡效果。

HTML

我们只需要在页面中加入canvas标签元素,其他的就看javascript的了。注意canvas元素是HTML5才有的元素,运行在支持HTML5的现代浏览器上。

<canvas></canvas>

Javascript

首先,我们要禁用页面的鼠标选中拖动的事件,就是不运行执行选中操作。

var bodyStyle = document.body.style; 
bodyStyle.mozUserSelect = 'none'; 
bodyStyle.webkitUserSelect = 'none';

接着我们定义图片类,获取canvas元素,并设置背景和位置属性。我们在本例中用到两张随机照片,每次刷新随机一张图片作为背景。

var img = new Image(); 
var canvas = document.querySelector('canvas'); 
canvas.style.backgroundColor='transparent'; 
canvas.style.position = 'absolute'; 
var imgs = ['p_0.jpg','p_1.jpg']; 
var num = Math.floor(Math.random()*2); 
img.src = imgs[num];

然后进入主体,当检测到图片加载完的时候,首先定义一些属性和函数,函数layer()用来绘制一个灰色的正方形,eventDown()定义了按下事件eventUp()定义了松开事件,eventMove()定义了移动事件,其中当按下时,获取坐标位移,并通过arc(x, y, 10, 0, Math.PI * 2)来绘制小圆点。

img.addEventListener('load', function(e) { 
 var ctx; 
 var w = img.width, 
  h = img.height; 
 var offsetX = canvas.offsetLeft, 
  offsetY = canvas.offsetTop; 
 var mousedown = false; 
 function layer(ctx) { 
  ctx.fillStyle = 'gray'; 
  ctx.fillRect(0, 0, w, h); 
 } 
 function eventDown(e){ 
  e.preventDefault(); 
  mousedown=true; 
 } 
 function eventUp(e){ 
  e.preventDefault(); 
  mousedown=false; 
 } 
 function eventMove(e){ 
  e.preventDefault(); 
  if(mousedown) { 
    if(e.changedTouches){ 
     e=e.changedTouches[e.changedTouches.length-1]; 
    } 
    var x = (e.clientX + document.body.scrollLeft || e.pageX) - offsetX || 0, 
     y = (e.clientY + document.body.scrollTop || e.pageY) - offsetY || 0; 
    with(ctx) { 
     beginPath() 
     arc(x, y, 10, 0, Math.PI * 2);//绘制圆点 
     fill(); 
    } 
  } 
 } 
 //... 
});

最后,通过canvas调用以上函数,绘制图形,并且侦听触控及鼠标事件,调用相应的函数,请看代码:

img.addEventListener('load', function(e) { 
 //..接上段代码 
 canvas.width=w; 
 canvas.height=h; 
 canvas.style.backgroundImage='url('+img.src+')'; 
 ctx=canvas.getContext('2d'); 
 ctx.fillStyle='transparent'; 
 ctx.fillRect(0, 0, w, h);//绘制矩形 
 layer(ctx); 
 ctx.globalCompositeOperation = 'destination-out'; 
 canvas.addEventListener('touchstart', eventDown); 
 canvas.addEventListener('touchend', eventUp); 
 canvas.addEventListener('touchmove', eventMove); 
 canvas.addEventListener('mousedown', eventDown); 
 canvas.addEventListener('mouseup', eventUp); 
 canvas.addEventListener('mousemove', eventMove);

以上内容仅供参考,大家可以结合实际情况,结合后台程序和数据库,完成一个真正的刮刮乐。以上内容是我写的利用HTML5的画布Canvas实现刮刮卡效果,希望大家喜欢。

Javascript 相关文章推荐
JavaScript 继承详解 第一篇
Aug 30 Javascript
Jsonp 跨域的原理以及Jquery的解决方案
May 18 Javascript
javascript 闭包疑问
Dec 30 Javascript
JavaScript Memoization 让函数也有记忆功能
Oct 27 Javascript
jQuery中element选择器用法实例
Dec 29 Javascript
js纯数字逐一停止显示效果的实现代码
Mar 16 Javascript
利用Javascript裁剪图片并存储的简单实现
Mar 13 Javascript
防止页面url缓存中ajax中post请求的处理方法
Oct 10 Javascript
Vue+mui实现图片的本地缓存示例代码
May 24 Javascript
对vue中methods互相调用的方法详解
Aug 30 Javascript
详解create-react-app 2.0版本如何启用装饰器语法
Oct 23 Javascript
p5.js实现故宫橘猫赏秋图动画
Oct 23 Javascript
JS实现鼠标滑过折叠与展开菜单效果代码
Sep 06 #Javascript
jQuery实现美观的多级动画效果菜单代码
Sep 06 #Javascript
jquery实现美观的导航菜单鼠标提示特效代码
Sep 06 #Javascript
基于Flowplayer打造一款免费的WEB视频播放器附源码
Sep 06 #Javascript
jquery京东商城双11焦点图多图广告特效代码分享
Sep 06 #Javascript
javascript日期处理函数,性能优化批处理
Sep 06 #Javascript
js实现改进的仿蓝色论坛导航菜单效果代码
Sep 06 #Javascript
You might like
PHP+FLASH实现上传文件进度条相关文件 下载
2007/07/21 PHP
PHP采集静态页面并把页面css,img,js保存的方法
2014/12/23 PHP
thinkPHP中验证码的简单使用方法
2015/12/26 PHP
浅谈PHP值mysql操作类
2016/06/29 PHP
页面调用单个swf文件,嵌套出多个方法。
2011/11/21 Javascript
解决Extjs4中form表单提交后无法进入success函数问题
2013/11/26 Javascript
JavaScript不使用prototype和new实现继承机制
2014/12/29 Javascript
JQuery实现展开关闭层的方法
2015/02/17 Javascript
JavaScript的Date()方法使用详解
2015/06/09 Javascript
JavaScript中的call方法和apply方法使用对比
2015/08/12 Javascript
jquery+json实现数据二级联动的方法
2015/11/28 Javascript
Javascript实现图片轮播效果(二)图片序列节点的控制实现
2016/02/17 Javascript
jQuery 中的 DOM 操作
2016/04/26 Javascript
浅谈JavaScript的自动垃圾收集机制
2016/12/15 Javascript
微信小程序开发之Tabbar实例详解
2017/01/09 Javascript
js实现5秒倒计时重新发送短信功能
2017/02/05 Javascript
JS实现一个简单的日历
2017/02/22 Javascript
react-native动态切换tab组件的方法
2018/07/07 Javascript
写gulp遇到的ES6问题详解
2018/12/03 Javascript
微信小程序云开发修改云数据库中的数据方法
2019/05/18 Javascript
vue+webpack dev本地调试全局样式引用失效的解决方案
2019/11/12 Javascript
js实现适配移动端的拖动效果
2020/01/13 Javascript
Python实现读写INI配置文件的方法示例
2018/06/09 Python
Python使用pickle模块实现序列化功能示例
2018/07/13 Python
python元组和字典的内建函数实例详解
2019/10/22 Python
nginx+uwsgi+django环境搭建的方法步骤
2019/11/25 Python
Python3查找列表中重复元素的个数的3种方法详解
2020/02/13 Python
解决Python pip 自动更新升级失败的问题
2020/02/21 Python
python GUI库图形界面开发之PyQt5 UI主线程与耗时线程分离详细方法实例
2020/02/26 Python
基于Tensorflow读取MNIST数据集时网络超时的解决方式
2020/06/22 Python
八一建军节部队活动方案
2014/02/04 职场文书
入股协议书范本
2014/11/01 职场文书
实习单位证明范例
2014/11/17 职场文书
2016公司年会主持词
2015/07/01 职场文书
公司环境卫生管理制度
2015/08/05 职场文书
SQL Server中交叉联接的用法详解
2021/04/22 SQL Server