JS技巧動(dòng)手實(shí)現(xiàn)紅包兔子雨效果示例詳解
前言
人生天地之間,若白駒過(guò)隙,忽然而已。不知不覺(jué)中,2022年已然逝去,2023年也過(guò)去了半個(gè)月了。看到「兔了個(gè)兔」這個(gè)活動(dòng)幾天了,不過(guò)這周比較忙,沒(méi)時(shí)間參與。
心血來(lái)潮,搗鼓了一晚上,實(shí)現(xiàn)一個(gè)兔年的紅包雨(兔子雨)效果~ ??
展示效果
技術(shù)棧
- Vue2
- SCSS:實(shí)現(xiàn)紅包雨(兔子雨)效果、按鈕交互效果等。
思考與實(shí)現(xiàn)
首先,思考一下最終的展示效果:在屏幕上會(huì)有很多隨機(jī)下落的兔子(紅包),點(diǎn)擊兔子彈出一個(gè)詳情彈窗,會(huì)獲得一定的現(xiàn)金或?qū)嵨铼?jiǎng)勵(lì)。當(dāng)然,獲得的紅包可能是一定金額,也可能是“謝謝參與”或者其他。類似的有支付寶的集五?;顒?dòng)、螞蟻森林等場(chǎng)景。
接著,考慮如何實(shí)現(xiàn)這個(gè)場(chǎng)景。
紅包下落效果
我們先設(shè)計(jì)一個(gè)簡(jiǎn)單的紅包效果:

