利用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 相关文章推荐
一些常用弹出窗口/拖放/异步文件上传等实用代码
Jan 06 Javascript
JS 实现导航栏悬停效果(续)
Sep 24 Javascript
使用js判断当前时区TimeZone是否是夏令时
Feb 23 Javascript
PHP实现的各种中文编码转换类分享
Jan 23 Javascript
jQuery原型属性和原型方法详解
Jul 07 Javascript
如何实现JavaScript动态加载CSS和JS文件
Dec 28 Javascript
js创建jsonArray传输至后台及后台全面解析
Apr 11 Javascript
JS实现的简单轮播图运动效果示例
Dec 22 Javascript
Angular中的$watch方法详解
Sep 18 Javascript
webpack中CommonsChunkPlugin详细教程(小结)
Nov 09 Javascript
Javascript获取某个月的天数
May 30 Javascript
Vue js 的生命周期(看了就懂)(推荐)
Mar 29 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树的代码,可以嵌套任意层
2006/10/09 PHP
Ha0k 0.3 PHP 网页木马修改版
2009/10/11 PHP
jQuery 使用手册(一)
2009/09/23 Javascript
ExtJS 下拉多选框lovcombo
2010/05/19 Javascript
解决遍历时Array.indexOf产生的性能问题
2012/07/03 Javascript
javascript对象的使用和属性操作示例详解
2014/03/02 Javascript
js propertychange和oninput事件
2014/09/28 Javascript
jQuery实现的多屏图像图层切换效果实例
2015/05/07 Javascript
通过实例理解javascript中没有函数重载的概念
2015/06/03 Javascript
Javascript中setTimeOut和setInterval的定时器用法
2015/06/12 Javascript
关于JavaScript限制字数的输入框的那些事
2016/08/14 Javascript
js判断价格,必须为数字且不能为负数的实现方法
2016/10/07 Javascript
探索webpack模块及webpack3新特性
2017/09/18 Javascript
Webpack 之 babel-loader文件预处理器详解
2018/03/23 Javascript
详解vue-video-player使用心得(兼容m3u8)
2019/08/23 Javascript
js找出5个数中最大的一个数和倒数第二大的数实现方法示例小结
2020/03/04 Javascript
JS实现表单中点击小眼睛显示隐藏密码框中的密码
2020/04/13 Javascript
vue实现简单学生信息管理
2020/05/30 Javascript
python email smtplib模块发送邮件代码实例
2018/04/26 Python
Python Pandas 箱线图的实现
2019/07/23 Python
pyinstaller打包找不到文件的问题解决
2020/04/15 Python
Selenium自动化测试工具使用方法汇总
2020/06/12 Python
canvas学习笔记之2d画布基础的实现
2019/02/21 HTML / CSS
澳大利亚排名第一的儿童在线玩具商店:Toy Galaxy
2018/10/06 全球购物
留学推荐信写作指南
2014/01/25 职场文书
2014年应届大学生毕业自我鉴定
2014/01/31 职场文书
求职信需要的五点内容
2014/02/01 职场文书
家具促销活动方案
2014/02/16 职场文书
乔丹名人堂演讲稿
2014/05/24 职场文书
个人简历自荐信
2014/06/26 职场文书
未中标通知书
2015/04/17 职场文书
生产现场禁烟通知
2015/04/23 职场文书
甲午风云观后感
2015/06/02 职场文书
2016入党积极分子党课学习心得体会
2015/10/09 职场文书
Python实现信息轰炸工具(再也不怕说不过别人了)
2021/06/11 Python
深入讲解Vue中父子组件通信与事件触发
2022/03/22 Vue.js