搜索
首页web前端H5教程HTML5/CSS3专题 canvas 模拟实现电子彩票刮刮乐示例代码(图)

今天给大家带来一个刮刮乐的小例子~基于HTML5 canvas的,有兴趣的可以改成android版本的,或者其他的~

效果图:


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


好了,下面开始原理:

1、刮奖区域两个Canvas,一个是front , 一个back ,front遮盖住下面的canvas。

2、canvas默认填充了一个矩形,将下面canvas效果图遮盖,然后监听mouse事件,根据mousemove的x,y坐标,进行擦出front canvas上的矩形区域,然后显示出下面的canvas的效果图。

很简单把~嘿嘿~

1、HTML文件内容:

<!DOCTYPE html>
<html>
<head>
    <title></title>
    <meta charset="utf-8">

    <script type="text/javascript" src="../../jquery-1.8.3.js"></script>
    <script type="text/javascript" src="canvas2d.js"></script>

    <script type="text/javascript" src="GuaGuaLe2.js"></script>

    <script type="text/javascript">

        $(function ()
        {
            var guaguale = new GuaGuaLe("front", "back");
            guaguale.init({msg: "¥5000000.00"});
        });
    </script>
    <style type="text/css">


        body
        {
            background: url("s_bd.jpg") repeat 0 0;
        }

        .container
        {
            position: relative;
            width: 400px;
            height: 160px;
            margin: 100px auto 0;
            background: url(s_title.png) no-repeat 0 0;
            background-size: 100% 100%;
        }

        #front, #back
        {
            position: absolute;
            width: 200px;
            left: 50%;
            top: 100%;
            margin-left: -130px;
            height: 80px;
            border-radius: 5px;
            border: 1px solid #444;
        }

    </style>

</head>
<body>

<p class="container">
    <canvas id="back" width="200" height="80"></canvas>
    <canvas id="front" width="200" height="80"></canvas>
</p>


</body>
</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;
    }
}

以上是HTML5/CSS3专题 canvas 模拟实现电子彩票刮刮乐示例代码(图)的详细内容。更多信息请关注PHP中文网其他相关文章!

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
H5:HTML5的关键改进H5:HTML5的关键改进Apr 28, 2025 am 12:26 AM

HTML5带来了五个关键改进:1.语义化标签提升了代码清晰度和SEO效果;2.多媒体支持简化了视频和音频嵌入;3.表单增强简化了验证;4.离线与本地存储提高了用户体验;5.画布与图形功能增强了网页的可视化效果。

HTML5:标准及其对Web开发的影响HTML5:标准及其对Web开发的影响Apr 27, 2025 am 12:12 AM

HTML5的核心特性包括语义化标签、多媒体支持、离线存储与本地存储、表单增强。1.语义化标签如、等,提升代码可读性和SEO效果。2.和标签简化多媒体嵌入。3.离线存储和本地存储如ApplicationCache和LocalStorage,支持无网络运行和数据存储。4.表单增强引入新输入类型和验证属性,简化处理和验证。

H5代码示例:实际应用和教程H5代码示例:实际应用和教程Apr 25, 2025 am 12:10 AM

H5提供了多种新特性和功能,极大地增强了前端开发的能力。1.多媒体支持:通过和元素嵌入媒体,无需插件。2.画布(Canvas):使用元素动态渲染2D图形和动画。3.本地存储:通过localStorage和sessionStorage实现数据持久化存储,提升用户体验。

H5和HTML5之间的连接:相似性和差异H5和HTML5之间的连接:相似性和差异Apr 24, 2025 am 12:01 AM

H5和HTML5是不同的概念:HTML5是HTML的一个版本,包含新元素和API;H5是基于HTML5的移动应用开发框架。HTML5通过浏览器解析和渲染代码,H5应用则需要容器运行并通过JavaScript与原生代码交互。

H5代码的基础:密钥元素及其目的H5代码的基础:密钥元素及其目的Apr 23, 2025 am 12:09 AM

HTML5的关键元素包括、、、、、等,用于构建现代网页。1.定义头部内容,2.用于导航链接,3.表示独立文章内容,4.组织页面内容,5.展示侧边栏内容,6.定义页脚,这些元素增强了网页的结构和功能性。

HTML5和H5:了解常见用法HTML5和H5:了解常见用法Apr 22, 2025 am 12:01 AM

HTML5和H5没有区别,H5是HTML5的简称。1.HTML5是HTML的第五个版本,增强了网页的多媒体和交互功能。2.H5常用于指代基于HTML5的移动网页或应用,适用于各种移动设备。

HTML5:现代网络的基础(H5)HTML5:现代网络的基础(H5)Apr 21, 2025 am 12:05 AM

HTML5是超文本标记语言的最新版本,由W3C标准化。HTML5引入了新的语义化标签、多媒体支持和表单增强,提升了网页结构、用户体验和SEO效果。HTML5引入了新的语义化标签,如、、、等,使网页结构更清晰,SEO效果更好。HTML5支持多媒体元素和,无需第三方插件,提升了用户体验和加载速度。HTML5增强了表单功能,引入了新的输入类型如、等,提高了用户体验和表单验证效率。

H5代码:编写清洁有效的HTML5H5代码:编写清洁有效的HTML5Apr 20, 2025 am 12:06 AM

如何写出干净高效的HTML5代码?答案是通过语义化标签、结构化代码、性能优化和避免常见错误。1.使用语义化标签如、等,提升代码可读性和SEO效果。2.保持代码结构化和可读性,使用适当缩进和注释。3.优化性能,通过减少不必要的标签、使用CDN和压缩代码。4.避免常见错误,如标签未闭合,确保代码有效性。

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

EditPlus 中文破解版

EditPlus 中文破解版

体积小,语法高亮,不支持代码提示功能

SublimeText3 英文版

SublimeText3 英文版

推荐:为Win版本,支持代码提示!

Dreamweaver Mac版

Dreamweaver Mac版

视觉化网页开发工具

WebStorm Mac版

WebStorm Mac版

好用的JavaScript开发工具

SecLists

SecLists

SecLists是最终安全测试人员的伙伴。它是一个包含各种类型列表的集合,这些列表在安全评估过程中经常使用,都在一个地方。SecLists通过方便地提供安全测试人员可能需要的所有列表,帮助提高安全测试的效率和生产力。列表类型包括用户名、密码、URL、模糊测试有效载荷、敏感数据模式、Web shell等等。测试人员只需将此存储库拉到新的测试机上,他就可以访问到所需的每种类型的列表。