js 刮刮乐

网上无意间搜到了一个js刮刮乐效果,觉得很有趣,所以找来分析一下代码和效果,并根据自己理解精简了部分代码,分析不到位之处还请指教

(function(bodyStyle){

bodyStyle.mozUserSelect = 'none';           //这个功能设置为无法选择文本

bodyStyle.webkitUserSelect = 'none';

var img = new Image();

var canvas = document.querySelector('canvas');   //返回第一个canvas

canvas.style.position = 'absolute';       

img.addEventListener('load',function(e){    //给img绑定一个加载事件

var ctx;

var w = img.width, h = img.height;

var offsetX = canvas.offsetLeft, offsetY = canvas.offsetTop;

//获取canvas相对于img元素的边距

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){  //鼠标移动事件适用于web&wap端

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){   //设定默认对象ctx,相当于圆形画笔

beginPath()

arc(x, y, 5, 0, Math.PI * 2);

fill();

}

}

}

canvas.width=w;   //设置画板的长宽,根据图片自适应

canvas.height=h;

canvas.style.backgroundImage='url('+img.src+')';   //获取画板的背景图

ctx=canvas.getContext('2d');

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);

});

img.src = 'http://www.baidu.com/img/bdlogo.gif';

})(document.body.style);

思路分析:刮刮乐一共有三层,第一层是背景层,随便选一张图片即可;第二层是遮罩层,大小和位置自适应第一层背景图,用canvas画出,也就是globalCompositeOperation的概念里所说的目标图像;第三层是源图像,即canvas绘出的一个个圆。利用globalCompositeOperation中的destination-out属性,在源图像外显示目标图像(只有源图像外的目标图像部分会被显示,源图像是透明的。)目标图像是已经画在画布上的图像,即灰色遮罩,源图像通过鼠标的移动或者手指的触摸来放置到画布上。

废话了这么多其实关于刮刮乐我们需要掌握的知识点主要有两个:

1.js 的touch事件

2.canvas globalCompositeOperation 属性

最后我发现了刮刮乐一个bug。。当你点击鼠标快速移动的时候,放开鼠标之后不用点击都能刮刮乐,很神奇。。但由于技术渣,并不知道解决方法,虽然我觉得不会有人像我这样点击鼠标飞速移动哈哈。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,527评论 5 470
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,314评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,535评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,006评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,961评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,220评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,664评论 3 392
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,351评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,481评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,397评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,443评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,123评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,713评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,801评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,010评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,494评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,075评论 2 341

推荐阅读更多精彩内容