利用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 相关文章推荐
addRule在firefox下的兼容写法
Nov 30 Javascript
有关于eclipse配置spket需要注意的一些地方
Apr 07 Javascript
Jquery实现点击切换图片并隐藏显示内容(2种方法实现)
Apr 11 Javascript
JavaScript中创建类/对象的几种方法总结
Nov 29 Javascript
贴近用户体验的Jquery日期、时间选择插件
Aug 19 Javascript
vue左右侧联动滚动的实现代码
Jun 06 Javascript
Vue SPA单页应用首屏优化实践
Jun 28 Javascript
vue解决弹出蒙层滑动穿透问题的方法
Sep 22 Javascript
JavaScript闭包与作用域链实例分析
Jan 21 Javascript
D3.js(v3)+react 实现带坐标与比例尺的柱形图 (V3版本)
May 09 Javascript
JavaScript实现简单随机点名器
Nov 21 Javascript
Web应用开发TypeScript使用详解
May 25 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框架Phpbean说明
2008/01/10 PHP
PHP 中文处理技巧
2010/04/25 PHP
laravel 修改记住我功能的cookie保存时间的方法
2019/10/14 PHP
PHP程序员简单的开展服务治理架构操作详解(三)
2020/05/14 PHP
js常用代码段收集
2011/10/28 Javascript
DIV+CSS+JS不间断横向滚动实现代码
2013/03/19 Javascript
JS实现超简单的仿QQ折叠菜单效果
2015/09/21 Javascript
jquery实现表格隔行换色效果
2015/11/19 Javascript
jQuery实现图像旋转动画效果
2016/05/29 Javascript
浅谈react.js 之 批量添加与删除功能
2017/04/17 Javascript
深入理解nodejs中Express的中间件
2017/05/19 NodeJs
AngularJS实现与后台服务器进行交互的示例讲解
2018/08/13 Javascript
vue input实现点击按钮文字增删功能示例
2019/01/29 Javascript
Vue3.0结合bootstrap创建多页面应用
2019/05/28 Javascript
微信小程序自定义弹窗滚动与页面滚动冲突的解决方法
2019/07/16 Javascript
JS实现分页导航效果
2020/02/19 Javascript
[01:13:51]TNC vs Serenity 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
python显示生日是星期几的方法
2015/05/27 Python
Android应用开发中Action bar编写的入门教程
2016/02/26 Python
利用python程序帮大家清理windows垃圾
2017/01/15 Python
pyinstaller参数介绍以及总结详解
2019/07/12 Python
python实现的生成word文档功能示例
2019/08/23 Python
numpy:np.newaxis 实现将行向量转换成列向量
2019/11/30 Python
python如何进入交互模式
2020/07/06 Python
整理的15个非常有用的 HTML5 开发教程和速查手册
2011/10/18 HTML / CSS
意大利拉斐尔时尚购物网:Raffaello Network(支持中文)
2018/11/09 全球购物
Schecker荷兰:狗狗用品和配件
2019/06/06 全球购物
Myprotein瑞士官方网站:运动营养和健身网上商店
2019/09/25 全球购物
库房主管岗位职责
2013/12/31 职场文书
网络信息管理员岗位职责
2014/01/05 职场文书
协议书怎么写
2014/04/21 职场文书
师德师风个人反思
2014/04/28 职场文书
事业单位财务人员岗位职责
2015/04/14 职场文书
敬业奉献模范事迹材料(2016精选版)
2016/02/26 职场文书
2016年先进教师个人事迹材料
2016/02/26 职场文书
Java基础之线程锁相关知识总结
2021/06/30 Java/Android