亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > HTML > 正文

canvas實現(xiàn)扭蛋機動畫效果的示例代碼

2024-08-26 00:21:05
字體:
來源:轉載
供稿:網(wǎng)友

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

背景

本來興高采烈地從網(wǎng)上找了一個扭蛋機動畫,但是發(fā)現(xiàn)它是直接用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];//圖片對象數(shù)組var ballNum = 4;//扭蛋機里面的小球數(shù)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為小球的顏色,用數(shù)字1~4表示,img是圖片對象,用來繪制扭蛋。

扭蛋方法

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

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

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

初始化

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

function init() {//初始化    for (let i = 0; i < ballNum; i++) {//隨機生成各色小球        let index = Math.floor(4 * Math.random());        awardList[i] = new Ball(index, ballList[index]);//新建小球?qū)ο?   }    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);}

這樣子扭蛋機里面就已經(jīng)有了小球。

開始扭蛋

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

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比較簡單,但是還是有一些注意點和一些可優(yōu)化的地方。

注意點

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對象,也可以用來繪制扭蛋。

清除計時器

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

畫布

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

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


注:相關教程知識閱讀請移步到HTML教程頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
欧美一区二区三区婷婷月色| 成年人在线视频| 美女视频一区二区三区| 成人福利视频在线看| 欧美综合视频在线观看| 亚洲精品在线视频免费| 成人福利免费在线观看| 久久97超碰国产精品超碰| 日批视频在线播放| 久久av最新网址| xvideos国产精品| 嫩草影院永久入口| 大地资源二中文在线影视观看| 女同毛片一区二区三区| 成人午夜sm精品久久久久久久| 久久电影视频| 草草视频在线| 亚洲AV无码精品国产| 亚洲欧美天堂| 国产www视频在线观看| 成人网在线免费观看| 国产在线精品91| 麻豆视频在线免费观看| 亚洲欧洲一区二区天堂久久| 一卡二卡三卡亚洲| 欧美乱妇一区二区三区不卡视频| 波多野结衣免费观看| 国产精品jk白丝蜜臀av小说| 亚洲四区在线观看| 日韩综合一区二区三区| 欧美日韩亚洲第一页| 久久99久久久精品欧美| 亚洲av色香蕉一区二区三区| 色悠久久久久综合欧美99| 中文字幕av在线一区二区三区| 亚洲人被黑人高潮完整版| 日本少妇高潮喷水xxxxxxx| 哺乳挤奶一区二区三区免费看| 欧美激情在线看| 视频一区二区免费| 秋霞午夜在线观看| 亚洲人在线视频| 嫩草影院中文字幕| 亚洲精品第一国产综合精品| 国v精品久久久网| 精品国产一二区| 中文字幕一区二区日韩精品绯色| av免费在线免费观看| 精品欧美一区二区三区在线观看| av小说在线播放| 爱草tv视频在线观看992| 国产91网红主播在线观看| 久久欧美一区二区| 97国产精品久久| 少妇精品高潮欲妇又嫩中文字幕| 久久综合999| 欧美亚洲视频在线看网址| 欧美成人精品午夜一区二区| 欧美va亚洲va国产综合| 欧美乱做爰xxxⅹ久久久| 91成人国产在线观看| 国产一级中文字幕| 中文字幕在线久热精品| 三级4级全黄60分钟| 东京热加勒比无码少妇| 久热99视频在线观看| 亚洲成a人v欧美综合天堂| 久久精品电影网站| 亚洲中文字幕一区| 国产在线拍揄自揄拍| 国产成人精品亚洲午夜麻豆| 亚洲字幕av一区二区三区四区| 日本高清不卡中文字幕| 国产综合色在线视频区| 美国十次综合久久| 成人在线电影在线观看视频| 亚洲白虎美女被爆操| 国产一区二区精品久| 成人在线观看一区二区| 国产精品狼人久久影院观看方式| 一本久道久久久| 国内精久久久久久久久久人| 一级全黄少妇性色生活片| 国模私拍国内精品国内av| 天天色综合成人网| 免费在线一级片| 蜜桃久久精品成人无码av| 国产日韩欧美在线| 色猫咪免费人成网站在线观看| 国产18无套直看片| 国产在线一区观看| 国产黄色在线播放| 久久人91精品久久久久久不卡| 亚洲色图100p| 蜜桃av久久久亚洲精品| 国产精品毛片va一区二区三区| 国产一区二区自拍视频| 久久精品免费| 国产清纯在线一区二区www| 亚洲精品成人区在线观看| 日韩免费在线观看视频| 免费av中文字幕| 欧美一级鲁丝片| 精品av中文字幕在线毛片| 亚洲综合大片69999| 欧美写真视频网站| 欧美精品福利在线| www.色就是色.com| 欧美黄色片在线观看| 无码精品人妻一区二区三区影院| 日韩精品在线播放视频| 麻豆一区区三区四区产品精品蜜桃| 国产精品一区二区三区高清在线| 黄色免费的网站| 日韩高清免费观看| 韩国中文字幕hd久久精品| 小早川怜子一区二区三区| 久久机热这里只有精品| 四虎永久国产精品| 精品少妇一区二区三区密爱| 欧美激情综合| 国产精品久久久久久在线观看| 国产青青视频| 秋霞午夜一区二区| 日韩av片在线看| 日韩国产一区| 成人午夜精品| 精品一区二区成人精品| 岛国视频午夜一区免费在线观看| 欧美国产视频日韩| 天天躁日日躁狠狠躁欧美| 欧美扣逼视频| 91久久精品国产| 天堂中文在线网| 国产精品美女久久久久久久网站| 欧美日韩国产黄| 久久超级碰视频| 97超视频在线观看| 电影一区电影二区| 亚洲欧洲av在线| **欧美大码日韩| 色噜噜狠狠狠综合曰曰曰| 国产精品久久久久91| 欧美黄色一区二区| 亚洲精品美女在线观看播放| 三级网站在线免费观看| 在线观看黄色片| 诱人的瑜伽老师3hd中字| 国内国产区免费视频| 亚洲国产精品自拍| 99国产视频| 国模无码视频一区| 国产精品第十页| 亚洲一区二区色| 97久久中文字幕| 欧美成人精品欧美一级私黄| 亚洲在线视频免费| 亚洲精品在线看| 福利视频理论电影| 精品影片一区二区入口| 亚洲综合小说| 91综合久久爱com| 久久婷婷麻豆| 久久久精品动漫| 欧美日韩伦理片| 欧美日本啪啪无遮挡网站| 欧美一级免费| 欧美日韩国产一区| 999这里有精品| 青青草国产在线播放| 日韩在线视频线视频免费网站| 亚洲自偷自拍熟女另类| 在线视频欧美区| 国产女优在线播放| 喜爱夜蒲2在线| 高清欧美电影在线| 欧美黄色免费网址| 正在播放国产一区| 亚洲色图网友自拍| 亚洲欧美综合乱码精品成人网| 玖玖精品在线视频| 亚洲精品18p| 亚洲精品在线影院| 国产av人人夜夜澡人人爽| 免费欧美一区| 午夜精品视频在线观看一区二区| 亚洲国产精品人人做人人爽| 精品国自产拍在线观看| 亚洲va欧美va人人爽| 999久久久久久| 欧美亚洲在线| 疯狂做受xxxx高潮欧美日本| 成人涩涩小片视频日本| 国产激情在线视频| 日韩一级黄色片| 西西午夜视频| 国产成人久久精品77777| 午夜精品久久久久久久久久久| 97精品国产| 一二三区在线观看| 国产精品吊钟奶在线| 欧美精品久久久久性色| 久久精品二区三区| 天天堂资源网在线观看免费视频| 亚洲视频久久久| 国产91在线看| 亚洲天堂av免费在线观看| 成人高潮视频| 午夜av免费在线观看| 欧美一级日韩一级| 国产精品主播| 精品黄色一级片| www.99av.com| 欧美性一区二区| 九九在线精品视频| 97精品久久| 探花视频在线观看| 人妻与黑人一区二区三区| 日本在线观看中文字幕| 欧美福利在线视频| 中文字幕欧美人妻精品| 性感美女一区二区三区| 五月婷婷激情久久| 亚洲在线第一页| 精品国产一区二区三区久久久狼牙| 97久久人人超碰caoprom欧美| 国产精品日本欧美一区二区三区| 天堂网2014av| 蜜桃精品视频| 蜜桃视频无码区在线观看| 日韩一区二区三区av| 黄污视频在线观看| 制服丝袜中文字幕在线观看| 欧洲精品在线播放| 亚洲男人的天堂网| 91亚洲精品乱码久久久久久蜜桃| 四虎成人免费影院| 女人色在线免费视频| 午夜精品aaa| 成年免费网站| 欧美精三区欧美精三区| 网友自拍视频在线| jizz亚洲女人高潮大叫| 欧美成人精品高清在线播放| 日韩欧美国产综合在线| 一区二区欧美在线| 97香蕉久久夜色精品国产| 久久白虎精品| 爱爱爱爱免费视频| 999av小视频在线| 亚洲黄色影片| 欧美视频日韩视频在线观看| 国产免费人人看| 国产区视频在线观看| 俄罗斯黄色录像| 不卡av一区二区| 日韩一级片免费视频| 亚洲精品www| 亚洲黄页在线观看| 51xx午夜影福利| 区二区三区在线| 亚洲精品久久一区二区三区777| 一本色道88久久加勒比精品| 成人一区二区三| 亚洲综合爱爱久久网| 日本一二区免费| 手机av免费观看| 性xxxx奶大欧美高清| 偷窥少妇高潮呻吟av久久免费| 国产精品免费大片| 欧美最猛黑人xxxx黑人猛交黄| 精品一区二区三区免费观看| 免费黄色特级片| 色婷婷久久久综合中文字幕| 欧美色欧美亚洲高清在线视频| 一级做a爰片性色毛片视频| 国产女主播福利| 三年片观看免费观看大全视频下载| 欧美在线观看日本一区| 一夜七次郎国产精品亚洲| 日韩国产一区二区| 美女做暖暖视频免费在线观看全部网址91| 国产精品186在线观看在线播放| 亚洲一区二区三区免费在线观看| 激情亚洲成人| 四虎永久国产精品| 日韩中文视频免费在线观看| 欧美激情视频网址| 中文字幕在线观看免费视频| 少妇丰满尤物大尺度写真| 亚洲成人精品视频| 久久婷婷五月综合色国产香蕉| 国产欧美视频在线观看| 精品在线一区二区三区| 久久国产精品亚洲人一区二区三区| 91麻豆成人久久精品二区三区| 免费人成短视频在线观看网站| 国产在线视频三区| 欧美疯狂做受xxxx高潮| heisi视频网在线观看| 日韩影院一区| 日韩一级二级三级精品视频| 国产精品.com| 日本中文字幕第一页| 蜜桃视频在线观看成人| 蜜桃视频在线观看免费视频网站www| 日韩经典在线观看| 天天伊人狠狠| 日本黄色免费视频| 亚洲另类图片色| 欧美日韩成人| 久久人人88| 亚洲av人无码激艳猛片服务器| 国产精品jizz| 国产精品视频500部| 春意影院免费入口| 成人短视频软件网站大全app| 久久久精品国产一区二区三区| 色综合成人av| 日韩欧美在线观看一区二区三区| 97精品国产一区二区三区| 99热国内精品永久免费观看| 国产综合视频| 能看av的网址| 国产欧美三级| 国产婷婷97碰碰久久人人蜜臀| 日韩成人av在线播放| 欧美视频一区在线|