Html5實(shí)現(xiàn)移動(dòng)端、PC端 刮刮卡效果
來(lái)源:易賢網(wǎng) 閱讀:1444 次 日期:2016-08-01 14:59:48
溫馨提示:易賢網(wǎng)小編為您整理了“Html5實(shí)現(xiàn)移動(dòng)端、PC端 刮刮卡效果”,方便廣大網(wǎng)友查閱!

這篇文章主要介紹了 Html5實(shí)現(xiàn)移動(dòng)端、PC端 刮刮卡效果的相關(guān)資料,需要的朋友可以參考下

刮刮卡需求:

每一位用戶有三次刮刮卡的機(jī)會(huì)

本次刮刮卡的結(jié)果會(huì)覆蓋上次的結(jié)果

刮刮卡的中獎(jiǎng)幾率呈現(xiàn)為遞增的曲線(保證三次中必須有一次中獎(jiǎng))

刮出的結(jié)果包含按鈕既(領(lǐng)取獎(jiǎng)品 or 再來(lái)一次 )

分享活動(dòng)獎(jiǎng)品升級(jí)(這里主要是微信分享的回調(diào)了)

我們自己的需求,今天就說(shuō)怎么制作刮刮卡,有這樣需求的可以找我要源碼

第一、body創(chuàng)建Canvas

XML/HTML Code

<div class="info" id="prize">  

     <span id="prompt"></span>  

     <span class="btn" id="ok">領(lǐng)取獎(jiǎng)品</span>  

    <span class="btn" id="no">再來(lái)一次</span>  

 </div>  

 <canvas id="c1" class="canvas"></canvas>  

這里我們首先創(chuàng)建了一個(gè)Canvas,并且在canvas底部加上了刮開后的效果。

第二、 頁(yè)面加載后開始初始化畫布

首先定義一些需要的變量

XML/HTML Code

var c1; //畫布   

 var ctx; //畫筆   

 var ismousedown; //標(biāo)志用戶是否按下鼠標(biāo)或開始觸摸   

 var isOk=0; //標(biāo)志用戶是否已經(jīng)刮開了一半以上   

 var fontem = parseInt(window.getComputedStyle(document.documentElement, null)["font-size"]);//這是為了不同分辨率上配合@media自動(dòng)調(diào)節(jié)刮的寬度  

頁(yè)面加載后開始初始化畫布(這樣子就可以在頁(yè)面創(chuàng)建一個(gè)畫布了)

XML/HTML Code

window.onload = function(){    

    c1 = document.getElementById("c1");   

    //這里很關(guān)鍵,canvas自帶兩個(gè)屬性width、height,我理解為畫布的分辨率,跟style中的width、height意義不同。   

    //最好設(shè)置成跟畫布在頁(yè)面中的實(shí)際大小一樣   

    //不然canvas中的坐標(biāo)跟鼠標(biāo)的坐標(biāo)無(wú)法匹配   

    c1c1.width=c1.clientWidth;   

    c1c1.height=c1.clientHeight;   

    ctx = c1.getContext("2d");   

    //PC端的處理   

    c1.addEventListener("mousemove",eventMove,false);   

    c1.addEventListener("mousedown",eventDown,false);   

    c1.addEventListener("mouseup",eventUp,false);   

    //移動(dòng)端的處理   

    c1.addEventListener('touchstart', eventDown,false);   

    c1.addEventListener('touchend', eventUp,false);   

    c1.addEventListener('touchmove', eventMove,false);   

    //初始化   

    initCanvas();   

 }  

第三、畫灰色的矩形鋪滿

XML/HTML Code

function initCanvas(){//網(wǎng)上的做法是給canvas設(shè)置一張背景圖片,我這里的做法是直接在canvas下面另外放了個(gè)div   

     //c1.style.backgroundImage="url(中獎(jiǎng)圖片.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);//把這個(gè)屬性設(shè)為這個(gè)就可以做出圓形橡皮擦的效果   

     //有些老的手機(jī)自帶瀏覽器不支持destination-out,下面的代碼中有修復(fù)的方法   

     ctx.globalCompositeOperation = 'destination-out';}  

第四、鼠標(biāo)按下 和 觸摸開始

XML/HTML Code

function eventDown(e){   

    e.preventDefault();   

    ismousedown=true;}  

第五、鼠標(biāo)抬起 和 觸摸結(jié)束

XML/HTML Code

function eventUp(e){   

    e.preventDefault();   

    //得到canvas的全部數(shù)據(jù)   

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

    }   

    //當(dāng)被刮開的區(qū)域等于一半時(shí),則可以開始處理結(jié)果   

    if(j>=a.data.length/8){   

        isOk = 1;   

    }   

    ismousedown=false;   

 }  

第六、鼠標(biāo)移動(dòng) 和 觸摸移動(dòng)

XML/HTML Code

//鼠標(biāo)移動(dòng) 和 觸摸移動(dòng)   

function eventMove(e){   

    e.preventDefault();   

    if(ismousedown) {   

        if(e.changedTouches){   

            ee=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度的弧線,就是一個(gè)圓,因?yàn)樵O(shè)置了ctx.globalCompositeOperation = 'destination-out';   

        //畫出來(lái)是透明的   

        ctx.beginPath();   

        ctx.arc(x, y, fontem*1.2, 0, Math.PI * 2,true);   

        //下面3行代碼是為了修復(fù)部分手機(jī)瀏覽器不支持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";   

    }   

}  

第七: 如果沒(méi)有抽中再來(lái)一次

很明顯,再來(lái)一次就是初始化所有的值,畫布重新加載,但是如果有次數(shù)限制的需求,務(wù)必在這里計(jì)算清楚。

注:由于我們要求的比較多今天就不說(shuō)怎么計(jì)算中獎(jiǎng)概率的方法了。

以上所述是小編給大家介紹的 Html5實(shí)現(xiàn)移動(dòng)端、PC端 刮刮卡效果,希望對(duì)大家有所幫助

更多信息請(qǐng)查看網(wǎng)頁(yè)制作
易賢網(wǎng)手機(jī)網(wǎng)站地址:Html5實(shí)現(xiàn)移動(dòng)端、PC端 刮刮卡效果
由于各方面情況的不斷調(diào)整與變化,易賢網(wǎng)提供的所有考試信息和咨詢回復(fù)僅供參考,敬請(qǐng)考生以權(quán)威部門公布的正式信息和咨詢?yōu)闇?zhǔn)!
相關(guān)閱讀網(wǎng)頁(yè)制作

2025國(guó)考·省考課程試聽報(bào)名

  • 報(bào)班類型
  • 姓名
  • 手機(jī)號(hào)
  • 驗(yàn)證碼
關(guān)于我們 | 聯(lián)系我們 | 人才招聘 | 網(wǎng)站聲明 | 網(wǎng)站幫助 | 非正式的簡(jiǎn)要咨詢 | 簡(jiǎn)要咨詢須知 | 加入群交流 | 手機(jī)站點(diǎn) | 投訴建議
工業(yè)和信息化部備案號(hào):滇ICP備2023014141號(hào)-1 云南省教育廳備案號(hào):云教ICP備0901021 滇公網(wǎng)安備53010202001879號(hào) 人力資源服務(wù)許可證:(云)人服證字(2023)第0102001523號(hào)
云南網(wǎng)警備案專用圖標(biāo)
聯(lián)系電話:0871-65099533/13759567129 獲取招聘考試信息及咨詢關(guān)注公眾號(hào):hfpxwx
咨詢QQ:526150442(9:00—18:00)版權(quán)所有:易賢網(wǎng)
云南網(wǎng)警報(bào)警專用圖標(biāo)