<address id="ttjl9"></address>

      <noframes id="ttjl9"><address id="ttjl9"><nobr id="ttjl9"></nobr></address>
      <form id="ttjl9"></form>
        <em id="ttjl9"><span id="ttjl9"></span></em>
        <address id="ttjl9"></address>

          <noframes id="ttjl9"><form id="ttjl9"></form>

          教你用面向對象編程寫一個煙花爆炸的

          2020-3-23    前端達人

          點擊查看原圖



          想要學會這個漂亮的煙花嗎?快來跟著學習吧~

          結構

          <div class="container"></div>

          我們只需要一個盒子表示煙花爆炸范圍就可以了

          樣式

          fire是煙花 注意添加絕對定位

           <style>
              .container{
                  margin: 0 auto;
                  height: 500px;
                  width: 1200px;
                  background: black;
                  position: relative;
                  overflow: hidden;
              }
              .fire{
                  width: 10px;
                  background: white;
                  height: 10px;
                  /* border-radius: 50%; */
                  position: absolute;
                  bottom: 0;
              }
              </style>
          



          行為

          編寫構造函數Firework

          需要用到一個鼠標點擊的位置,一個div選擇器,一個爆炸樣式

           function Firework(x,y,selector,type){
                  //此處獲取對象的方式為單例的思想,避免重復獲取相同的元素
                  if(Firework.box && selector === Firework.box.selector){
                      this.box =  Firework.box.ele;
                  }else{
                      Firework.box = {
                          ele:document.querySelector(selector),
                          selector:selector
                      }
                      this.box = Firework.box.ele;
                  }
                  this.type = type;
                  this.init(x,y)
              }
          



          封裝一個運動的方法
          function animation(ele,attroptions,callback){
              for(var attr in attroptions){
                  attroptions[attr] ={
                      target:attroptions[attr],
                      inow:parseInt(getComputedStyle(ele)[attr])
                  } 
              }
              clearInterval(ele.timer);
              ele.timer = setInterval(function(){
                  for(var attr in attroptions ){
                      var item = attroptions[attr]
                      var target = item.target;
                      var inow = item.inow;
                      var speed = (target - inow)/10;
                      speed = speed>0?Math.ceil(speed):Math.floor(speed);
                      if(Math.abs(target - inow) <= Math.abs(speed)){
                          ele.style[attr] = target+"px";
                          delete attroptions[attr];
                          for(var num  in attroptions){
                              return false;
                          }
                          clearTimeout(ele.timer);
                          if(typeof callback === "function")callback();
                      }else{
                          attroptions[attr].inow += speed;
                          ele.style[attr]  = attroptions[attr].inow+"px";
                      }
                  }
              },30)
          }
          



          編寫原型方法
          Firework.prototype = {
                  constructor:Firework,
                  //初始化
                  init:function(x,y){
                      //創建一個煙花
                      this.ele = this.createFirework();
                      //xy為鼠標落點
                      this.x = x ;
                      this.y = y;
                      //maxXy為最大運動范圍
                      this.maxX = this.box.offsetWidth - this.ele.offsetWidth;
                      this.maxY = this.box.offsetHeight - this.ele.offsetHeight;
                      //初始化結束后  煙花隨機顏色
                      this.randomColor(this.ele);
                      //煙花升空
                      this.fireworkUp(this.ele);
                  },
                  //創造煙花
                  createFirework:function(){
                      var ele = document.createElement("div");
                      ele.className = "fire";
                      this.box.appendChild(ele);
                      return ele;
                  },
                  //煙花升空
                  fireworkUp:function(ele){
                      ele.style.left = this.x + "px";
                      //此處用到剛剛封裝的運動方法
                      animation(ele,{top:this.y},function(){
                          ele.remove();
                          this.fireworkBlast()
                      }.bind(this));
                  },
                  //煙花爆炸
                  fireworkBlast:function(){
                      for(var i = 0 ; i < 20; i++){
                          var ele = document.createElement("div");
                          ele.className = "fire";
                          ele.style.left = this.x + "px";
                          ele.style.top = this.y + "px";
                          this.box.appendChild(ele);
                          ele.style.borderRadius = "50%";
                          this.randomColor(ele);
                          //判定一下輸入的爆炸方式是原型煙花 還是散落煙花 由此更改獲取的煙花位置
                          animation(ele,this.type === "circle"?this.circleBlast(i,20): this.randomPosition(),function(cale){
                              cale.remove();
                          }.bind(this,ele))
                      }
                  },
                  //圓形爆炸位置
                  circleBlast:function(i,total){
                      var r = 200;
                      var reg = 360 / total *i;
                      var deg = Math.PI / 180 *reg;
                      return {
                          left:r * Math.cos(deg) + this.x ,
                          top:r * Math.sin(deg) + this.y 
                      }
                  },
                  //隨機顏色
                  randomPosition:function(){
                      return {
                          left : Math.random()*this.maxX,
                          top : Math.random()*this.maxY
                      }
                  },
                  randomColor:function(ele){
                      var color =  "#" + parseInt(parseInt("ffffff",16)*Math.random()).toString(16).padStart(6,0);
                      return ele.style.backgroundColor = color;
                  }
              }
          



          綁定事件
          document.querySelector(".container").addEventListener("click",function(evt){
              var e = evt||event;
              new Firework(e.offsetX,e.offsetY,".container","circle")
              new Firework(e.offsetX,e.offsetY,".container")
          })
          
          
          

          全部代碼

          <!DOCTYPE html>
          <html lang="en">
          <head>
              <meta charset="UTF-8">
              <meta name="viewport" content="width=device-width, initial-scale=1.0">
              <meta http-equiv="X-UA-Compatible" content="ie=edge">
              <title>Document</title>
              <style>
              .container{
                  margin: 0 auto;
                  height: 500px;
                  width: 1200px;
                  background: black;
                  position: relative;
                  overflow: hidden;
              }
              .fire{
                  width: 10px;
                  background: white;
                  height: 10px;
                  /* border-radius: 50%; */
                  position: absolute;
                  bottom: 0;
              }
              </style>
          </head>
          <body>
              <div class="container"></div>
              <script src="./utils.js"></script>
              <script>
          
              function animation(ele,attroptions,callback){
                  for(var attr in attroptions){
                      attroptions[attr] ={
                          target:attroptions[attr],
                          inow:parseInt(getComputedStyle(ele)[attr])
                      } 
                  }
                  clearInterval(ele.timer);
                  ele.timer = setInterval(function(){
                      for(var attr in attroptions ){
                          var item = attroptions[attr]
                          var target = item.target;
                          var inow = item.inow;
                          var speed = (target - inow)/10;
                          speed = speed>0?Math.ceil(speed):Math.floor(speed);
                          if(Math.abs(target - inow) <= Math.abs(speed)){
                              ele.style[attr] = target+"px";
                              delete attroptions[attr];
                              for(var num  in attroptions){
                                  return false;
                              }
                              clearTimeout(ele.timer);
                              if(typeof callback === "function")callback();
                          }else{
                              attroptions[attr].inow += speed;
                              ele.style[attr]  = attroptions[attr].inow+"px";
                          }
                      }
                  },30)
              }  
          
                  function Firework(x,y,selector,type){
                      if(Firework.box && selector === Firework.box.selector){
                          this.box =  Firework.box.ele;
                      }else{
                          Firework.box = {
                              ele:document.querySelector(selector),
                              selector:selector
                          }
                          this.box = Firework.box.ele;
                      }
                      this.type = type;
                      this.init(x,y)
                  }
          
                  Firework.prototype = {
                      constructor:Firework,
                      //初始化
                      init:function(x,y){
                          this.ele = this.createFirework();
                          this.x = x ;
                          this.y = y;
                          this.maxX = this.box.offsetWidth - this.ele.offsetWidth;
                          this.maxY = this.box.offsetHeight - this.ele.offsetHeight;
                          this.randomColor(this.ele);
                          this.fireworkUp(this.ele);
                      },
                      //創造煙花
                      createFirework:function(){
                          var ele = document.createElement("div");
                          ele.className = "fire";
                          this.box.appendChild(ele);
                          return ele;
                      },
                      fireworkUp:function(ele){
                          ele.style.left = this.x + "px";
                          animation(ele,{top:this.y},function(){
                              ele.remove();
                              this.fireworkBlast()
                          }.bind(this));
                      },
                      //煙花爆炸
                      fireworkBlast:function(){
                          for(var i = 0 ; i < 20; i++){
                              var ele = document.createElement("div");
                              ele.className = "fire";
                              ele.style.left = this.x + "px";
                              ele.style.top = this.y + "px";
                              this.box.appendChild(ele);
                              ele.style.borderRadius = "50%";
                              this.randomColor(ele);
                              animation(ele,this.type === "circle"?this.circleBlast(i,20): this.randomPosition(),function(cale){
                                  cale.remove();
                              }.bind(this,ele))
                          }
                      },
                      circleBlast:function(i,total){
                          var r = 200;
                          var reg = 360 / total *i;
                          var deg = Math.PI / 180 *reg;
                          return {
                              left:r * Math.cos(deg) + this.x ,
                              top:r * Math.sin(deg) + this.y 
                          }
                      },
                      randomPosition:function(){
                          return {
                              left : Math.random()*this.maxX,
                              top : Math.random()*this.maxY
                          }
                      },
                      randomColor:function(ele){
                          var color =  "#" + parseInt(parseInt("ffffff",16)*Math.random()).toString(16).padStart(6,0);
                          return ele.style.backgroundColor = color;
                      }
                  }
          
                  document.querySelector(".container").addEventListener("click",function(evt){
                      var e = evt||event;
                      new Firework(e.offsetX,e.offsetY,".container","circle")
                      new Firework(e.offsetX,e.offsetY,".container")
                  })
              </script>
          </body>
          </html>
          

          ————————————————
          版權聲明:本文為CSDN博主「SpongeBooob」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
          原文鏈接:https://blog.csdn.net/qq_41383900/article/details/105026768
          
          


          日歷

          鏈接

          個人資料

          藍藍設計的小編 http://www.syprn.cn

          存檔

          亚洲va欧美va天堂v国产综合