日本免费精品_最新日韩一区_亚洲视频一区在线_a在线视频观看_天天射夜夜骑_粉嫩av一区二区三区_欧美中日韩免费视频_综合图区欧美_国内精品美女在线观看_午夜精品久久久久久久男人的天堂

首頁 > 編程 > HTML > 正文

canvas實現扭蛋機動畫效果的示例代碼

2024-08-26 00:21:05
字體:
來源:轉載
供稿:網友

轉眼間,已經實習了兩個月了,公司每個月都有個會員日的活動要做,這個月的任務是做一個扭蛋機抽獎的活動,數據什么的都有接口,那么前端剩下最大的任務就只剩下扭蛋機的動畫實現了。

背景

本來興高采烈地從網上找了一個扭蛋機動畫,但是發現它是直接用css動畫,把扭蛋們的動畫寫死了,這樣我不是很喜歡,于是還是選擇用canvas繪制扭蛋的隨機動畫。先寫了個簡單的扭蛋機Demo,效果預覽

開始

布局

扭蛋機的布局比較簡單,只需要在基礎背景上添加一些元素就可以,最主要的是canvas標簽,其他都無所謂:

<div class="bg">    <span id="message">點擊抽獎</span>    <div class="lotterybg">        <canvas id="myCanvas" width="285px" height="170px"></canvas>        <img src="img/lighting.png" class="lighting"/>    </div></div><img src="img/start-btn.png" id="start" onclick="play()"/><div class="award"><span id="awardBall"></span></div><img src="img/1.png" id="ball1" class="imgSrc"><img src="img/2.png" id="ball2" class="imgSrc"><img src="img/3.png" id="ball3" class="imgSrc"><img src="img/4.png" id="ball4" class="imgSrc">

附上樣式表:

body {margin: 0;padding: 0;border: none;}.bg {background: url(../img/bg.png) top no-repeat;background-size: 100%;overflow: hidden;position: absolute;width: 400px;height: 100%;margin-top: 0;margin-left: 50%;-webkit-transform: translate(-50%);-moz-transform: translate(-50%);-ms-transform: translate(-50%);-o-transform: translate(-50%);transform: translate(-50%);}#message {position: absolute;text-align: center;height: 25px;font-size: 22px;margin-top: 110px;margin-left: 50%;-webkit-transform: translate(-50%);-moz-transform: translate(-50%);-ms-transform: translate(-50%);-o-transform: translate(-50%);transform: translate(-50%);}.lotterybg {background: url(../img/lotterybg.png) top no-repeat;background-size: 100%;overflow: visible;width: 80%;height: 100%;margin-top: 160px;margin-left: 50%;-webkit-transform: translate(-50%);-moz-transform: translate(-50%);-ms-transform: translate(-50%);-o-transform: translate(-50%);transform: translate(-50%);}#myCanvas {position: absolute;border: none;width: 285px;height: 170px;margin-top: 15px;margin-left: 50%;-webkit-transform: translate(-50%);-moz-transform: translate(-50%);-ms-transform: translate(-50%);-o-transform: translate(-50%);transform: translate(-50%);}.lighting {display: block;max-width: 99%;margin-top: 0;margin-left: 0;}#start {position: absolute;z-index: 3;width: 202px;margin-top: 413px;margin-left: 50%;-webkit-transform: translate(-50%);-moz-transform: translate(-50%);-ms-transform: translate(-50%);-o-transform: translate(-50%);transform: translate(-50%);}.imgSrc {display: none;position: absolute;}.award {position: absolute;border: none;width: 60px;height: 200px;top: 470px;margin-left: 50%;-webkit-transform: translate(-50%);-moz-transform: translate(-50%);-ms-transform: translate(-50%);-o-transform: translate(-50%);transform: translate(-50%);}

這樣子布局就算完成了,接下來主要工作就在canvas繪制圖像上了。

扭蛋動畫

