刚从南方回来就分了一个刮刮卡效果的页面,特么的我在烦恼怎么用H5去实现这个效果呢,好不容易写出来了,产品居然说:“既然你可以写出来这个效果那当然好了,开始我只是打算让你实现点击就出现呢!”… … 尼玛干嘛不早说呢?????真是自找麻烦。既然写了就分享给大家吧,这个效果其实很早就有了,只是我们不常用到罢了。H5的Canvas我很坦然的说我不会。但是既然工作上需要就需要学习一下了。虽然有demo但是自己写的时候还是出现了很多的bug。下面给大家说一下实现刮刮卡效果的步骤吧。(ps:按照我自己的demo讲了)

刮刮卡需求

  1. 每一位用户有三次刮刮卡的机会
  2. 本次刮刮卡的结果会覆盖上次的结果
  3. 刮刮卡的中奖几率呈现为递增的曲线(保证三次中必须有一次中奖)
  4. 刮出的结果包含按钮既(领取奖品 or 再来一次 )
  5. 分享活动奖品升级(这里主要是微信分享的回调了)
  6. 我们自己的需求,今天就说怎么制作刮刮卡,有这样需求的可以找我要源码

第一、body创建Canvas

 <div class="info" id="prize">
<span id="prompt"></span>
<span class="btn" id="ok">领取奖品</span>
<span class="btn" id="no">再来一次</span>
</div>
<canvas id="c1" class="canvas"></canvas>

这里我们首先创建了一个Canvas,并且在canvas底部加上了刮开后的效果。

第二、 页面加载后开始初始化画布

首先定义一些需要的变量

 var c1; //画布
var ctx; //画笔
var ismousedown; //标志用户是否按下鼠标或开始触摸
var isOk=0; //标志用户是否已经刮开了一半以上
var fontem = parseInt(window.getComputedStyle(document.documentElement, null)["font-size"]);//这是为了不同分辨率上配合@media自动调节刮的宽度

页面加载后开始初始化画布(这样子就可以在页面创建一个画布了)

window.onload = function(){
c1 = document.getElementById("c1");
//这里很关键,canvas自带两个属性width、height,我理解为画布的分辨率,跟style中的width、height意义不同。
//最好设置成跟画布在页面中的实际大小一样
//不然canvas中的坐标跟鼠标的坐标无法匹配
c1.width=c1.clientWidth;
c1.height=c1.clientHeight;
ctx = c1.getContext("2d");
//PC端的处理
c1.addEventListener("mousemove",eventMove,false);
c1.addEventListener("mousedown",eventDown,false);
c1.addEventListener("mouseup",eventUp,false);
//移动端的处理
c1.addEventListener('touchstart', eventDown,false);
c1.addEventListener('touchend', eventUp,false);
c1.addEventListener('touchmove', eventMove,false);
//初始化
initCanvas();
}

第三、画灰色的矩形铺满

function initCanvas(){//网上的做法是给canvas设置一张背景图片,我这里的做法是直接在canvas下面另外放了个div
//c1.style.backgroundImage="url(中奖图片.jpg)";
ctx.globalCompositeOperation = "source-over";
ctx.fillStyle = '#aaaaaa';
ctx.fillRect(0,0,c1.clientWidth,c1.clientHeight);
ctx.fill();
ctx.font = "Bold 30px Arial";
ctx.textAlign = "center";
ctx.fillStyle = "#999999";
ctx.fillText("刮一刮",c1.width/2,50);//把这个属性设为这个就可以做出圆形橡皮擦的效果
//有些老的手机自带浏览器不支持destination-out,下面的代码中有修复的方法
ctx.globalCompositeOperation = 'destination-out';
}

第四、鼠标按下 和 触摸开始

function eventDown(e){
e.preventDefault();
ismousedown=true;
}

第五、鼠标抬起 和 触摸结束

function eventUp(e){
e.preventDefault();
//得到canvas的全部数据
var a = ctx.getImageData(0,0,c1.width,c1.height);
var j=0;
for(var i=3;i<a.data.length;i+=4){
if(a.data[i]==0)j++;
}
//当被刮开的区域等于一半时,则可以开始处理结果
if(j>=a.data.length/8){
isOk = 1;
}
ismousedown=false;
}

第六、鼠标移动 和 触摸移动

 //鼠标移动 和 触摸移动
function eventMove(e){
e.preventDefault();
if(ismousedown) {
if(e.changedTouches){
e=e.changedTouches[e.changedTouches.length-1];
}
var topY = document.getElementById("top").offsetTop;
var oX = c1.offsetLeft,
oY = c1.offsetTop+topY;
var x = (e.clientX + document.body.scrollLeft || e.pageX) - oX || 0,
y = (e.clientY + document.body.scrollTop || e.pageY) - oY || 0; //画360度的弧线,就是一个圆,因为设置了ctx.globalCompositeOperation = 'destination-out';
//画出来是透明的
ctx.beginPath();
ctx.arc(x, y, fontem*1.2, 0, Math.PI * 2,true); //下面3行代码是为了修复部分手机浏览器不支持destination-out
//我也不是很清楚这样做的原理是什么
c1.style.display = 'none';
c1.offsetHeight;
c1.style.display = 'inherit';
ctx.fill();
}
if(isOk){
var btn = document.getElementsByClassName("btn");
for(var i=0; i<btn.length; i++){
btn[i].style.zIndex = '3';
}
document.getElementsByClassName("btn")[0].style.zIndex="3";
}
}

