您好,登錄后才能下訂單哦!
本文實(shí)例講述了JS小球拋物線軌跡運(yùn)動(dòng)的兩種實(shí)現(xiàn)方法。分享給大家供大家參考,具體如下:
js實(shí)現(xiàn)小球拋物軌跡運(yùn)動(dòng)的大致思路:
1、用setInterval()
方法,進(jìn)行間隔性刷新,更新小球位置,以實(shí)現(xiàn)動(dòng)態(tài)效果
2、繪制小球和運(yùn)動(dòng)區(qū)域,運(yùn)動(dòng)區(qū)域可通過flex布局實(shí)現(xiàn)垂直居中
3、用物理公式S(y)=1/2*g*t*t,S(x)=V(x)t來計(jì)算路徑
現(xiàn)確定V(x)=4m/s,刷新的時(shí)間間隔設(shè)置為0.1s。原本px和米之間的轉(zhuǎn)換,不同尺寸轉(zhuǎn)換不同,本例采用17寸顯示器,大約1px=0.4mm。但瀏覽器太小,因此只能模擬拋物線軌跡,本例將px和米之間縮成100倍。
第一種:通過border-radius繪制小球
思路:用border-radius: 50%
繪制小球,給小球設(shè)置relative,每次計(jì)算小球當(dāng)前位置,賦給top和left。計(jì)算運(yùn)動(dòng)軌跡時(shí),可用變量自增計(jì)算setInterval
調(diào)用次數(shù),每次是0.1s,這樣可計(jì)算總時(shí)間。代碼如下:
<!DOCTYPE> <html> <head> <meta http-equiv="Content-type" content="text/html; charset=utf-8" /> <title></title> <style type="text/css"> /*給body進(jìn)行flex布局,實(shí)現(xiàn)垂直居中*/ body { min-height: 100vh;/*高度適應(yīng)瀏覽器高度*/ display: flex; justify-content: center;/*水平居中*/ align-items: center;/*垂直居中*/ font-size: 20px; font-weight: bold; } /*設(shè)置運(yùn)動(dòng)區(qū)域*/ #bg { width: 600px; height: 600px; border: 2px solid #e0e0e0; border-radius: 4px;/*給div設(shè)置圓角*/ padding: 20px; } /*生成小球,并定義初始位置*/ #ball { border-radius: 50%;/*可把正方形變成圓形,50%即可*/ background: #e0e0e0; width: 60px; height: 60px; position: relative; top: 30px; left: 30px; } button { width: 80px; height: 30px; border-radius: 4px; color: #fff; background: #AA7ECC; font-size: 20px; font-weight: bold; margin-left: 20px; } </style> </head> <body> <div id="bg"> 此時(shí)水平速度為:4<button onclick="start()">演示</button> <div id="ball"></div> </div> <script type="text/javascript"> function start(){ var x,y,k=1,t; //x是水平方向移動(dòng)路徑;y是垂直方向的;k記錄次數(shù),可與0.1相乘得時(shí)間;t記錄setInterval的返回id,用于clearInterval t = setInterval(function(){ x = 30+0.1*k*4*100; //S(x)=S(0)+t*V(x),100是自定義的米到px轉(zhuǎn)換數(shù) y = 30+1/2*9.8*0.1*k*0.1*k*100;//S(y)=S(0)+1/2*g*t*t var j = document.getElementById("ball"); //通過修改小球的top和left,修改小球的位置 j.style.top = y; j.style.left = x; k++;//每次調(diào)用,k自增,簡(jiǎn)化計(jì)算 if(x>480||y>480){ clearInterval(t);//小球達(dá)到邊界時(shí),清除setInterval } },100);//每0.1s調(diào)用一次setInterval的function } </script> </body> </html>
第二種:h6中的canvas繪制小球和運(yùn)動(dòng)區(qū)域
思路:采用canvas繪制小球,由于小球不能通過top和left移動(dòng),因此它需要每次調(diào)用都要用clearRect清空畫布,然后繪制計(jì)算后位置的小球。代碼如下:
<!DOCTYPE> <html> <head> <meta http-equiv="Content-type" content="text/html; charset=utf-8" /> <title></title> <style type="text/css"> body { min-height: 100vh; display: flex; justify-content: center; align-items: center; } #myCanvas { box-shadow: -2px -2px 2px #efefef,5px 5px 5px #b9b9b9; } </style> </head> <body> <canvas id="myCanvas" width="600px" height="600px"></canvas> <script type="text/javascript"> var x=50,y=50,k=1; var c=document.getElementById("myCanvas"); var cxt=c.getContext("2d"); cxt.fillStyle="#e0e0e0"; cxt.beginPath(); cxt.arc(x,y,30,0,Math.PI*2,true); cxt.closePath(); cxt.fill(); t=setInterval("parabola()",100); function parabola(){ cxt.clearRect(0,0,600,600);//清除原始圖形 cxt.beginPath(); x=50+0.1*k*4*100;y=50+9.8*0.1*k*0.1*k*1/2*100; cxt.arc(x,y,30,0,Math.PI*2,true); cxt.closePath(); cxt.fill(); k++; if(x>520||y>520){ clearInterval(t); } } </script> </body> </html>
兩個(gè)方式都能實(shí)現(xiàn),計(jì)算的方式都是一樣的,只是方式不同。第一個(gè)是偏css,采用了border-radius和動(dòng)態(tài)修改DOM,第二個(gè)采用canvas繪制圖形,繪制過程要好好研究。
更多關(guān)于JavaScript相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《JavaScript運(yùn)動(dòng)效果與技巧匯總》、《JavaScript動(dòng)畫特效與技巧匯總》、《JavaScript圖形繪制技巧總結(jié)》、《JavaScript切換特效與技巧總結(jié)》、《JavaScript錯(cuò)誤與調(diào)試技巧總結(jié)》、《JavaScript數(shù)據(jù)結(jié)構(gòu)與算法技巧總結(jié)》及《JavaScript數(shù)學(xué)運(yùn)算用法總結(jié)》
希望本文所述對(duì)大家JavaScript程序設(shè)計(jì)有所幫助。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。