<em id="09ttv"></em>
    <sup id="09ttv"><pre id="09ttv"></pre></sup>
    <dd id="09ttv"></dd>

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

          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://m.sdgs6788.com

          存檔

          久久精品国产精品青草| 久久久久亚洲AV无码专区网站| 国产三级精品久久| 亚洲国产精品久久66| 伊人久久大香线蕉影院95| 久久精品国产只有精品2020| 国产99久久精品一区二区| 91精品国产综合久久婷婷| 品成人欧美大片久久国产欧美...| 国产亚洲色婷婷久久99精品91| 久久久久18| 漂亮人妻被中出中文字幕久久 | 久久99精品国产麻豆蜜芽| 狠色狠色狠狠色综合久久| 手机看片久久高清国产日韩| 久久亚洲AV成人无码电影| 久久精品国产亚洲网站| 国产欧美久久久精品影院| 国产午夜免费高清久久影院 | 亚洲AV日韩AV永久无码久久| 色婷婷久久综合中文久久蜜桃av| 久久久精品免费国产四虎| 久久精品国产WWW456C0M| 久久亚洲AV成人出白浆无码国产 | 青青草原综合久久大伊人精品| 精品国产乱码久久久久久浪潮 | 久久中文字幕一区二区| 午夜精品久久久久久影视777| 99久久精品费精品国产一区二区| 久久天天躁狠狠躁夜夜av浪潮| 色欲av伊人久久大香线蕉影院 | 久久国产香蕉视频| 久久精品国产亚洲AV大全| 精品国产日韩久久亚洲| 国内精品久久久久久中文字幕| 久久精品国产亚洲AV久| 久久久久99精品成人片三人毛片| 99久久精品国产高清一区二区 | 中文国产成人精品久久亚洲精品AⅤ无码精品 | 一本伊大人香蕉久久网手机| 日韩人妻无码一区二区三区久久 |