使用HTML5实现刮刮卡效果

jerry HTML 2015年08月20日 收藏

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

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

HTML

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

  1. <canvas></canvas>

Javascript

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

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

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

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

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

  1. img.addEventListener('load', function(e) {
  2. var ctx;
  3. var w = img.width,
  4. h = img.height;
  5. var offsetX = canvas.offsetLeft,
  6. offsetY = canvas.offsetTop;
  7. var mousedown = false;
  8. function layer(ctx) {
  9. ctx.fillStyle = 'gray';
  10. ctx.fillRect(0, 0, w, h);
  11. }
  12. function eventDown(e){
  13. e.preventDefault();
  14. mousedown=true;
  15. }
  16. function eventUp(e){
  17. e.preventDefault();
  18. mousedown=false;
  19. }
  20. function eventMove(e){
  21. e.preventDefault();
  22. if(mousedown) {
  23. if(e.changedTouches){
  24. e=e.changedTouches[e.changedTouches.length-1];
  25. }
  26. var x = (e.clientX + document.body.scrollLeft || e.pageX) - offsetX || 0,
  27. y = (e.clientY + document.body.scrollTop || e.pageY) - offsetY || 0;
  28. with(ctx) {
  29. beginPath()
  30. arc(x, y, 10, 0, Math.PI * 2);//绘制圆点
  31. fill();
  32. }
  33. }
  34. }
  35. //...
  36. });

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

  1. img.addEventListener('load', function(e) {
  2. //..接上段代码
  3. canvas.width=w;
  4. canvas.height=h;
  5. canvas.style.backgroundImage='url('+img.src+')';
  6. ctx=canvas.getContext('2d');
  7. ctx.fillStyle='transparent';
  8. ctx.fillRect(0, 0, w, h);//绘制矩形
  9. layer(ctx);
  10. ctx.globalCompositeOperation = 'destination-out';
  11. canvas.addEventListener('touchstart', eventDown);
  12. canvas.addEventListener('touchend', eventUp);
  13. canvas.addEventListener('touchmove', eventMove);
  14. canvas.addEventListener('mousedown', eventDown);
  15. canvas.addEventListener('mouseup', eventUp);
  16. canvas.addEventListener('mousemove', eventMove);

你可以下载DEMO中的完整的代码,你可以根据实际需求,结合后台程序与数据库,完成一个真正的刮刮卡程序。

下载地址