<thead id="kdfuf"><font id="kdfuf"></font></thead>
<samp id="kdfuf"></samp>
    <nav id="kdfuf"><strong id="kdfuf"></strong></nav>
      中文字幕无码一区二区三区在线,久久精品人人做人人爽,国产一级内射无挡观看,十八禁在线黄色网站,日韩欧美国产另类久久久精品 ,少妇人妻偷人精品一区二区,久久午夜视频,亚洲春色AⅤ无码专区

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

      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>
      



      行為

      編寫構造函數(shù)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){
                  //創(chuàng)建一個煙花
                  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);
              },
              //創(chuàng)造煙花
              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);
                  },
                  //創(chuàng)造煙花
                  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」的原創(chuàng)文章,遵循 CC 4.0 BY-SA 版權協(xié)議,轉載請附上原文出處鏈接及本聲明。
      原文鏈接:https://blog.csdn.net/qq_41383900/article/details/105026768
      
      


      日歷

      鏈接

      個人資料

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

      存檔

      主站蜘蛛池模板: 中文字幕无码免费久久99老人| 午夜福利视频合集| 影音先锋天堂av| 精品91自产拍在线| 日韩加勒比一本无码精品| japanese中文字幕无码| 国产精品美女久久久久久2018| 亚洲中文字幕久久精品无码VA| 宅男噜噜噜66在线观看| 一本久久a久久精品综合麻豆| 欧美亚洲日本国产一区| 国产成人福利资源在线| china熟女熟妇乱老女人| 庐江县| 国产精品亚洲二区| 国产福利电影一区二区三区| 免费观看一级欧美大片| 成人无码午夜在线观看| 99re66免费不卡国产视频| 国产一级a爱做片天天视频| 亚洲av永久无码天堂网毛片 | 久久大香线蕉av色| 张家界市| 阳山县| 人妻在线日韩免费视频| 欧美久久婷婷五月综合| 精品亚洲香蕉一区二区| 在线欧美剧情100页| 贺州市| 99久久免费只有精品国产| 国产熟女精品一区二区三区| 狠狠干| 中文字幕精品无码亚洲AⅤ野外 | AV无码久久| 欧洲一区无码精品色| 国精产品一区一区三区有限| 久久亚洲热线2020精品骚虎视频| 欧美巨大巨粗黑人性AAAAAA| 吸咬奶头狂揉60分钟视频| 国产午夜福利综合区| 日本一丰满一bbw|