zoukankan      html  css  js  c++  java
  • 庆元旦,放烟花(纯javascript版烟花效果)

           2008年过去了,新的2009年到来了,2008太不平凡,发生了太多事,包括我自己,不管怎么样,困难过去就是一个新的阶段,继续+U。

           在这里写了一个JS的烟花特效,以此来庆祝新的一年,祝大家元旦快乐!

           实现原理:每个烟花颗粒是一个div对象,让每一个烟花颗粒对象以一个坐标点,按随机角度由内向外移动,每组烟花的颗粒数不同,发射的速度也不同,颜色也不同,都是随机产生的。当多个烟花颗粒同时移动的时候,就产生了类似烟花爆炸的效果,ok,现在看看效果和相关代码:


       

    firework.js代码 :

    var Utils={};

    Utils.$E
    =function(id){
        
    return document.getElementById(id);
    }
    ;

    Utils.$C
    =function(tagName){
        
    return document.createElement(tagName);
    }
    ;

    Utils.getIntervalRandom
    =function(min,max){
        
    return parseInt(Math.random()*(max-min)+min);
    }
    ;

    Utils.INTERVAL_SPEED
    =30;
    if(navigator.appName.toLowerCase().indexOf("netscape")!=-1)
    {
        Utils.INTERVAL_SPEED
    =Utils.INTERVAL_SPEED+(Utils.INTERVAL_SPEED/6);
    }


    String.prototype.padLeft
    =function(sLen,padChar){
        
    var result=this;
        
    for(i=this.length;i<sLen;i++){
            result
    =padChar+result;
        }

        
    return result;
    }
    ;


    var Firework=function(x,shotHeight,radius,particleCount,color,speed){
        
    this.shotHeight=shotHeight || 200;
        
    this.radius=radius || 100;
        
    this.particleCount=particleCount || 10;
        
    this.color=color || "#FF0000";
        
    this.parentElement=document.body;
        
    this.x=x;
        
    this.shottingSpeed=speed || 3;
        
    this.isShoted=false;
        
    this.isFlash=true;
        
        
    this._particles=[];
        
    this._particleShape=unescape("%u25CF");
        
    this._shottingShape="|";
        
    this._depth=3;
        
    this._shotting=Utils.$C("div");
        
    this._flashing=Utils.$C("div");
        
    this._disposeCount=0;
        
        
    var _this=this;
        
        
    void function initialize(){
            
    for(var i=0;i<_this.particleCount;i++){
                _this._particles[i]
    =Utils.$C("div");
                _this._particles[i].style.position
    ="absolute";
                _this._particles[i].style.left
    =_this.x+"px";
                _this._particles[i].style.top
    =_this.shotHeight+"px";
                _this._particles[i].style.zIndex
    =100;
                _this._particles[i].style.color
    =_this.color;
                _this._particles[i].style.display
    ="none";
                _this._particles[i].innerHTML
    =_this._particleShape;
                _this._particles[i].distance
    =Utils.getIntervalRandom(1,_this.radius-parseInt((i%_this._depth)*(_this.radius/_this._depth)));
                _this._particles[i].speed=Utils.getIntervalRandom(1,4)*_this._particles[i].distance*0.06;
                _this.parentElement.appendChild(_this._particles[i]);
                _this._setSize(_this._particles[i],
    5);
            }

            
            _this._shotting.speed
    =_this.shottingSpeed;
            _this._shotting.innerHTML
    =_this._shottingShape;
            _this._shotting.style.position
    ="absolute";
            _this._shotting.style.fontWeight
    ="900";
            _this._shotting.style.left
    =_this.x+"px";
            
    //_this._shotting.style.top=_this.parentElement.offsetTop+_this.parentElement.offsetHeight-_this._shotting.offsetHeight+"px";
            _this._shotting.style.top="700px";
            _this._shotting.style.zIndex
    =100;
            _this._shotting.style.color
    =_this.color;
            _this._setSize(_this._shotting,
    15);
            _this.parentElement.appendChild(_this._shotting);
            
            _this._flashing.style.width
    ="100%";
            _this._flashing.style.height
    ="100%";
            _this._flashing.style.left
    ="0";
            _this._flashing.style.top
    ="0";
            _this._flashing.style.backgroundColor
    ="#ffffee";
            _this._flashing.style.position
    ="absolute";
            _this._flashing.style.zIndex
    =200;
            _this._flashing.style.display
    ="none";
            _this._flashing.style.MozOpacity
    =0.5;
            _this._flashing.style.filter
    ="alpha(opacity=50)";
            _this.parentElement.appendChild(_this._flashing);
            
        }
    ();
    }
    ;

    Firework.prototype.shot
    =function(){
        
    var _this=this;
        _this.isShoted
    =true;
        
    var shotInterval=window.setInterval(function(){
            
    if(parseInt(_this._shotting.style.top)>_this.shotHeight){
                _this._shotting.style.top
    =parseInt(_this._shotting.style.top)-_this._shotting.speed+"px";
            }

            
    else{
                window.clearInterval(shotInterval);
                _this.parentElement.removeChild(_this._shotting);
                _this.bomb();
                _this._shotting
    =null;
            }
        
        }
    ,Utils.INTERVAL_SPEED);
    }
    ;

    Firework.prototype.bomb
    =function(){
        
    var _this=this;
        
    if(_this.isFlash){
            _this._flashing.style.display
    ="";
            
    var flashTimeout=window.setTimeout(function(){
                _this.parentElement.removeChild(_this._flashing);
                window.clearTimeout(flashTimeout);
            }
    ,10);
        }

        
    else{
            _this.parentElement.removeChild(_this._flashing);
        }

        
        
    for (var i = 0; i <_this._particles.length; i++{
            _this._moveParticle(_this._particles[i], Utils.getIntervalRandom(
    0,360));
        }

    }
    ;

    Firework.prototype._setSize
    =function(obj,value){
        obj.style.fontSize
    =parseInt(value)+"px";
    }
    ;

    Firework.prototype._moveParticle
    =function(particle,angle){
        
    var _this=this;
        
    var initX=parseInt(particle.style.left);
        
    var initY=parseInt(particle.style.top);
        
    var currentDistance=0;
        
    var currentX=initX;
        
    var currentY=initY;
        particle.style.display
    ="";
        
        particle.intervalId
    =window.setInterval(function(){
            
    if(currentDistance<particle.distance){
                
    var newX,newY;
                
    var xAngle=angle*(2*Math.PI/360);
                var xDirection=Math.abs(Math.cos(xAngle))/Math.cos(xAngle);
                var yDirection=Math.abs(Math.sin(xAngle))/Math.sin(xAngle);
        
                
    if(Math.abs(Math.tan(xAngle))<=1){
                    
    var deltaX=Math.abs(particle.speed*Math.cos(xAngle))*xDirection;
                    newX
    =currentX+deltaX;
                    newY
    =-(newX-initX)*Math.tan(xAngle)+initY;
                    currentDistance
    +=Math.abs(deltaX);
                }

                
    else{
                    
    var deltaY=Math.abs(particle.speed*Math.sin(xAngle))*yDirection;
                    newY
    =currentY-deltaY;
                    newX
    =-(newY-initY)/Math.tan(xAngle)+initX;
                    currentDistance+=Math.abs(deltaY);
                }

                currentX
    =newX;
                currentY
    =newY;
                particle.style.left
    =currentX+"px";
                particle.style.top
    =currentY+"px";
            }

            
    else{
                window.clearInterval(particle.intervalId);
                _this.parentElement.removeChild(particle);
                particle
    =null;
                
    if(++_this._disposeCount==_this.particleCount){
                    _this._particles.length
    =0;
                    _this.parentElement
    =null;
                    _this
    =null;
                }

            }

        }
    ,Utils.INTERVAL_SPEED);

    };

    HTML页面代码:

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
        
    <head>
            
    <script type="text/javascript" src="firework.js"></script>
            
    <script type="text/javascript">
                
    function test(){
                    
    var fireworks=[];
                    
    var total=15;
                    window.setInterval(
    function(){
                        
    for (var i = 0; i < total; i++{
                            
    if (!fireworks[i] || !fireworks[i].parentElement) {
                                
    var x=Utils.getIntervalRandom(50,document.body.offsetWidth-50);
                                
    var shotHeight=Utils.getIntervalRandom(100,450);
                                
    var radius=Utils.getIntervalRandom(50,200);
                                
    var particleCount=Utils.getIntervalRandom(40,80);
                                
    var speed=Utils.getIntervalRandom(10,20);
                                
    var color="#"+Utils.getIntervalRandom(0,16777215).toString(16).padLeft(6,"f");
                                fireworks[i] 
    = new Firework(x, shotHeight, radius, particleCount, color, speed);
                            }

                        }

                    }
    ,100);
                    
                    window.setInterval(
    function(){
                        
    var currentIndex=Utils.getIntervalRandom(0,total);
                        
    if(fireworks[currentIndex] && fireworks[currentIndex].parentElement && !fireworks[currentIndex].isShoted){
                            fireworks[currentIndex].shot();
                        }

                    }
    ,500);
                }

            
    </script>
        
    </head>
        
    <body bgColor="#000000" onload="test();">
            
    <div style="100%;text-align:center;font:100px 'Comic Sans MS',Arial,sans-serif;color:yellow;">Happy New Year</div>
            
    <div style="100%;text-align:center;font:100px 'Comic Sans MS',Arial,sans-serif;color:red;">2009</div>
            
    <href="http://random.cnblogs.com" target="newWindow"><div style="100%;font-size:12px;text-align:center;color:#fff">Copyright by Random 2009 All Rights Reserved</div></a>
        
    </body>
    </html>
  • 相关阅读:
    二、推导式/自省
    一、Python编码规范(PEP 8)/工程结构化
    十、持续集成(Jenkins+Ant+Jmeter)
    九、Jmeter之逻辑控制器
    八、Jmeter分布式测试
    七、ServerAgent监控服务器资源
    六、场景设计/报告分析
    五、集合点/断言/关联
    .html页面引入vue并使用公共组件
    vue.js页面刷新出现闪烁问题的解决
  • 原文地址:https://www.cnblogs.com/Random/p/1366394.html
Copyright © 2011-2022 走看看