刚从南方回来就分了一个刮刮卡效果的页面,特么的我在烦恼怎么用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. c++获取系统时间(引用别人的博文)

    //方案— 优点:仅使用C标准库:缺点:只能精确到秒级#include <time.h> #include <stdio.h> int main( void ) {     t ...

  2. csuoj 1503: 点到圆弧的距离

    http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1503 1503: 点到圆弧的距离 时间限制: 1 Sec  内存限制: 128 MB  Speci ...

  3. jquery隐藏table表格的某一列

    jquery隐藏table表格的某一列: $('table tr').find('td:eq(13)').hide(); 隐藏table的第13列

  4. HAL驱动库学习--如何使用HAL库

    一 概述 下图是表述了用户层和HAL_Driver的交互过程,基本上从用户APP调用HAL_Driver APIs并且视情况当使用DMA或者专用中断时通过中断处理程序调用HAL_Driver APIs ...

  5. 《zw版·delphi与Halcon系列原创教程》THOperatorSetX版hello,zw

    <zw版·delphi与Halcon系列原创教程>THOperatorSetX版hello,zw 下面介绍v3版的hello,zw. Halcon两大核心控件,THImagex.THOpe ...

  6. Java enum(枚举)的用法详解(转)

    用法一:常量 在JDK1.5 之前,我们定义常量都是: public static fianl.... .现在好了,有了枚举,可以把相关的常量分组到一个枚举类型里,而且枚举提供了比常量更多的方法. p ...

  7. 一个解决chrome浏览器下input标签当autocomplete的时候背景变黄色同时input背景图片消失方案

    最近在改一个bug即如标题所讲的一样,chrome浏览器下当input标签开启autocomplete的时候input的背景颜色变黄同时在input的背景图片也被覆盖了.为此百度了好久发现网上说的使用 ...

  8. 图论$\cdot$强连通分量

    和无向图的连通分量类似,有向图有“强连通分量”的说法.“相互可达”的关系在有向图中也是等价关系.每一个集合称为有向图的一个强连通分量(scc).如果把一个集合看成一个点,那么所有的scc构成了一个sc ...

  9. WPF里的报警闪烁效果

    <esri:MarkerSymbol x:Key="FlashMarkerSymbol" OffsetX="41" OffsetY="41&qu ...

  10. JS部分代码分享

    2015-10-12 : 1.search()表达式:搜索索引 <!DOCTYPE html><html><body> <p>搜索字符串 "w ...