先把各種變量定義好:

var canvas = document.getElementById('myCanvas');var ctx = canvas.getContext('2d');var ball1 = document.getElementById('ball1');//圖片對象var ball2 = document.getElementById('ball2');//圖片對象var ball3 = document.getElementById('ball3');//圖片對象var ball4 = document.getElementById('ball4');//圖片對象var ballList = [ball1, ball2, ball3, ball4];//圖片對象數組var ballNum = 4;//扭蛋機里面的小球數var awardList = [];//扭蛋機中的小球集合var timer;//計時器var award = document.getElementById('awardBall');var message = document.getElementById('message');

扭蛋對象

扭蛋機里面每個扭蛋都是一個對象,所以需要定義一個扭蛋對象:

function Ball(index, img) {    this.r = 30;//小球半徑    this.x = this.rand(canvas.width - this.r * 2);//小球初始橫坐標    this.y = this.rand(canvas.height - this.r * 2);//小球初始縱坐標    this.color = index;//小球顏色,以下標表示    this.img = img;//小球素材    do {        this.speedX = this.rand(20) - 10;    } while (this.speedX < 5);//小球橫坐標改變速度    do {        this.speedY = this.rand(20) - 10;    } while (this.speedY < 5);//小球縱坐標改變速度}

傳入扭蛋對象的值index為小球的顏色,用數字1~4表示,img是圖片對象,用來繪制扭蛋。

扭蛋方法

在上一步已經為扭蛋添加了屬性,接下來就是給扭蛋添加方法:

Ball.prototype = {    rand: function (num) {//隨機數        return Math.random() * num;    },    run: function () {//小球運動函數        this.x += this.speedX;        this.y += this.speedY;        if (this.x > canvas.width - this.r * 2) {//小球碰到右邊界,橫坐標速度變為負            this.speedX = -this.speedX;        }        if (this.x < 0) {//小球碰到左邊界,橫坐標速度變為正            this.speedX = Math.abs(this.speedX);        }        if (this.y > canvas.height - this.r * 2) {//小球碰到下邊界,縱坐標速度變為負            this.speedY = -this.speedY;        }        if (this.y < 0) {//小球碰到上邊界,縱坐標速度變為正            this.speedY = Math.abs(this.speedY);        }        ctx.drawImage(this.img, this.x, this.y, 60, 60);//繪制小球    }}

主要是為扭蛋對象的原型添加上運動函數,運動函數的作用就是讓扭蛋根據其速度動起來,并且在接觸到邊界的時候反彈。

初始化

接下來就是把扭蛋們放在扭蛋機里面:

function init() {//初始化    for (let i = 0; i < ballNum; i++) {//隨機生成各色小球        let index = Math.floor(4 * Math.random());        awardList[i] = new Ball(index, ballList[index]);//新建小球對象    }    window.clearInterval(timer);//清除計時器    timer = setInterval(function () {        ctx.clearRect(0, 0, canvas.width, canvas.height);//清空畫布        for (let i = 0; i < awardList.length; i++) {            awardList[i].run();        }//使小球運動    }, 15);}

這樣子扭蛋機里面就已經有了小球。

開始扭蛋

開始扭蛋主要經歷的過程就是點擊按鈕,扭蛋機扭蛋減少,獲得相應扭蛋,中獎顯示:

function play() {    if (awardList.length === 0) {//獎池中沒有小球        alert('重新開始!');        init();        message.innerText = '點擊抽獎';    } else {        window.clearInterval(timer);//清除計時器        let r = awardList.pop();//將獎池中的小球減少        timer = setInterval(function () {            ctx.clearRect(0, 0, canvas.width, canvas.height);//清空畫布            for (let i = 0; i < awardList.length; i++) {                awardList[i].run();            }//使小球運動        }, 15);        switch (r.color) {//小球掉落動畫            case 0:                award.setAttribute('class', 'dropBall1');                break;            case 1:                award.setAttribute('class', 'dropBall2');                break;            case 2:                award.setAttribute('class', 'dropBall3');                break;            case 3:                award.setAttribute('class', 'dropBall4');                break;        }        setTimeout(function () {//扭蛋成功提示            award.setAttribute('class', '');            switch (r.color) {                case 0:                    message.innerText = '紫球!';                    break;                case 1:                    message.innerText = '綠球!';                    break;                case 2:                    message.innerText = '黃球!';                    break;                case 3:                    message.innerText = '紅球!';                    break;            }        }, 1100);    }}

在這里扭蛋的掉落動畫使用css動畫的關鍵幀來完成:

.dropBall1 {content: "";position: absolute;left: 0;top: 0;width: 60px;height: 60px;display: block;background: url(../img/1.png) no-repeat;background-size: contain;animation: drop 1s ease-out forwards;-webkit-animation: drop 1s ease-out forwards;}.dropBall2 {content: "";position: absolute;left: 0;top: 0;width: 60px;height: 60px;display: block;background: url(../img/2.png) no-repeat;background-size: contain;animation: drop 1s ease-out forwards;-webkit-animation: drop 1s ease-out forwards;}.dropBall3 {content: "";position: absolute;left: 0;top: 0;width: 60px;height: 60px;display: block;background: url(../img/3.png) no-repeat;background-size: contain;animation: drop 1s ease-out forwards;-webkit-animation: drop 1s ease-out forwards;}.dropBall4 {content: "";position: absolute;left: 0;top: 0;width: 60px;height: 60px;display: block;background: url(../img/4.png) no-repeat;background-size: contain;animation: drop 1s ease-out forwards;-webkit-animation: drop 1s ease-out forwards;}@keyframes drop {    0% {        transform: scale(0.7);    }    50% {        transform: scale(1);    }    51% {        transform: translateY(0px);    }    100% {        transform: translateY(100px);    }}@-webkit-keyframes drop {    0% {        -webkit-transform: scale(0.7);    }    50% {        -webkit-transform: scale(1);    }    51% {        -webkit-transform: translateY(0px);    }    100% {        -webkit-transform: translateY(100px);    }}

結束

當然,需要最后加上init();來讓扭蛋機跑起來,到這里,這個簡單的扭蛋機就算完成了,效果預覽

總結

雖然這個Demo比較簡單,但是還是有一些注意點和一些可優化的地方。

注意點

img對象

在html中的這些img標簽:

<img src="img/1.png" id="ball1" class="imgSrc"><img src="img/2.png" id="ball2" class="imgSrc"><img src="img/3.png" id="ball3" class="imgSrc"><img src="img/4.png" id="ball4" class="imgSrc">

樣式也寫成display: none;,這樣寫是為了在js中獲取img對象,當然也可以不在html中寫這些img標簽,直接在js文件中寫:

var img = new Image(); img.src = 'img/1.png'; 

這樣子也可以得到img對象,也可以用來繪制扭蛋。

清除計時器

代碼中清除計時器都是在調用計時器之前,之所以這樣做的目的,是因為不清除計時器,計時器會一直計時,導致動畫越來越鬼畜。

畫布

在canvas畫布上繪制可能會出現圖像不清晰、放大的情況,這種情況可以通過將canvas標簽的width和height屬性設置成和樣式的width和height屬性相同來解決。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到HTML教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
黄色欧美日韩| 中文字幕在线视频日韩| 中文字幕不卡三区| 精品av中文字幕在线毛片| 亚洲欧洲综合另类| 日韩国产欧美| 精品在线99| 国产香蕉免费精品视频| 欧美啪啪一区| 在线手机中文字幕| 亚洲欧美韩国综合色| 久久视频www| 国产欧美在线观看| 国产手机视频一区二区| 日韩欧美在线第一页| 欧美日韩高清在线播放| www.精品视频| 顶级网黄在线播放| 国产乱码午夜在线视频| 91精品国产综合久久香蕉最新版 | 日韩欧美一卡二卡| 日韩欧美中文在线视频| 亚洲高清在线观看一区| av首页在线| 黄色一区二区视频| 福利一区二区| 视频一区二区中文字幕| 日韩免费视频| 精品国内自产拍在线视频| 欧美中文字幕在线| 精品网站999| 国产婷婷色一区二区三区在线| 黄色国产在线| 国产九九在线| 久久 天天综合| 中文官网资源新版中文第二页在线观看 | 亚洲欧洲三级| 91精品婷婷国产综合久久| 日韩欧美国产黄色| 久久精品久久久久| 久久精品欧美日韩精品| 中文天堂在线一区| www高清在线视频日韩欧美| 精品婷婷伊人一区三区三| 一区二区视频国产| 成人禁用看黄a在线| 欧美二三四区| 久久综合久久综合九色| 一级网站免费观看| 国产欧美综合视频| 亚洲男女av一区二区| 中文字幕在线播放一区| 日韩欧美一级视频| 色综合天天综合网天天狠天天| 三级精品视频| 日本精品在线| 日韩视频免费直播| 国产嫩草影院久久久久| 欧美日韩夫妻久久| 日韩欧美中文字幕一区| 欧美日韩成人一区| 欧美日韩国产综合久久| 国产日韩精品在线观看| 国产日韩精品电影| 国产午夜精品全部视频播放| 亚洲一区视频在线观看视频| 久久精品久久久久| 国产99对白在线播放| 91精品国产自产在线| 狠狠色综合色区| 国产日韩精品在线| 亚洲热在线观看| 人成在线免费视频| 中文字幕亚洲区| 欧美日韩中文字幕| 国产对白在线| 欧美日韩中文字幕| 欧美在线视频第一页| 亚洲热在线观看| www.老鸭窝.com| 在线视频观看日韩| 一区二区高清视频| 午夜一区二区视频| 亚洲制服丝袜一区| 日韩欧美中文字幕在线观看| 欧美成人vr18sexvr| 久久久久蜜桃| 91久久精品午夜一区二区| 欧美日韩中文字幕综合视频| 中文字幕在线视频网| 国产亚洲一区字幕| 欧美国产日韩在线播放| 99综合视频| 中文字幕亚洲区| 快she精品国产999| 日韩欧美综合| 日韩不卡一二区| 欧美在线视频第一页| 午夜伦欧美伦电影理论片| 欧美日韩在线网站| 欧美日韩在线国产| 国产欧美日韩第一页| 在线日韩欧美| 天天摸日日摸狠狠添| 日韩精品视频在线观看网址| 91精品久久久久久久91蜜桃| 中文字幕综合在线| 日韩精品大片| 久久电影国产免费久久电影| 精品久久九九| 国产裸体歌舞团一区二区| 中文字幕在线播出| 日韩视频专区| 国产视频aaa| 日韩在线观看精品| 日韩视频在线一区| 欧洲精品二区| 国产午夜精品一区二区三区视频| 国产视频aaa| 在线一区免费| 日韩精品在线观看视频| 最近高清中文在线字幕在线观看1| 国产日韩精品电影| 中文字幕一区不卡| 亚洲一区中文在线| 欧美日韩在线三级| 国产在线小视频| 中文字幕欧美日韩精品| 亚洲欧洲一区二区天堂久久| 日本а中文在线天堂| 午夜精品一区二区三区视频免费看| 色综合天天综合网国产成人综合天| 欧美日韩一二| 亚洲一区中文在线| 国产91大片| 亚洲热线99精品视频| 国产黄在线观看免费观看不卡| 久久韩国免费视频| 欧美日韩国产一级片| 国产在线拍揄自揄拍| 亚洲开心激情| 欧美日韩成人综合| 欧美日韩中文字幕| 日韩在线高清视频| 97最新国自产拍视频在线完整在线看| 91精品免费观看| 中文精品在线观看| 中文字幕 亚洲一区| 国产亚洲一区字幕| 欧美日韩三级视频| 国产福利精品导航| 亚洲免费看av| 国产福利免费观看| 正在播放日韩精品| 亚洲区中文字幕| www.xxxx精品| 欧洲精品二区| 欧美三级日韩三级国产三级| 中文字幕在线观看欧美| 欧美三级日本三级少妇99| 最近中文av字幕在线中文| 97最新国自产拍视频在线完整在线看| 国产91久久久久| 在线国产91| 国产在线导航| 成人精品国产福利| 精品久久久网| 国产欧美日韩在线视频| 国产一级片在线| 91蜜桃在线视频| 九色蝌蚪视频在线| 国产午夜精品久久| 日韩三级精品电影久久久| 日韩在线高清| 欧美乱大交xxxxx免费| 日韩精品一二三四区| 日韩.欧美.亚洲| 在线视频色在线| 在线亚洲免费| 欧美 日韩 综合| 亚洲乱码中文字幕综合| 亚洲一级二级| 在线视频亚洲| 亚洲天堂国产视频| 国产高清一级片| 精品国产网站在线观看| 国产一级在线播放| 日韩在线不卡| 欧美日韩在线国产| 精品国产31久久久久久| 日韩三级免费观看| 亚洲理论中文字幕| 国产黄色在线| 亚洲综合欧美在线| 日韩中文欧美| 日韩在线欧美| 欧美日韩中文国产| 午夜成人鲁丝片午夜精品| 精品国产免费观看一区| 日韩国产亚洲欧美| 日本一级一片免费视频| 国产综合精品在线| 天堂精品高清1区2区3区| 国产123在线| 亚洲一级影院| 欧美日韩国产一二三| 99久久www免费| 精品视频123区在线观看| 亚洲一区视频在线观看视频| 国产偷国产偷亚洲清高网站| 免费网站看黄yyy222| 中文字幕在线观看播放| 亚洲福利精品| 一区二区三区精品99久久| 99精品一级欧美片免费播放| 精品一区二区三区中文字幕| 91精品日本| 韩国av一区二区| 久久麻豆视频| 国产aa精品| 日韩在线视频观看正片免费网站| 久久久精品网| 欧美在线日韩| 日韩专区视频网站| 欧美日韩在线播放三区四区| 91久久精品午夜一区二区| 日本熟女一区二区| 欧洲精品二区| 亚洲成av人片在线| 日韩av在线中文字幕| 国产福利一区二区| 在线免费播放av| 精品国产乱码久久久久久蜜臀| 日韩一级视频在线观看| 久久精品一级爱片| 国产黄色片中文字幕| 中文字幕在线观看精品| 人成在线免费视频| 国产午夜精品一区二区三区视频| 欧美日韩在线中文字幕| 久久久精品国产免费观看同学| 二区三区中文字幕| 国产欧美三级| 99久久精品国产亚洲| 日韩免费视频一区二区| 欧美 日韩 中文字幕| 视频一区二区国产| 99色在线视频| 国产一级在线播放| 999精品网| 国产高清一级片| 色妇色综合久久夜夜| 久本草在线中文字幕亚洲欧美| 在线视频一区二区三区在线播放 | 在线视频1区2区| 国产成人精品999| 中文在线一区二区| 日韩视频专区| 国产黄色高清在线| 日韩视频中文字幕| 中文字幕在线观看国产| 国产福利免费观看| 精品一二三区| 欧美啪啪一区| 精品日韩视频在线观看| 日韩中文字幕在线播放| 一区二区三区在线不卡| 久久久精品欧美| av三级在线播放| 日韩欧美国产免费| 日韩免费高清一区二区| 欧美日韩国产成人| 日韩不卡高清视频| 91久久久精品| 国产啊啊啊视频在线观看| 一区二区视频在线观看免费的| 日韩中文在线字幕| 亚洲高清视频在线| 国产欧美日韩最新| 精品久久久91| 中文字幕在线看视频国产欧美| 日韩精品三级| 日韩精品久久久| 国产乱国产乱老熟300部视频| 久99久视频| 欧美色视频一区二区三区在线观看| 欧美三级在线视频| 亚洲黄色在线观看| 一区二区不卡在线播放| 91精品国产91久久久久久不卡| 日韩中文字幕| 91精品久久久久| 欧美成人一区二区| 亚洲中午字幕| 蜜桃精品视频| 国产黄在线看| 中文字幕五月天| 日韩亚洲欧美中文三级| 亚洲黄页一区| 久久精品在线观看| 欧美日韩精品欧美日韩精品一| 激情综合色综合久久| 亚洲午夜av| 精品视频—区二区三区免费| 天堂在线中文资源| 日韩欧美在线1卡| 91精品蜜臀在线一区尤物| 国产欧美日韩久久| 欧美日韩高清一区二区不卡| 国产黄在线播放| 日韩不卡一二三区| 久久99久久久久| 日韩欧美中文字幕视频| 91久久精品视频| 午夜亚洲一区| 91久久在线| 在线观看免费国产小视频| 日韩欧美综合在线| 深夜福利一区| 精品久久电影| 日韩精品手机在线观看| 欧美黄页在线免费观看| 欧美三级中文字幕| 国产99在线|亚洲| 国产视频三级在线观看播放| 一级特黄大欧美久久久| 国产日韩精品在线| 日韩国产欧美三级| 一区二区三区在线播放欧美| 中文字幕国产亚洲| 伊人网站在线| 国产福利在线导航| 亚洲va中文字幕| 久久精品免费在线观看| 日韩欧美在线看| 国产一卡2卡3卡免费网站| 日韩精品乱码av一区二区| 日韩精品欧美| 欧美日韩在线第一页| 欧美日韩亚洲系列| 国产福利精品导航| 99精品在线播放| 在线资源av| 久久精品欧美日韩精品| 国内激情久久| 欧美激情一区二区三区在线| 中文字幕在线中文字幕二区| 国产一级片在线| 在线一区二区三区精品| 一区二区三区中文字幕在线观看| 中文字幕精品一区二区三区在线 | 精品一区二区在线观看视频| 国产视频1区2区| 免费视频久久| 日韩中文首页| 亚洲欧洲精品在线| 欧美不卡视频一区发布| 久久99久久久欧美国产| 国产视频aaa| 在线亚洲免费| 久久99久久久欧美国产| 1区2区3区在线视频| 亚洲免费在线视频一区 二区| 91亚洲国产| 人人做人人澡人人爽欧美| 国产婷婷色一区二区三区| 久久99久久99精品中文字幕| 日韩国产一区三区| 欧美黄页在线免费观看| 久久99精品久久久| 亚洲高清免费一级二级三级| 91精品久久久久久蜜臀| 日韩三级在线播放| 国产一级在线免费观看| 在线中文字幕网站| 欧美日韩午夜在线| 亚洲黄页一区| 国产一区不卡在线| 中文字幕久久av| 日韩欧美中文在线| 国产乱国产乱老熟300部视频| 最近中文字幕日韩精品| 日韩视频在线免费播放| 精品日韩欧美在线| www.尤物.com| 欧美三级日韩三级| 天天综合天天| 高清1区2区| 国产一级在线| 国产日韩在线视频| 国内不卡的二区三区中文字幕| 日韩视频专区| 二区三区不卡不卡视频| 国产亚洲欧美色| 国产欧美中文字幕| 免费视频一区三区| 天天摸日日摸狠狠添| 不卡一区二区三区视频| 中文字幕综合在线| 日韩亚洲一区在线|