放煙花效果

煙花效果圖如下:


煙花效果

代碼如下:
工具函數(shù)

// 獲取隨機顏色的函數(shù)
function getColor(){
    var color = '#';
    for(var i=0;i<3;i++){
        var hex = getRandom(256).toString(16)
        hex = hex.length===1?'0'+hex:hex;
        color += hex
    }
    return color
}
// 獲取隨機數(shù)的函數(shù)
function getRandom(a, b = 0){
    var max = a;
    var min = b;
    if(a<b){
        max = b;
        min = a;
    }
    return Math.floor(Math.random() * (max - min)) + min
}
// 設置樣式的函數(shù)
function setStyle(ele, styleObj){
    for(var attr in styleObj){
        ele.style[attr] = styleObj[attr]
    }
}

實現(xiàn)效果的代碼:

// 創(chuàng)建夜空大盒子
var nightSky = document.createElement('div')
// 設置樣式
setStyle(nightSky, {
    width:"1000px",
    height:"500px",
    border:"10px solid #00f",
    backgroundColor:"#000",
    position:"relative"
})
// 將創(chuàng)建好的夜空放在body中
document.body.appendChild(nightSky)
// 點擊夜空
nightSky.onclick = function(){
    // 獲取光標在大盒子上的位置
    var e = window.event;
    var x = e.offsetX;
    var y = e.offsetY;
    // 創(chuàng)建一個小煙花div
    var fire = document.createElement('div')
    // 設置樣式
    setStyle(fire, {
        width:"10px",
        height:"10px",
        backgroundColor:getColor(),
        position:"absolute",
        left:x + 'px',
        bottom:0
    })
    // 將這個小煙花放在夜空中
    nightSky.appendChild(fire)
    // 讓這個小煙花升到空中
    toUp(fire,x,y)
}
// 讓小煙花升到空中
function toUp(fire,x,y){
    // 獲取小煙花的top值
    var t = fire.offsetTop;
    // 設置定時器讓top值逐漸減小
    var timerId = setInterval(function(){
        t -= 5
        // 當top值到了鼠標點擊的位置 - 就停止定時器
        if(t<=y){
            t = y
            clearInterval(timerId)
            // 將當前這個小煙花刪除掉
            nightSky.removeChild(fire)
            // 創(chuàng)建很多小煙花
            createManyFire(x,y)
        }
        // 將減小后的top設置給小煙花
        fire.style.top = t + 'px'
    },5)
}
// 創(chuàng)建很多小煙花
function createManyFire(x,y){
    // 獲取一個30~50的隨機數(shù)
    var num = getRandom(30,50)
    // 循環(huán)創(chuàng)建30~50個小煙花
    for(let i=0;i<num;i++){
        // 創(chuàng)建div
        let div = document.createElement('div')
        // 設置樣式
        setStyle(div, {
            width:"10px",
            height:"10px",
            backgroundColor:getColor(),
            position:"absolute",
            left:x + 'px',
            top: y + 'px',
            borderRadius:"50%"
        })
        // 將小煙花放到夜空中
        nightSky.appendChild(div)
        // 讓煙花炸開 - 將每個小div移動到隨機位置
        boom(div, x, y)
    }
}
// 小煙花炸開
function boom(ele, x, y){
    // 獲取一個隨機位置
    let targetPosition = {
        left:getRandom(nightSky.clientWidth-10),
        top:getRandom(nightSky.clientHeight-10)
    }
    // ele當前的位置
    let currentPosition = {
        left:x,
        top:y
    }
    // 讓left和top同時移動,就通過循環(huán)設置兩個定時器
    for(let attr in targetPosition){
        // 獲取每個定時器中使用的目標位置
        let target = targetPosition[attr]
        // 獲取每個定時器中使用的當前位置
        let currentStyle = currentPosition[attr]
        // 定義停止定時器數(shù)量
        var k = 0
        let timerId = setInterval(function(){
            // 定義每次移動的距離
            let percent = (target - currentStyle)/20
            // 如果小于0就向下取整變成整數(shù)丽旅,如果大于0就向上取整變成整數(shù)
            // -0.1 -- 1     0.2 -- 1   目的是讓div向前移動
            percent = percent>0?Math.ceil(percent):Math.floor(percent);
            // 讓當前的值跟計算好的距離相加
            currentStyle += percent;
            // 設置樣式
            ele.style[attr] = currentStyle + 'px'
            // 如果移動的值跟目標位置相等了
            if(currentStyle === target){
                // 停止當前定時器
                clearInterval(timerId)
                // 定時器停止數(shù)量自增
                k++
                // 當停止了2次定時器時
                if(k === 2){
                    // 將當前元素刪除
                    nightSky.removeChild(ele)
                }
            }
        },20)
    }
}
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末杂数,一起剝皮案震驚了整個濱河市凤覆,隨后出現(xiàn)的幾起案子媒区,更是在濱河造成了極大的恐慌虎敦,老刑警劉巖股淡,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異明郭,居然都是意外死亡,警方通過查閱死者的電腦和手機丰泊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進店門薯定,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人瞳购,你說我怎么就攤上這事话侄。” “怎么了学赛?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵年堆,是天一觀的道長。 經常有香客問我盏浇,道長变丧,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任绢掰,我火速辦了婚禮痒蓬,結果婚禮上童擎,老公的妹妹穿的比我還像新娘。我一直安慰自己攻晒,他們只是感情好顾复,可當我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著鲁捏,像睡著了一般芯砸。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上给梅,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天假丧,我揣著相機與錄音,去河邊找鬼破喻。 笑死虎谢,一個胖子當著我的面吹牛,可吹牛的內容都是我干的曹质。 我是一名探鬼主播婴噩,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼羽德!你這毒婦竟也來了几莽?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤宅静,失蹤者是張志新(化名)和其女友劉穎章蚣,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體姨夹,經...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡纤垂,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了磷账。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片峭沦。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖逃糟,靈堂內的尸體忽然破棺而出吼鱼,到底是詐尸還是另有隱情,我是刑警寧澤绰咽,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布菇肃,位于F島的核電站,受9級特大地震影響取募,放射性物質發(fā)生泄漏琐谤。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一矛辕、第九天 我趴在偏房一處隱蔽的房頂上張望笑跛。 院中可真熱鬧付魔,春花似錦、人聲如沸飞蹂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽陈哑。三九已至妻坝,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間惊窖,已是汗流浹背刽宪。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留界酒,地道東北人圣拄。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像毁欣,于是被迫代替她去往敵國和親庇谆。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,792評論 2 345

推薦閱讀更多精彩內容