您现在的位置是:网站首页> 编程资料编程资料
HTML5+CSS3实例 :canvas 模拟实现电子刮刮乐代码html5 canvas实现的可用于手机端手指滑动刮刮乐效果源码Html5 Canvas 实现一个“刮刮乐”游戏
                    
                
                2021-09-04
                1190人已围观
            
简介 今天给大家带来一个刮刮乐的小例子~基于HTML5 canvas的,非常具有使用价值,有兴趣的可以了解一下。
今天给大家带来一个刮刮乐的小例子~基于HTML5 canvas的,有兴趣的可以改成Android版本的,或者其他的~
效果图:

贴一张我中500w的照片,咋办啊,怎么花呢~

好了,下面开始原理:
1、刮奖区域两个Canvas,一个是front , 一个back ,front遮盖住下面的canvas。
2、canvas默认填充了一个矩形,将下面canvas效果图遮盖,然后监听mouse事件,根据mousemove的x,y坐标,进行擦出front canvas上的矩形区域,然后显示出下面的canvas的效果图。
很简单把~嘿嘿~
1、HTML文件内容:
2、首先我利用了一个以前写的canvas辅助类,留下来今天要用的一些方法:
/** * Created with JetBrains WebStorm. * User: zhy * Date: 13-12-17 * Time: 下午9:42 * To change this template use File | Settings | File Templates. */ function Canvas2D($canvas) { var context = $canvas[0].getContext("2d"), width = $canvas[0].width, height = $canvas[0].height, pageOffset = $canvas.offset(); context.font = "24px Verdana, Geneva, sans-serif"; context.textBaseline = "top"; /** * 绘制矩形 * @param start * @param end * @param isFill */ this.drawRect = function (start, end, isFill) { var w = end.x - start.x , h = end.y - start.y; if (isFill) { context.fillRect(start.x, start.y, w, h); } else { context.strokeRect(start.x, start.y, w, h); } }; /** * 根据书写的文本,得到该文本在canvas上书写的中心位置的左上角坐标 * @param text * @returns {{x: number, y: number}} */ this.caculateTextCenterPos = function (text) { var metrics = context.measureText(text); console.log(metrics); // context.font = fontSize + "px Verdana, Geneva, sans-serif"; var textWidth = metrics.width; var textHeight = parseInt(context.font); return { x: width / 2 - textWidth / 2, y: height / 2 - textHeight / 2 }; } this.width = function () { return width; } this.height = function () { return height; } this.resetOffset = function () { pageOffset = $canvas.offset(); } /** * 当屏幕大小发生变化,重新计算offset */ $(window).resize(function () { pageOffset = $canvas.offset(); }); /** * 将页面上的左边转化为canvas中的坐标 * @param pageX * @param pageY * @returns {{x: number, y: number}} */ this.getCanvasPoint = function (pageX, pageY) { return{ x: pageX - pageOffset.left, y: pageY - pageOffset.top } } /** * 清除区域,此用户鼠标擦出刮奖涂层 * @param start * @returns {*} */ this.clearRect = function (start) { context.clearRect(start.x, start.y, 10, 10); return this; }; /** *将文本绘制到canvas的中间 * @param text * @param fill */ this.drawTextInCenter = function (text, fill) { var point = this.caculateTextCenterPos(text); if (fill) { context.fillText(text, point.x, point.y); } else { context.strokeText(text, point.x, point.y); } }; /** * 设置画笔宽度 * @param newWidth * @returns {*} */ this.penWidth = function (newWidth) { if (arguments.length) { context.lineWidth = newWidth; return this; } return context.lineWidth; }; /** * 设置画笔颜色 * @param newColor * @returns {*} */ this.penColor = function (newColor) { if (arguments.length) { context.strokeStyle = newColor; context.fillStyle = newColor; return this; } return context.strokeStyle; }; /** * 设置字体大小 * @param fontSize * @returns {*} */ this.fontSize = function (fontSize) { if (arguments.length) { context.font = fontSize + "px Verdana, Geneva, sans-serif"; return this; } return context.fontSize; } } 这个类也就对Canvas对象进行了简单的封装,设置参数,绘制图形什么的,比较简单,大家可以完善下这个类~
3、GuaGuaLe.js
/** * Created with JetBrains WebStorm. * User: zhy * Date: 14-6-24 * Time: 上午11:36 * To change this template use File | Settings | File Templates. */ function GuaGuaLe(idFront, idBack) { this.$eleBack = $("#" + idBack); this.$eleFront = $("#" + idFront); this.frontCanvas = new Canvas2D(this.$eleFront); this.backCanvas = new Canvas2D(this.$eleBack); this.isStart = false; } GuaGuaLe.prototype = { constructor: GuaGuaLe, /** * 将用户的传入的参数和默认参数做合并 * @param desAttr * @returns {{frontFillColor: string, backFillColor: string, backFontColor: string, backFontSize: number, msg: string}} */ mergeAttr: function (desAttr) { var defaultAttr = { frontFillColor: "silver", backFillColor: "gold", backFontColor: "red", backFontSize: 24, msg: "谢谢惠顾" }; for (var p in desAttr) { defaultAttr[p] = desAttr[p]; } return defaultAttr; }, init: function (desAttr) { var attr = this.mergeAttr(desAttr); //初始化canvas this.backCanvas.penColor(attr.backFillColor); this.backCanvas.fontSize(attr.backFontSize); this.backCanvas.drawRect({x: 0, y: 0}, {x: this.backCanvas.width(), y: this.backCanvas.height()}, true); this.backCanvas.penColor(attr.backFontColor); this.backCanvas.drawTextInCenter(attr.msg, true); //初始化canvas this.frontCanvas.penColor(attr.frontFillColor); this.frontCanvas.drawRect({x: 0, y: 0}, {x: this.frontCanvas.width(), y: this.frontCanvas.height()}, true); var _this = this; //设置事件 this.$eleFront.mousedown(function (event) { _this.mouseDown(event); }).mousemove(function (event) { _this.mouseMove(event); }).mouseup(function (event) { _this.mouseUp(event); }); }, mouseDown: function (event) { this.isStart = true; this.startPoint = this.frontCanvas.getCanvasPoint(event.pageX, event.pageY); }, mouseMove: function (event) { if (!this.isStart)return; var p = this.frontCanvas.getCanvasPoint(event.pageX, event.pageY); this.frontCanvas.clearRect(p); }, mouseUp: function (event) { this.isStart = false; } }; 通过用户传入的两个canvas的id,然后生成一个对象,进行初始化操作,设置事件。当然了也提供用户设置可选的参数,各种颜色,已经刮开后显示的信息等,通过
{ frontFillColor: "silver", backFillColor: "gold", backFontColor: "red", backFontSize: 24, msg: "谢谢惠顾" };传给init方法进行设置。
好了,然后就基本完工了,测试一下:
基本实现了刮开图层,但是存在一个小问题,就是当用户滑动特别快时,会出现一些断点,当然也可以忽略,不过我们准备提供一下解决方案:

产生原因:由于鼠标移动速度过快,产生的断点;解决方案:将mousemove中两次的鼠标左边,进行拆分成多个断点坐标:

如上图,把两点之间进行连线,根据斜率,然后分成多个小段,分别获得线段上的坐标(有四种可能,有兴趣可以画画图,计算下,代码如下):
var k; if (p.x > this.startPoint.x) { k = (p.y - this.startPoint.y) / (p.x - this.startPoint.x); for (var i = this.startPoint.x; i < p.x; i += 5) { this.frontCanvas.clearRect({x: i, y: (this.startPoint.y + (i - this.startPoint.x) * k)}); } } else { k = (p.y - this.startPoint.y) / (p.x - this.startPoint.x); for (var i = this.startPoint.x; i > p.x; i -= 5) { this.frontCanvas.clearRect({x: i, y: (this.startPoint.y + ( i - this.startPoint.x ) * k)}); } } this.startPoint = p; 4、最后贴一下完整的GuaGuaLe.js
/** * Created with JetBrains WebStorm. * User: zhy * Date: 14-6-24 * Time: 上午11:36 * To change this template use File | Settings | File Templates. */ function GuaGuaLe(idFront, idBack) { this.$eleBack = $("#" + idBack); this.$eleFront = $("#" + idFront); this.frontCanvas = new Canvas2D(this.$eleFront); this.backCanvas = new Canvas2D(this.$eleBack); this.isStart = false; } GuaGuaLe.prototype = { constructor: GuaGuaLe, /** * 将用户的传入的参数和默认参数做合并 * @param desAttr * @returns {{frontFillColor: string, backFillColor: string, backFontColor: string, backFontSize: number, msg: string}} */ mergeAttr: function (desAttr) { var defaultAttr = { frontFillColor: "silver", backFillColor: "gold", backFontColor: "red", backFontSize: 24, msg: "谢谢惠顾" }; for (var p in desAttr) { defaultAttr[p] = desAttr[p]; } return defaultAttr; }, init: function (desAttr) { var attr = this.mergeAttr(desAttr); //初始化canvas this.backCanvas.penColor(attr.backFillColor); this.backCanvas.fontSize(attr.backFontSize); this.backCanvas.drawRect({x: 0, y: 0}, {x: this.backCanvas.width(), y: this.backCanvas.height()}, true); this.backCanvas.penColor(attr.backFontColor); this.backCanvas.drawTextInCenter(attr.msg, true); //初始化canvas this.frontCanvas.penColor(attr.frontFillColor); this.frontCanvas.drawRect({x: 0, y: 0}, {x: this.frontCanvas.width(), y: this.frontCanvas.height()}, true); var _this = this; //设置事件 this.$eleFront.mousedown(function (event) { _this.mouseDown(event); }).mousemove(function (event) { _this.mouseMove(event); }).mouseup(function (event) { _this.mouseUp(event); }); }, mouseDown: function (event) { this.isStart = true; this.startPoint = this.frontCanvas.getCanvasPoint(event.pageX, event.pageY); }, mouseMove: function (event) { if (!this.isStart)return; var p = this.frontCanvas.getCanvasPoint(event.pageX, event.pageY); this.frontCanvas.clearRect(p); }, mouseUp: function (event) { this.isStart = false; } }; 源码点击下载:demo
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
相关内容
- HTML5+CSS3 诱人的实例:3D立方体旋转动画实例html5+css3实现酷炫的3D立方体旋转动画特效源码CSS3 3D立方体效果示例-transform也不过如此纯css3实现的3D立方体旋转动画特效源码css3 transform及原生js实现鼠标拖动3D立方体旋转一款利用html5和css3实现的3D立方体旋转效果教程 纯CSS3实现的3D立方体旋转动画特效源码
 - 绝对定位元素的水平垂直居中的方法(3种任选)CSS水平垂直居中的几种方法总结在excel表格中怎么水平垂直居中对齐?css让容器水平垂直居中的7种方式利用CSS3的flexbox实现水平垂直居中与三列等高布局Flexbox制作CSS布局实现水平垂直居中的简单实例ppt表格中的文字怎么设置水平居中或垂直居中?浅析CSS实现水平垂直同时居中的5种思路让DIV水平垂直居中的两种完美方法推荐CSS解决页面图片水平垂直居中问题的方法全面总结使用CSS实现水平垂直居中效果的方法
 - 左侧固定,右侧自适应(两种方法任选)CSS左侧固定宽 右侧自适应的实现代码(兼容所有浏览器)左侧固定宽度,右侧自适应宽度的CSS布局
 - 解析width:100%;与width:auto;的区别Css深刻理解width:auto的用法
 - CSS3实现瀑布流布局与无限加载图片相册的实例代码3种方式实现瀑布流布局小结详解纯css实现瀑布流(multi-column多列及flex布局)css3 column实现卡片瀑布流布局的示例代码用CSS3实现瀑布流布局的示例代码瀑布流布局的两种实现方式:传统多列浮动和绝对定位布局waterfall瀑布流布局+动态渲染的实现
 - 深入理解和应用css中Float属性详解css中的floatCSS重要属性之float学习心得(分享)css(display,float,position)深入理解老生常谈css中float的用法CSS使用float属性设置浮动元素的实例教程使用CSS的overflow属性防止float撑开div的方法CSS清除浮动float的三种方法小结
 - 纯CSS实现3D按钮效果实例代码基于CSS Bootstrap超酷3D按钮特效源码CSS3实现扁平化风格3D按钮鼠标悬停按钮动画过渡特效源码 CSS3实现的支持单按钮和按钮组3D按钮效果源码纯CSS3实现简易3D按钮可配置背景颜色纯CSS3实现的3D开机按钮附有阴影以及光泽jquery+css3实现无图片的超帅3D按钮效果jQuery+CSS利用阴影实现的超酷3D按钮和文字特效
 - 利用css代码实现纸飞机效果实例源码利用CSS实现书签效果实例源码纯css3实现的圆形从中心向四周扩散动画效果源码使用CSS3实现一个3D相册效果实例纯CSS3实现鼠标悬停卡片翻转切换特效源码CSS3实现文字波浪线效果示例代码CSS3 2D模拟实现摩天轮旋转效果css3基于svg绘制的唐老鸭图片样式效果源码CSS3实现同时执行倾斜和旋转的动画效果CSS3实现个性可爱的甜品店动画幻灯片切换特效源码CSS3点击按钮实现背景渐变动画效果
 - 用CSS属性transparent实现各种三角形示例代码 css 中的background:transparent到底是什么意思有什么作用利用css绘制三角形的方法及拓展CSS3 画基本图形,圆形、椭圆形、三角形等DIV+CSS实现带三角箭头的提示框 用CSS制作三角形和按钮的简单实例CSS仿网易首页的头部菜单栏按钮和三角形制作方法利用CSS伪元素创建带三角形的提示框的实现方法纯CSS绘制三角形箭头图案技术解析Html+CSS绘制三角形图标使用CSS实现小三角形效果【附实例】
 - 利用CSS实现书签效果实例源码CSS3+DIV实现漂亮的动画彩色标签纯JS和CSS3炫酷桌面便签贴纸特效源码CSS基础教程十九之CSS图文混排,图像签名,多图拼接和图片特效 纯CSS实现Tab切换标签效果代码用CSS中的map标签制作单图多区域点击的示例HTML5 SVG和CSS3实现的表单浮动标签特效源码css3基于svg实现的地球旋转动画特效源码用CSS设定一个元素半透明Css3新特性应用之视觉效果实例纯css3实现的圆形从中心向四周扩散动画效果源码
 
                                
                                                        
                                
                                                        
                                
                                                        
    