分析設計html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <style> #container{ width: 80%; height: 600px; border: 2px solid red; background: #000; margin:20px auto; cursor: pointer; position: relative; left: 0; top: 0; overflow: hidden; } .fire{ width: 10px; height:10px; position: absolute; bottom: 0; } .small-fire{ width: 10px; height:10px; position: absolute; border-radius: 50%; } </style> </head> <body> <div id="container"></div> </body> <script> // OOA:煙花,點擊出現煙花,運動到某處,炸開小煙花,運動到隨機位置,刪除 // 1.建立主體煙花,設置樣式,位置 // 2.開始運動,運動結束 // 3.刪除主體煙花,建立小煙花 // 4.當即運動,到終點,刪除小煙花 // OOD: // function Fire(){ // // 。。。 // // 1.建立主體煙花,設置樣式,位置 // this.init() // } // Fire.prototype.init = function(){ // // 主體煙花,設置樣式,位置 // // 2.開始運動,運動結束 // this.animate() // } // Fire.prototype.animate = function(){ // // 開始運動。。。 // // 刪除主體煙花 // // 3.建立小煙花 // this.createSmall() // } // Fire.prototype.createSmall = function(){ // // 建立小煙花,運動,刪掉 // } // OOP: function Fire(options){ this.x = options.x; this.y = options.y; this.cont = options.parent; // 1.建立主體煙花,設置樣式,位置 this.init() } Fire.prototype.init = function(){ // 主體煙花,設置樣式,位置 this.ele = document.createElement("div"); this.ele.className = "fire"; this.ele.style.left = this.x + "px"; this.ele.style.background = randomColor(); this.cont.appendChild(this.ele) // 2.開始運動,運動結束 this.animate() } Fire.prototype.animate = function(){ // 開始運動。。。 // 刪除主體煙花 // 3.建立小煙花 this.createSmall() } Fire.prototype.createSmall = function(){ // 建立小煙花,運動,刪掉 } // 範圍隨機數 function random(max,min){ return Math.round(Math.random()*(max-min)+min); } // 隨機顏色 function randomColor(){ return "rgb("+random(0,255)+","+random(0,255)+","+random(0,255)+")"; } var ocont = document.getElementById("container"); ocont.onclick = function(eve){ var e = eve || window.event; new Fire({ x:e.offsetX, y:e.offsetY, parent:this }); } </script> </html>
運動設計-炸開json
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <style> #container{ width: 80%; height: 600px; border: 2px solid red; background: #000; margin:20px auto; cursor: pointer; position: relative; left: 0; top: 0; overflow: hidden; } .fire{ width: 10px; height:10px; position: absolute; bottom: 0; } .small-fire{ width: 10px; height:10px; position: absolute; border-radius: 50%; } </style> </head> <body> <div id="container"></div> </body> <script src="../move.js"></script> <script> function Fire(options){ this.x = options.x; this.y = options.y; this.cont = options.parent; // 1.建立主體煙花,設置樣式,位置 this.init() } Fire.prototype.init = function(){ // 主體煙花,設置樣式,位置 this.ele = document.createElement("div"); this.ele.className = "fire"; this.ele.style.left = this.x + "px"; this.ele.style.background = randomColor(); this.cont.appendChild(this.ele) // 2.開始運動,運動結束 this.animate() } Fire.prototype.animate = function(){ // 開始運動。。。 move(this.ele,{ top:this.y },function(){ // 刪除主體煙花 this.ele.remove() // 3.建立小煙花 this.createSmall() }.bind(this)) } Fire.prototype.createSmall = function(){ // 建立小煙花,運動,刪掉 var num = random(10,20); console.log(num) for(var i=0;i<num;i++){ let div = document.createElement("div"); div.className = "small-fire"; div.style.background = randomColor(); div.style.left = this.x + "px"; div.style.top = this.y + "px"; div.setAttribute("i",i); this.cont.appendChild(div); // 產生隨機座標 var l = random(0,this.cont.offsetWidth-div.offsetWidth); var t = random(0,this.cont.offsetHeight-div.offsetHeight); // 在move的回調函數中,找不到每一個div: // 緣由:異步:for循環當即執行,回到函數等待執行,回調函數執行時,循環已經結束多時,div已經被重複覆蓋 // 解決方案: // 1.提早定義數組保存,結束時根據數組刪除 // 2.使用bind將div強行傳進去 // 3.使用匿名函數生成新的做用域,保存div:*** // 4.利用let觸發塊級做用域,保存div:√ move(div,{ left:l, top:t },function(){ div.remove() }) } } // for(){ // ali[i] = i // ali[i].onclick = function(){ // this // } // } // 範圍隨機數 function random(max,min){ return Math.round(Math.random()*(max-min)+min); } // 隨機顏色 function randomColor(){ return "rgb("+random(0,255)+","+random(0,255)+","+random(0,255)+")"; } var ocont = document.getElementById("container"); ocont.onclick = function(eve){ var e = eve || window.event; new Fire({ x:e.offsetX, y:e.offsetY, parent:this }); } </script> </html>
最終代碼數組
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <style> #container { width: 80%; height: 600px; border: 2px solid red; background: #000; margin: 20px auto; cursor: pointer; position: relative; left: 0; top: 0; overflow: hidden; } .fire { width: 10px; height: 10px; position: absolute; bottom: 0; } .small-fire { width: 10px; height: 10px; position: absolute; border-radius: 50%; } </style> </head> <body> <div id="container"></div> </body> <script> function Fire(options) { this.x = options.x; this.y = options.y; this.cont = options.parent; // 1.建立主體煙花,設置樣式,位置 this.init() } Fire.prototype.init = function() { // 主體煙花,設置樣式,位置 this.ele = document.createElement("div"); this.ele.className = "fire"; this.ele.style.left = this.x + "px"; this.ele.style.background = randomColor(); this.cont.appendChild(this.ele) // 2.開始運動,運動結束 this.animate() } Fire.prototype.animate = function() { // 開始運動。。。 move(this.ele, { top: this.y }, function() { // 刪除主體煙花 this.ele.remove() // 3.建立小煙花 this.createSmall() }.bind(this)) } Fire.prototype.createSmall = function() { // 建立小煙花,運動,刪掉 var num = random(10, 20); // 1.隨機的半徑 var r = random(100, 200); console.log(num) for (var i = 0; i < num; i++) { let div = document.createElement("div"); div.className = "small-fire"; div.style.background = randomColor(); div.style.left = this.x + "px"; div.style.top = this.y + "px"; div.setAttribute("i", i); this.cont.appendChild(div); // 2.利用三角函數,計算出一個圓上面平均分佈的點的座標 // 注意三角函數的方法接收的是弧度:別忘記角度轉弧度 var l = parseInt(Math.cos(Math.PI / 180 * (360 / num * i)) * r) + this.x; var t = parseInt(Math.sin(Math.PI / 180 * (360 / num * i)) * r) + this.y; move(div, { left: l, top: t }, function() { div.remove() }) } } // for(){ // ali[i] = i // ali[i].onclick = function(){ // this // } // } // 範圍隨機數 function random(max, min) { return Math.round(Math.random() * (max - min) + min); } // 隨機顏色 function randomColor() { return "rgb(" + random(0, 255) + "," + random(0, 255) + "," + random(0, 255) + ")"; } var ocont = document.getElementById("container"); ocont.onclick = function(eve) { var e = eve || window.event; new Fire({ x: e.offsetX, y: e.offsetY, parent: this }); } function move(ele, json, callback) { clearInterval(ele.t); ele.t = setInterval(() => { var onoff = true; for (var i in json) { var iNow = parseInt(getStyle(ele, i)); var speed = (json[i] - iNow) / 6; speed = speed < 0 ? Math.floor(speed) : Math.ceil(speed); if (iNow != json[i]) { onoff = false; } ele.style[i] = iNow + speed + "px"; } if (onoff) { clearInterval(ele.t); callback && callback(); } }, 30); } function getStyle(ele, attr) { if (ele.currentStyle) { return ele.currentStyle[attr]; } else { return getComputedStyle(ele, false)[attr]; } } </script> </html>