利用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 相关文章推荐
js 函数调用模式小结
Dec 26 Javascript
js 调用百度地图api并在地图上进行打点添加标注
May 13 Javascript
jquery 实现input输入什么div图层显示什么
Jun 15 Javascript
jQuery中click事件的定义和用法
Dec 20 Javascript
JavaScript中switch语句的用法详解
Jun 03 Javascript
Windows下用PyCharm和Visual Studio开始Python编程
Oct 26 Javascript
Bootstrap每天必学之折叠(Collapse)插件
Apr 25 Javascript
如何使用Vuex+Vue.js构建单页应用
Oct 27 Javascript
bootstrap table方法之expandRow-collapseRow展开或关闭当前行数据
Aug 09 Javascript
webpack4实现不同的导出类型
Apr 09 Javascript
详解如何给React-Router添加路由页面切换时的过渡动画
Apr 25 Javascript
vue多页面项目中路由使用history模式的方法
Sep 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 采集程序原理分析篇
2010/03/05 PHP
php批量删除数据库下指定前缀的表以prefix_为例
2014/08/24 PHP
php 问卷调查结果统计
2015/10/08 PHP
PHP实现连接设备、通讯和发送命令的方法
2015/10/13 PHP
详解关于php的xdebug配置(编辑器vscode)
2019/01/29 PHP
js实现权限树的更新权限时的全选全消功能
2009/02/17 Javascript
javascript对JSON数据排序的3个例子
2014/04/12 Javascript
Node.js巧妙实现Web应用代码热更新
2015/10/22 Javascript
JavaScipt选取文档元素的方法(推荐)
2016/08/05 Javascript
Javascript中判断一个值是否为undefined的方法详解
2016/09/28 Javascript
深入剖析Node.js cluster模块
2018/05/23 Javascript
总结javascript三元运算符知识点
2018/09/28 Javascript
JS实现的类似微信聊天效果示例
2019/01/29 Javascript
file-loader打包图片文件时路径错误输出为[object-module]的解决方法
2020/01/03 Javascript
easyUI使用分页过滤器对数据进行分页操作实例分析
2020/06/01 Javascript
react+antd 递归实现树状目录操作
2020/11/02 Javascript
Vue 防止短时间内连续点击后多次触发请求的操作
2020/11/11 Javascript
Python中subprocess的简单使用示例
2015/07/28 Python
Python数据类型之List列表实例详解
2019/05/08 Python
pyqt实现.ui文件批量转换为对应.py文件脚本
2019/06/19 Python
Python对接六大主流数据库(只需三步)
2019/07/31 Python
Python3安装pip工具的详细步骤
2019/10/14 Python
Python实现把多维数组展开成DataFrame
2019/11/30 Python
Jupyter Notebook折叠输出的内容实例
2020/04/22 Python
django 装饰器 检测登录状态操作
2020/07/02 Python
一款利用html5和css3实现的3D立方体旋转效果教程
2016/04/26 HTML / CSS
历史学专业大学生找工作的自我评价
2013/10/16 职场文书
给物业的表扬信
2014/01/21 职场文书
给校长的一封建议书
2014/03/12 职场文书
班子群众路线教育实践个人对照检查材料思想汇报
2014/09/30 职场文书
2014年连锁店圣诞节活动方案
2014/12/09 职场文书
淮阳太昊陵导游词
2015/02/10 职场文书
老干部局2015年度工作总结
2015/10/22 职场文书
初三数学教学反思
2016/02/17 职场文书
十大最强电系宝可梦,阿尔宙斯电系之一,第七被称为雷神
2022/03/18 日漫
4种方法python批量修改替换列表中元素
2022/04/07 Python