近年来由于移动设备对HTML5的较好支持,经常有活动用刮奖的效果,最近也在看H5方面的内容,就自己实现了一个,现分享出来跟大家交流。

1、效果

2、原理

原理很简单,就是在刮奖区添加两个canvas,第一个canvas用于显示刮开后显示的内容,可以是一张图片或一个字符串,第二个canvas用于显示涂层,可以用一张图片或用纯色填充,第二个canvas覆盖在第一个canvas上面。

当在第二个canvas上点击或涂抹(点击然后拖动鼠标)时,把点击区域变为透明,这样就可以看到第一个canvas上的内容,即实现了刮奖效果。

3、实现

(1)定义Lottery类

对参数解释一下:

id:刮奖容器的id

coverType:涂层类型,值为 image 或 color,可空,默认为 color

width:刮奖区域宽度,默认为300px,可空

height:刮奖区域高度,默认为100px,可空

drawPercentCallback:刮开的区域百分比回调,可空

然后还定义了几个需要用到的变量:

background:第一个canvas元素

backCtx:background元素的2d上下文(context)

mask:第二个canvas元素

maskCtx:mask元素的2d上下文(context)

lotteryType:刮开后显示的内容类型,值为 image 或 text,要跟lottery匹配

clientRect:用于记录mask元素的 getBoundingClientRect() 值

(2)添加二个canvas到刮奖容器,并获取2d上下文

这里用于了createElement工具方法,另外还绑定了事件,后面介绍。

(3)绘制第一个canvas

第一个canvas分两种类型,image 和 string,如果是图片直接用canvas的drawImage就可以了,如果是string,要先用白色填充,然后在上下左右居中的地方绘制字符串,代码如下:

(4)绘制第二个canvas

第二个canvas也分 image 或 color 填充两种情况。

这里有一个难点,就是如何把鼠标点击区域变成透明的呢?答案在这里:https://developer.mozilla.org/en/docs/Web/Guide/HTML/Canvas_tutorial/Compositing

即我们要把 maskCtx的 globalCompositeOperation 设置为 destination-out ,详细的用法请参考上面给出的链接。

因此,绘制第二个canvas的代码如下:

this.resizeCanvas(this.mask, this.width, this.height);if (this.coverType == 'color') {this.maskCtx.fillStyle = this.cover;this.maskCtx.fillRect(0, 0, this.width, this.height);this.maskCtx.globalCompositeOperation = 'destination-out';

}else if (this.coverType == 'image'){var image = newImage(),

_this= this;

image.οnlοad= function() {

_this.maskCtx.drawImage(this, 0, 0);

_this.maskCtx.globalCompositeOperation= 'destination-out';

}

image.src= this.cover;

}

这里resizeCanvas是改变canvas大小的工具方法。

(5)绑定事件

绘制完成后,要给第二个canvas绑定事件。这里分了移动设备和PC-WEB两处情况。移动设备是 touchstart 和 touchmove 事件,对应的PC-WEB是keydown 和 mousemove事件,另外PC-WEB方式下,要给document绑定一个mouseup事件,用来判断鼠标是否按下。代码如下:

这里在事件中取出了鼠标坐标,调用了drawPoint进行了绘制,下面会讲到。

(6)绘制点击和涂抹区域

这里用到了canvas的径向渐变,在鼠标从标处绘制一个圆形,代码如下:

(7)涂抹区域百分比

在很多时候,我们还需要知道用户涂抹了多少然后进行下一步交互,如当用户涂抹了80%后,才允许下一张显示。

这个百分比如何计算呢?其实很简单,我们可以用getImageData方法到画布上指定矩形的像素数据,由于每个像素都是用rgba表示的,而涂抹过的区域是透明的,所以我们只需要判断alpha通道的值就可以知道是否透明。代码如下:

(8)调用入口init

最后再提供一个入口用来进行绘制和重置,代码如下:

init: function(lottery, lotteryType) {this.lottery =lottery;this.lotteryType = lotteryType || 'image';this.drawLottery();

}

至此,关键代码全部讲解完了。

(9)完整代码

完整代码及DEMO可点击 阅读原文或者加web前端学习群:304072187

感谢 · 转发

欢迎大家留言讨论

【扫码关注→】