這里對(duì)于紅包,使用的是絕對(duì)定位,并使用background屬性設(shè)置漸變色。
<div class="bag"></div>
.bag{
width: 30px;
height: 50px;
background: linear-gradient(to bottom, #ff6a00, #ee0979);
position: absolute;
top: 0;
left: 0;
user-select: none;
cursor: pointer;
}
為了實(shí)現(xiàn)下落效果,我們可以使用定時(shí)器不斷增加top屬性的值,直到超出屏幕為止。然而,當(dāng)紅包數(shù)量越來(lái)越多時(shí),我們需要操作的DOM元素太多了,而且每個(gè)紅包都加上一個(gè)定時(shí)器,并不優(yōu)雅??!
思考了很久,后來(lái)想到可以借助CSS動(dòng)畫去實(shí)現(xiàn)!也就是,初始位置的top值是0,動(dòng)畫結(jié)束時(shí)是100vh,也就是紅包移出屏幕的時(shí)候。借助CSS3 animation-fill-mode 屬性,這里取值是:animation-fill-mode:forwards;。最終紅包剛好停留在屏幕下方那里(視野不可見)。
.bag{
animation: downBags 3s forwards linear;
}
// 紅包的下落動(dòng)畫
@keyframes downBags {
0% {
top: 0;
}
100% {
top: 100vh;
}
}
生成紅包雨
這里借助Vue2來(lái)渲染和操作DOM。紅包雨使用bags變量來(lái)維護(hù)。交互開始時(shí),觸發(fā) init 函數(shù),每間隔 500ms 生成一個(gè)紅包。當(dāng)超出規(guī)定的數(shù)量(bagsNum,這里設(shè)置為20)后,停止生成紅包。
Vue是操作DOM的利器!這里我們不需要手動(dòng)創(chuàng)建DOM元素:var el = document.createElement('div'); 然后再添加CSS樣式。我們通過(guò)操作bags數(shù)組,每生成一個(gè)紅包就添加一個(gè)元素,并設(shè)置該元素對(duì)應(yīng)的屬性,比如top, left, money等等即可。是不是簡(jiǎn)單了許多?
init() {
let count = 0
let countT = setInterval(() => {
if (count >= this.bagsNum) {
clearInterval(countT)
this.gameover = true
return
}
this.createBag(count)
count++
}, 500);
},
createBag(i) {
let ran = Math.random()
let money = Math.floor(ran * 1001)
let desc = ''
if (ran > this.prizeRatio) {
money = 0
desc = '謝謝參與!'
}
let deg = 0
if (this.isRabbitBG) {
deg = Math.floor(ran * 30)
if (ran > 0.5) {
deg *= -1
}
}
let param = {
index: i,
money,
desc,
from: '掘金',
top: 0,
left: `${Math.floor(Math.random() * this.maxW)}vw`,
deg,
show: true,
}
this.bags.push(param)
},
到這里,簡(jiǎn)單的紅包雨效果實(shí)現(xiàn)了。

打開紅包效果
樣式和交互比較簡(jiǎn)單,點(diǎn)擊按鈕后,我們給按鈕添加rotate樣式,借助CSS動(dòng)畫去實(shí)現(xiàn)交互效果。這里就不贅述了。
.rotate{
animation: rotateAni linear .3s infinite;
}
@keyframes rotateAni {
from{
transform:rotateY(180deg);
}
to{
transform:rotateY(360deg);
}
}

兔子雨效果
兔年到了,當(dāng)然要嘗試下“兔子雨”了... 這里我們把紅包換成兔子,為了使得“兔子雨”效果看上去更優(yōu)雅一些,我們給兔子圖片隨機(jī)設(shè)置了一定的旋轉(zhuǎn)角度(±30°之間)。
.bagRabbitBG{
width: 70px;
background: url(https://clemmensen.top/static/rabbit1.png) center / cover no-repeat;
}
createBag(i) {
let ran = Math.random()
// ...
let deg = 0
if (this.isRabbitBG) {
deg = Math.floor(ran * 30)
if (ran > 0.5) {
deg *= -1
}
}
// ...
}
實(shí)際效果如下:

拓展
設(shè)置中獎(jiǎng)概率
這里我們可以設(shè)置中獎(jiǎng)概率為75%。當(dāng)隨機(jī)數(shù)大于0.75時(shí),中獎(jiǎng)金額市值為0,文案設(shè)置為"謝謝參與!"。
createBag(i) {
let ran = Math.random()
let money = Math.floor(ran * 1001)
let desc = ''
if (ran > this.prizeRatio) {
money = 0
desc = '謝謝參與!'
}
// ...
}
后記
這幾天一直比較忙,趁著今天有空一些,參與了這個(gè)「兔了個(gè)兔」活動(dòng)。
總的來(lái)說(shuō),從 idea 的產(chǎn)生到動(dòng)手實(shí)現(xiàn)“兔子雨”的過(guò)程還是挺有意思的!在這里,預(yù)祝各位掘友兔年快樂(lè),前兔似錦!
以上就是JS技巧動(dòng)手實(shí)現(xiàn)紅包兔子雨效果示例詳解的詳細(xì)內(nèi)容,更多關(guān)于JS 實(shí)現(xiàn)紅包兔子雨效果的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- JavaScript Html實(shí)現(xiàn)移動(dòng)端紅包雨功能頁(yè)面
- javascript實(shí)現(xiàn)移動(dòng)端紅包雨頁(yè)面
- js+css實(shí)現(xiàn)紅包雨效果
- JavaScript+Canvas模擬實(shí)現(xiàn)支付寶畫年兔游戲
- 基于React.js實(shí)現(xiàn)兔兔牌九宮格翻牌抽獎(jiǎng)組件
- JavaScript?Canvas實(shí)現(xiàn)兼容IE的兔子發(fā)射爆破動(dòng)圖特效
- 利用JavaScript制作一個(gè)搞怪的兔子動(dòng)畫效果
- 利用JavaScript創(chuàng)建一個(gè)兔年春節(jié)倒數(shù)計(jì)時(shí)器
- 基于Three.js實(shí)現(xiàn)3D玉兔效果的示例代碼
相關(guān)文章
javascript支持firefox,ie7頁(yè)面布局拖拽效果代碼
javascript 拖拽 頁(yè)面拖拽 拖拽效果的頁(yè)面 超級(jí)拖拽 javascript支持firefox,ie7頁(yè)面布局拖拽效果代碼 鼠標(biāo)拖拽2007-12-12
window.dialogArguments 使用說(shuō)明
window.dialogArguments 使用說(shuō)明,需要的朋友可以參考下。2011-04-04
使用PBFunc在Powerbuilder中支付寶當(dāng)面付款功能
這篇文章主要介紹了使用PBFunc在Powerbuilder中支付寶當(dāng)面付款功能的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-10-10
前端截圖幾種常用實(shí)現(xiàn)方式總結(jié)
這篇文章主要介紹了前端截圖幾種常用實(shí)現(xiàn)方式,包括使用HTML5的canvas和html2canvas庫(kù)、瀏覽器API以及結(jié)合后端服務(wù),每種方法都有其優(yōu)缺點(diǎn),大家可以根據(jù)需求選擇方法,需要的朋友可以參考下2025-03-03
淺析JS動(dòng)態(tài)創(chuàng)建元素【兩種方法】
下面小編就為大家?guī)?lái)一篇淺析JS動(dòng)態(tài)創(chuàng)建元素【兩種方法】。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家。一起跟隨小編過(guò)來(lái)看看吧2016-04-04
CocosCreator實(shí)現(xiàn)技能冷卻效果
這篇文章主要介紹了CocosCreator實(shí)現(xiàn)技能冷卻效果,同學(xué)們可以跟著教程,親手試一下,代碼都是可以復(fù)用的2021-04-04

