烟花爆炸

<!DOCTYPE html>

<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
        <style>
            body {
                width: 100%;
                height: 100%;
                background: black;
                overflow: hidden;
            }
            .fire {
                width: 3px;
                height: 30px;
                background: white;
                position: absolute;
            }
            .spark {
                width: 3px;
                height: 3px;
                position: absolute;
            }
            
            
        </style>
        
        <script src="move.js"></script>
        <script>
            onload = function(){
                
                //页面上任意位置点击
                document.onclick = function(e){
                    var evt = e || event;
                    var x = evt.pageX;
                    var y = evt.pageY;
                    
                    fire(x, y);
                }
                
                //发射烟花
                function fire(x, y){
                    
                    //创建烟花div
                    var fireNode = document.createElement("div");
                    fireNode.className = "fire";
                    fireNode.style.left = x + "px"; //位置
                    fireNode.style.top = document.documentElement.clientHeight - 30 + "px";
                    document.body.appendChild(fireNode);
                    
                    //发射
                    animate(fireNode, {top:y, height:3}, function(){
                        document.body.removeChild(fireNode); //移除节点
                        
                        //爆炸(创建多个小div节点)
                        var count = parseInt(Math.random()*30) + 30; //30~59
                        for (var i=0; i<count; i++){
                            fireBoom(x, y);
                        }
                        
                    });
                }
                
                //爆炸,创建一个小div节点
                function fireBoom(x, y){
                    
                    //创建小div节点
                    var sparkNode = document.createElement("div");
                    sparkNode.className = "spark";
                    sparkNode.style.left = x + "px"; //位置
                    sparkNode.style.top = y + "px";
                    sparkNode.style.backgroundColor = randomColor(); //随机颜色
                    document.body.appendChild(sparkNode);
                    
                    //爆炸,抛物线运动
                    var xSpeed = parseInt(Math.random()*20) * (Math.random()>0.5 ? 1 : -1);    
                    var ySpeed = parseInt(Math.random()*20) * (Math.random()>0.6 ? 1 : -1);
                    //console.log(xSpeed + "," + ySpeed);
                    
                    //定时器
                    var timer = setInterval(function(){
                        ySpeed++;
                        sparkNode.style.left = sparkNode.offsetLeft + xSpeed + "px";
                        sparkNode.style.top = sparkNode.offsetTop + ySpeed + "px";
                        
                        //当超出页面,让节点消失
                        if (sparkNode.offsetLeft < 0
                            || sparkNode.offsetLeft > document.documentElement.clientWidth
                            || sparkNode.offsetTop > document.documentElement.clientHeight) {
                                
                                document.body.removeChild(sparkNode); //清除节点
                                clearInterval(timer); //清除定时器
                            }
                        
                    }, 30);
                    
                    
                }
                
                
                //随机颜色
                function randomColor(){
                    //"#FFFFFF"
                    var arr = [0,1,2,3,4,5,6,7,8,9,'A','B','C','D','E','F'];
                    var str = "#";
                    for (var i=0; i<6; i++){
                        str += arr[ parseInt(Math.random()*16) ];
                    }
                    return str;
                }
                
                
                
            }
        </script>
    </head>
    <body>
    </body>

</html>






move.js:




//获取对应元素的样式属性值
function getStyleAttr(obj, attr){
    if (window.getComputedStyle){
        return getComputedStyle(obj, null)[attr];
    }
    else {
        return obj.currentStyle[attr];  
    }
}



//运动函数
//let,top,width,height,opactiy, paddingLeft...

//animate(obj, {left:300, top:300, width:300}, fn)

function animate(obj, json, fn){
    
    clearInterval(obj.timer); //清除旧定时器
    
    //开启新定时器
    obj.timer = setInterval(function(){
        
        var bStop = true; //是否可以停止定时器
        
        for (var attr in json){
            var iTarget = json[attr];
            //iTarget: 目标值
            //attr: 属性名称
        
            //1, current
            var current;
            if (attr == "opacity"){ //透明度
                current = parseFloat(getStyleAttr(obj, attr))*100;
                current = Math.round(current);
            }
            else { //left,top,width,height
                current = parseFloat(getStyleAttr(obj, attr));
                current = Math.round(current);
            }
            
            //2, speed  
            var speed = (iTarget-current)/8;    (400-393)/8
            speed = speed>0 ? Math.ceil(speed) : Math.floor(speed);
            
            //3, 临界值
            if (current != iTarget){
                bStop = false; //当有一个属性的值未到达目标值, 则不能停止定时器
            }
            
            //4, 运动
            if (attr == "opacity"){ //透明度
                obj.style[attr] = (current+speed)/100;
                obj.style.filter = "alpha(opacity=" + (current+speed) + ")";
            }
            else { //left,top,width,height..
                obj.style[attr] = current+speed + "px";
            }
        }
        
        //如果bStop为true
        if (bStop){
            console.log("停止运动");
            clearInterval(obj.timer); //停止运动, 清除定时器
            
            if (fn) {
                fn(); //在运动结束后,回调
            }
        }
        
    }, 30);
    
}





//animate(oBox, "left", 100, function(){} );
/*
function animate(obj, attr, iTarget, fn){
    
    clearInterval(obj.timer); //清除旧定时器
    
    //开启新定时器
    obj.timer = setInterval(function(){
        
        //1, current
        var current;
        if (attr == "opacity"){ //透明度
            current = parseFloat(getStyleAttr(obj, attr))*100;
            current = Math.round(current);
        }
        else { //left,top,width,height
            current = parseFloat(getStyleAttr(obj, attr));
            current = Math.round(current);
        }
        
        //2, speed  
        var speed = (iTarget-current)/8;    (400-393)/8
        speed = speed>0 ? Math.ceil(speed) : Math.floor(speed);
        
        //3, 临界值
        if (current == iTarget){
            console.log("停止运动");
            clearInterval(obj.timer); //停止运动, 清除定时器
            
            if (fn) {
                fn(); //在运动结束后,回调
            }
            
            return;
        }
        
        //4, 运动
        if (attr == "opacity"){ //透明度
            obj.style[attr] = (current+speed)/100;
            obj.style.filter = "alpha(opacity=" + (current+speed) + ")";
        }
        else { //left,top,width,height..
            obj.style[attr] = current+speed + "px";
        }
        
        
    }, 30);
    
}


*/

                










  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值