html5刮奖效果,HTML5 Canvas实战之刮奖效果相关推荐

  1. html5刮奖效果,HTML5+Canvas实战之刮奖效果

    项目描述 HTML5+Canvas实战之刮奖效果,实现网页上刮奖,可以用作验证码: 可以在移动设备上和PC端网页(浏览器要支持canvas)上运行 ##使用说明 var lottery = new L ...

  2. html5 多啦a梦,canvas实现哆啦A梦效果

    //获取页面元素 var canvas = document.getElementById('abc'); //获取渲染上下文 var con = canvas.getContext('2d'); / ...

  3. canvas实践——绘制刮刮卡

    canvas实践--绘制刮刮卡 刮刮卡是一种常见的效果,如下图所示: 上述效果可以通过canvas中图像合成来实现,具体思路和代码如下: 1.利用css将刮刮卡的结果与canvas灰色涂层重叠: ht ...

  4. HTML用画布实现刮刮卡,利用HTML5的画布Canvas实现刮刮卡效果_javascript技巧

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

  5. html5粒子形成图案,html5 canvas粒子形成下雪背景的效果

    本篇文章给大家带来的内容是关于html5 canvas粒子形成下雪背景的效果,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. canvas粒子形成下雪背景 body{ margin: ...

  6. html5的canvas动画效果,HTML5 Canvas:制作动画特效

    要在HTML5 canvas中绘制图像动画效果,你需要绘制出每一帧的图像,然后在一个极短的时间内从一帧过渡到下一帧,形成动画效果.这其实是一种视觉欺骗,原理就像播放电影一样,胶片上每一格是一帧图片,然 ...

  7. html5 canvas 遮罩,HTML5 canvas如何实现橡皮擦擦拭效果

    简要教程 这是一款HTML5 canvas橡皮擦擦拭效果.该效果通过canvas来制作遮罩层和擦拭用的橡皮擦,用户可以通过移动鼠标来移除遮罩层,效果非常炫酷. 使用方法 HTML结构 该HTML5 c ...

  8. 用HTML5 Canvas 做擦除及扩散效果

    2013年的时候曾经使用canvas实现了一个擦除效果的需求,即模拟用户在模糊的玻璃上擦除水雾看到清晰景色的交互效果.好在2012年的时候学习HTML5的时候研究过canvas了,所以在比较短的时间内 ...

  9. canvas 擦除动画_用HTML5 Canvas 做擦除及扩散效果

    2013年的时候曾经使用canvas实现了一个擦除效果的需求,即模拟用户在模糊的玻璃上擦除水雾看到清晰景色的交互效果.好在2012年的时候学习HTML5的时候研究过canvas了,所以在比较短的时间内 ...

最新文章

  1. docker 删除默认连接_Net Core 中 Docker应用
  2. 数据结构: 插值查找算法
  3. 带着问题读CLR via C#(六)常量与字段
  4. linux查看服务器网络状态
  5. 【阿里巴巴研发效能峰会】低代码与数智化分论坛在线预约中……
  6. make、make clean、make uninstall的使用
  7. c语言按键实现跳转程序,C语言中的跳转语句
  8. 世界坐标转为屏幕坐标(UI坐标)
  9. CGAL 计算几何库
  10. 2022IC秋招面经分享【禾赛科技·FPGA开发工程师(上海)】
  11. 数学公式编辑器:MathType 7 for mac
  12. Go调试工具Delve
  13. Crosslink-NX器件应用案例(2): MIPI的多源合成(MUX)与分发(DeMUX)
  14. idea恢复被覆盖的本地未提交代码
  15. 通俗易懂说网络之基础名词及简要介绍(1)
  16. python如何大段注释_python大段注释
  17. Shader 学习笔记:杂记
  18. 腾讯阿里打通生态,针锋相对的时代或将结束?
  19. 工厂MES系统用Java写还是_制造企业都能使用MES系统吗?
  20. Visual C++网络编程经典案例详解 第9章 实用播放器 数据读取与播放控制 识别数据文件信息

热门文章

  1. 以太坊--众筹ICO实现
  2. 情感分析算法在阿里小蜜的应用实践
  3. python的基本内容_python基本知识
  4. 哈利波特:魔法觉醒游戏多开器
  5. jquery 查找表格里的input_JQ遍历表单获取input值或select值。
  6. MIPS单周期CPU设计(24条指令)
  7. MacOS无法登录卡在进度条界面解决办法
  8. vi 和vim 的区别
  9. 存储介质中ext4的文件排布
  10. windows下载openjdk8(附赠安装包)