溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

JavaScript運(yùn)動(dòng)框架如何解決速度正負(fù)取整問題

發(fā)布時(shí)間:2021-08-02 14:11:42 來源:億速云 閱讀:92 作者:小新 欄目:web開發(fā)

小編給大家分享一下JavaScript運(yùn)動(dòng)框架如何解決速度正負(fù)取整問題,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!

這里說的運(yùn)動(dòng)是指緩沖運(yùn)動(dòng),緩沖運(yùn)動(dòng)會(huì)使物體逐漸‘著陸',而不是‘硬著陸',到達(dá)目標(biāo)位置的過程中速度越來越慢,看起來很舒服。

緩沖的特點(diǎn):

  • 速度隨著距離的縮短而降低

  • 速度 = (目標(biāo)值 - 當(dāng)前值) / 縮放系數(shù);

  • 速度一定要是整數(shù)

比如,一個(gè)div從最左邊運(yùn)動(dòng)到left等于400的位置停下,可以如下實(shí)現(xiàn):

<!DOCTYPE html>
<html>
<head>
 <meta charset="utf-8">
 <title>運(yùn)動(dòng)框架(一)</title>
 <style type="text/css">
  * {
   padding: 0;
   margin: 0;
  }
  #div1 {
   width: 100px;
   height: 100px;
   background: orange;
   position: absolute;
  }
  #div2 {
   width: 1px;
   height: 300px;
   background: black;
   position: absolute;
   left: 400px;
  }
  #btn1 {
   width: 60px;
   height: 40px;
   background: #fff;
   position: absolute;
   left: 10px;
   top: 150px;
  }
 </style>
</head>
<body>
 <div id="div1"></div>
 <div id="div2"></div>
 <input id="btn1" type="button" value="start" onclick="startMove()" />
 <script type="text/javascript">
  var oDiv = document.getElementById('div1');
  var oBtn = document.getElementById('btn1');
  var timer = null;
  function startMove() {
   /* 每次啟動(dòng)定時(shí)器應(yīng)該把上次的定時(shí)器清理掉,
    因?yàn)橛械娜藭?huì)多次點(diǎn)擊按鈕,多次啟動(dòng)定時(shí)器,速度會(huì)疊加越來越快!
   */
   clearInterval(timer);
   timer = setInterval(function() {
    //每次速度都隨著距離的縮短而變慢
    var speed = (400 - oDiv.offsetLeft) / 10;
    if (oDiv.offsetLeft == 400) {
     clearInterval(timer); 
    } else {
     oDiv.style.left = oDiv.offsetLeft + speed + 'px';
     document.title = oDiv.offsetLeft + ' , ' + speed;
    }
   }, 30);
  }
 </script>
</body>
</html>

JavaScript運(yùn)動(dòng)框架如何解決速度正負(fù)取整問題

JavaScript運(yùn)動(dòng)框架如何解決速度正負(fù)取整問題

你會(huì)發(fā)現(xiàn),啟動(dòng)按鈕之后,div并沒有準(zhǔn)確到達(dá)400的位置,再看看title上打印的實(shí)際目標(biāo)和速度,我們發(fā)現(xiàn)最終落腳點(diǎn)是396,速度為0.4,我們知道:1px是最小單位,沒有小數(shù)的概念,所以0.4px是沒有的概念,會(huì)被計(jì)算機(jī)認(rèn)為是0px,仔細(xì)分析,當(dāng)div運(yùn)行到396px的時(shí)候,還剩下4px,速度為4/10 = 0.4,下一個(gè)單位時(shí)間(30ms)向前運(yùn)行0.4px,實(shí)際上是0,所以永遠(yuǎn)的停下來了,而且永遠(yuǎn)不會(huì)執(zhí)行清除定時(shí)器這一步!
怎么解決,Math中有個(gè)方法叫向上取整,也就是讓速度取整,向上取整,努力幫助div跨過這一步

Math.ceil(3.2) ==> 4
Math.ceil(-9.7) ==> -9
Math.floor(5.98) ==> 5
function startMove() {
 clearInterval(timer);
 timer = setInterval(function() {
  var speed = (400 - oDiv.offsetLeft) / 10;
  speed = Math.ceil(speed);//劃重點(diǎn),劃重點(diǎn)
  if (oDiv.offsetLeft == 400) {
   clearInterval(timer);
  } else {
   oDiv.style.left = oDiv.offsetLeft + speed + 'px';
   document.title = oDiv.offsetLeft + ' , ' + speed;
  }
 }, 30);
}

JavaScript運(yùn)動(dòng)框架如何解決速度正負(fù)取整問題

當(dāng)然了,div除了可以正向運(yùn)動(dòng),也可以負(fù)向運(yùn)動(dòng),比如,從800運(yùn)動(dòng)到400.
如果不取整的話,依舊不能準(zhǔn)確到達(dá)400。

#div1 {
 width: 100px;
 height: 100px;
 background: orange;
 position: absolute;
 left: 800px;/*0 --> 800*/
}

JavaScript運(yùn)動(dòng)框架如何解決速度正負(fù)取整問題

function startMove() {
 clearInterval(timer);
 timer = setInterval(function() {
  var speed = (400 - oDiv.offsetLeft) / 10;
  console.log('speed = ' + speed);
  speed = Math.floor(speed);//劃重點(diǎn),劃重點(diǎn),劃重點(diǎn)
  if (oDiv.offsetLeft == 400) {
   clearInterval(timer);
  } else {
   oDiv.style.left = oDiv.offsetLeft + speed + 'px';
   document.title = oDiv.offsetLeft + ' , ' + speed;
  }
 }, 30);
}

JavaScript運(yùn)動(dòng)框架如何解決速度正負(fù)取整問題

總結(jié):

正向運(yùn)動(dòng)(速度 > 0), Math.ceil(speed);
反向運(yùn)動(dòng)(速度 < 0), Math.floor(speed);

var speed = (iTarget - cur) / 系數(shù);
speed = speed > 0 ? Math.ceil(speed) : Math.floor(speed);
function startMove(iTarget) {
 setInterval(function() {
  var speed = (iTarget- oDiv.offsetLeft) / 10;
  speed = speed > 0 ? Math.ceil(speed) : Match.floor(speed);
  oDiv.style.left = oDiv.offsetLeft + speed + 'px';
 }, 30);
}

速度取整,是為了最后時(shí)刻速度(絕對(duì)值)變大,跨過那一檻,不然只能停留在附近!

如果速度不取整,最后的結(jié)果就是停在目標(biāo)值附近,還差幾個(gè)像素,這個(gè)值最后算出來的速度的絕對(duì)值肯定小于1,導(dǎo)致還差幾像素跨不過去了,如果你這時(shí)候讓速度取整達(dá)到1,最后幾個(gè)像素的距離其實(shí)就是勻速前行了,每次(30ms)都行走1px,因?yàn)樽詈髱状味妓俣人愠鰜矶际?,1px 1px的行走到目的地!

看完了這篇文章,相信你對(duì)“JavaScript運(yùn)動(dòng)框架如何解決速度正負(fù)取整問題”有了一定的了解,如果想了解更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!

向AI問一下細(xì)節(jié)

免責(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)容。

js
AI