第七: 如果没有抽中再来一次

很明显,再来一次就是初始化所有的值,画布重新加载,但是如果有次数限制的需求,务必在这里计算清楚。

注:由于我们要求的比较多今天就不说怎么计算中奖概率的方法了。有需要的效果版可以单独找我来要案例。写错的地方欢迎指出。

DEMO下载请点击链接

Html5实现移动端、PC端 刮刮卡效果的更多相关文章

  1. js 设备判断(移动端pc端 安卓ios 微信)

    苹果安卓判断 $(function () { var u = navigator.userAgent, app = navigator.appVersion; var isAndroid = u.in ...

  2. 移动端&PC端CSS样式兼容代码

    CSS样式兼容代码 1.禁止选中复制文本 *{ user-select: none; -moz-user-select: none; -ms-user-select: none; -webkit-us ...

  3. REM布局计算,移动端,pc端有兼容性)

    rem布局计算(移动端,pc端有兼容性) <!DOCTYPE html> <html> <head lang="en"> <script& ...

  4. js -- 移动端pc端自动切换

    1. 判断浏览器类型 浏览器判断使用的github开源项目current-device,下面是地址: https://github.com/matthewhudson/current-device 在 ...

  5. Charles如何抓取https请求-移动端+PC端

    Charles安装完成,默认只能抓取到http请求,如果查看https请求,会显示unkonw或其它之类的响应.所以需要先进行一些配置,才能抓取到完整的https请求信息.下面针对PC端和手机端抓包的 ...

  6. React.js 入门与实战之开发适配PC端及移动端新闻头条平台课程上线了

    原文发表于我的技术博客 我在慕课网的「React.js 入门与实战之开发适配PC端及移动端新闻头条平台」课程已经上线了,文章中是目前整个课程的大纲,以后此课程还会保持持续更新,此大纲文档也会保持更新, ...

  7. 判断pc端还是移动,并给移动加上其它的样式文件方法

      所有移动端PC端 按 640 进行排版 body, html { width: %; height: %; overflow: hidden; background-color: #; } bod ...

  8. JS判断android ios系统 PC端和移动端

    最近公司上线移动端,需要根据不同的系统跳转到不同的产品页面,百度后发现这一段代码很好用,不但可以判断当前是什么系统,还能知道当前浏览器是什么内核,移动端PC端都已测试无问题! var browser ...

  9. 利用HTML5+Socket.io实现摇一摇控制PC端歌曲切换

    我比较喜欢听音乐,特别是周末的时候,电脑开着百度随心听fm,随机播放歌曲,躺在床上享受.但碰到了一个烦人的事情,想切掉不喜欢的曲子,还得起床去操作电脑换歌.于是思考能不能用手机控制电脑切换歌曲,经过一 ...

随机推荐

  1. 你值得拥有:25个Linux性能监控工具

    一.基于命令行的性能监控工具 1.dstat - 多类型资源统计工具 该命令整合了vmstat,iostat和ifstat三种命令.同时增加了新的特性和功能可以让你能及时看到各种的资源使用情况,从而能 ...

  2. Excel中设置下拉列表的来源怎么选择其他工作表的内容

    我就简单的说一下 SHEET1 的A1 要引用SHEET2的a1:a2的内容 在数据有效性里面选序列 输入=INDIRECT("sheet2!a1:a2") 或者你可以按楼上的意思 ...

  3. Android安装失败 Installation error code: -110

    在系统开发过程中,开发的app管理器,发现怎么安装都是失败. 详细的查看了log发现. I/ActivityManager(  899): START {dat=file:///mnt/sdcard/ ...

  4. :last-child

    匹配最后一个子元素 :last只匹配最后一个元素,而此选择符将为每个父元素匹配最后一个子元素 示例 描述: 在每个 ul 中查找最后一个 li HTML 代码: <ul> <li&g ...

  5. TCMalloc的使用

    Windows下: 1. 编译libtcmalloc_minimal,编成静态的动态的都可以. 2. 在链接中设置附加依赖库libtcmalloc_minimal.lib,并且强制符号引用要加上__t ...

  6. php之XML转数组函数的方法

    <?/** * xml2array() will convert the given XML text to an array in the XML structure. * Link: htt ...

  7. 第一册解说and表现

    综合日语第一册第五单元到十五单元的解说表现大集会:(这么一来一本书都被我搬上来啦--) 第五课 1.始めました: 初次见面时的寒暄用语,表示“初次见面(请多多观照)”之意. 2.どうぞよろしく: 用于 ...

  8. 【Jersey】IntelliJ IDEA + Maven + Jetty + Jersey搭建RESTful服务

    本文参考以下内容: 使用Jersey实现RESTful风格的webservice(一) Starting out with Jersey & Apache Tomcat using Intel ...

  9. c#下载网页源码的两种方法

    1.WebClient: System.Net.WebClient wc = new System.Net.WebClient(); Byte[] pageData = wc.DownloadData ...

  10. elasticsearch安装与基础用法

    来自官网,版本为2.3 注意elasticsearch依赖jdk,2.3依赖jdk7 下载rpm包并安装 wget -c https://download.elastic.co/elasticsear ...