原生JS實(shí)現(xiàn)螢火蟲(chóng)效果
本文實(shí)例為大家分享了JS實(shí)現(xiàn)螢火蟲(chóng)效果的具體代碼,供大家參考,具體內(nèi)容如下
上代碼之前,先看一下效果:

CSS部分(此處用元素模擬螢火蟲(chóng),背景可自行設(shè)置):
<style>
.box{width: 4px;height: 5px;background: wheat;position: absolute;border-radius: 50%;}
body{background: url(../img/bg.jpg) ;}
</style>
JS部分:
<script>
class Glowworm{
constructor(){
// 獲取屏幕的可視區(qū)域的寬高,用作將來(lái)的隨機(jī)范圍
this.clientW = document.documentElement.clientWidth;
this.clientH = document.documentElement.clientHeight;
// 假設(shè)螢火蟲(chóng)的寬高
this.w = 20;
this.h = 20;
}
createEle(){
var div = document.createElement("div");
div.className = "box";
document.body.appendChild(div);
// 在創(chuàng)建元素之前一定得先生成隨機(jī)坐標(biāo)
div.style.left = this.x + "px";
div.style.top = this.y + "px";
// 元素創(chuàng)建好之后,立即運(yùn)動(dòng)
this.move(div);
}
randomPos(){
// 隨機(jī)生成坐標(biāo)
this.x = random(0,this.clientW - this.w);
this.y = random(0,this.clientH - this.h);
}
move(ele){
// 開(kāi)始運(yùn)動(dòng)之前,還得隨機(jī)生成目標(biāo)
this.randomPos();
// 開(kāi)始運(yùn)動(dòng)
move(ele,{
left:this.x,
top:this.y
},()=>{
// 一個(gè)動(dòng)畫(huà)結(jié)束后,重復(fù)開(kāi)啟當(dāng)前動(dòng)畫(huà),即可
this.move(ele);
})
}
}
for(var i=0;i<60;i++){
// 先得到實(shí)例
var g = new Glowworm();
// 生成隨機(jī)坐標(biāo)
g.randomPos();
// 再創(chuàng)建元素
g.createEle();
}
function random(a,b){
return Math.round(Math.random()*(a-b)+b);
}
</script>
最后需要引入一個(gè)運(yùn)動(dòng)函數(shù):
原生JS封裝:帶有px的css屬性、透明度、且可以運(yùn)動(dòng)的函數(shù)。
function move(ele,obj,cb){
clearInterval(ele.t);
ele.t = setInterval(() => {
var i = true;
for(var attr in obj){
if(attr == "opacity"){
var iNow = getStyle(ele,attr) * 100;
}else{
var iNow = parseInt(getStyle(ele,attr));
}
let speed = (obj[attr] - iNow)/10;
speed = speed < 0 ? Math.floor(speed) : Math.ceil(speed);
// 只要有一個(gè)屬性沒(méi)到目標(biāo):絕對(duì)不能清除計(jì)時(shí)器
if(iNow !== obj[attr]){
i = false;
}
if(attr == "opacity"){
ele.style.opacity = (iNow + speed)/100;
}else{
ele.style[attr] = iNow + speed + "px";
}
}
if(i){
clearInterval(ele.t);
if(cb){
cb();
}
// cb && cb();
}
}, 30);
}
function getStyle(ele,attr){
if(ele.currentStyle){
return ele.currentStyle[attr];
}else{
return getComputedStyle(ele,false)[attr];
}
}
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
用javascript獲取textarea中的光標(biāo)位置
Javascript一向以他的靈活隨意而著稱,這也使得它的功能可以非常的強(qiáng)大,而由于沒(méi)有比較好的調(diào)試工具,又使得它使用起來(lái)困難重重,尤其使對(duì)于一些初學(xué)者,更是感覺(jué)到無(wú)從下手。今天探討的問(wèn)題是用javascript獲取textarea中光標(biāo)的位置。2008-05-05
js判斷一個(gè)對(duì)象是數(shù)組(函數(shù))的方法實(shí)例
這篇文章主要給大家介紹了關(guān)于利用js如何判斷一個(gè)對(duì)象是數(shù)組(函數(shù))的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用JS具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12
微信小程序中使用Async-await方法異步請(qǐng)求變?yōu)橥秸?qǐng)求方法
這篇文章主要介紹了微信小程序中使用Async-await方法異步請(qǐng)求變?yōu)橥秸?qǐng)求方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-03-03
打開(kāi)新窗口關(guān)閉當(dāng)前頁(yè)面不彈出關(guān)閉提示js代碼
打開(kāi)新窗口關(guān)閉當(dāng)前頁(yè)面時(shí)總是彈出提示框,有沒(méi)有辦法避免它的彈出呢,答案是可以的接下來(lái)為大家分享一個(gè)方法可以解決此問(wèn)題,感興趣的你可不要錯(cuò)過(guò)了哈,希望可以幫助到你2013-03-03
解決前后端交互數(shù)據(jù)出現(xiàn)精度丟失的多種方式
這篇文章主要為大家介紹了解決前后端交互數(shù)據(jù)出現(xiàn)精度丟失的多種方式,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-04-04
js事件機(jī)制----捕獲與冒泡機(jī)制實(shí)例分析
這篇文章主要介紹了js事件機(jī)制----捕獲與冒泡機(jī)制,結(jié)合實(shí)例形式分析了js事件機(jī)制中捕獲與冒泡機(jī)制相關(guān)原理、操作技巧與注意事項(xiàng),需要的朋友可以參考下2020-05-05
JS給swf傳參數(shù)的實(shí)現(xiàn)方法
下面小編就為大家?guī)?lái)一篇JS給swf傳參數(shù)的實(shí)現(xiàn)方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-09-09

