欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

JavaScript運動框架 解決速度正負(fù)取整問題(一)

 更新時間:2022年05月08日 10:46:54   作者:GY_U_YG  
這篇文章主要為大家詳細(xì)介紹了JavaScript運動框架的第一部分,解決速度正負(fù)取整問題,具有一定的參考價值,感興趣的小伙伴們可以參考一下

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

緩沖的特點:

  • 速度隨著距離的縮短而降低
  • 速度 = (目標(biāo)值 - 當(dāng)前值) / 縮放系數(shù);
  • 速度一定要是整數(shù)

比如,一個div從最左邊運動到left等于400的位置停下,可以如下實現(xiàn):

<!DOCTYPE html>
<html>
<head>
 <meta charset="utf-8">
 <title>運動框架(一)</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() {
   /* 每次啟動定時器應(yīng)該把上次的定時器清理掉,
    因為有的人會多次點擊按鈕,多次啟動定時器,速度會疊加越來越快!
   */
   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>

這里寫圖片描述

這里寫圖片描述

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

這里寫圖片描述

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

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

這里寫圖片描述

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

這里寫圖片描述

總結(jié):

正向運動(速度 > 0), Math.ceil(speed);
反向運動(速度 < 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);
}

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

如果速度不取整,最后的結(jié)果就是停在目標(biāo)值附近,還差幾個像素,這個值最后算出來的速度的絕對值肯定小于1,導(dǎo)致還差幾像素跨不過去了,如果你這時候讓速度取整達(dá)到1,最后幾個像素的距離其實就是勻速前行了,每次(30ms)都行走1px,因為最后幾次都速度算出來都是1,1px 1px的行走到目的地!

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • JS 字符串連接[性能比較]

    JS 字符串連接[性能比較]

    js字符串連接實現(xiàn)代碼。
    2009-05-05
  • js實現(xiàn)關(guān)閉網(wǎng)頁出現(xiàn)是否離開提示

    js實現(xiàn)關(guān)閉網(wǎng)頁出現(xiàn)是否離開提示

    本篇文章主要給大家?guī)硪粋€JS實用功能,監(jiān)聽瀏覽器在關(guān)閉的時候提示出是否要離開的小功能,需要的朋友學(xué)習(xí)下吧。
    2017-12-12
  • 深入理解js數(shù)組的sort排序

    深入理解js數(shù)組的sort排序

    下面小編就為大家?guī)硪黄钊肜斫鈐s數(shù)組的sort排序。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-05-05
  • 一文詳解如何用原型鏈的方式實現(xiàn)JS繼承

    一文詳解如何用原型鏈的方式實現(xiàn)JS繼承

    JavaScript中,每當(dāng)創(chuàng)建一個對象,都會給這個對象提供一個內(nèi)置對象 [[Prototype]] 。這個對象就是原型對象,[[Prototype]] 的層層嵌套就形成了原型鏈。本文將詳細(xì)講解如何用原型鏈的方式實現(xiàn)一個 JS 繼承,感興趣的可以了解下
    2022-04-04
  • Array, Array Constructor, for in loop, typeof, instanceOf

    Array, Array Constructor, for in loop, typeof, instanceOf

    雖然在 JavaScript 中數(shù)組是是對象,但是沒有好的理由去使用 `for in` 循環(huán) 遍歷數(shù)組。相反,有一些好的理由不去使用 for in 遍歷數(shù)組。
    2011-09-09
  • three.js中正交與透視投影相機(jī)的實戰(zhàn)應(yīng)用指南

    three.js中正交與透視投影相機(jī)的實戰(zhàn)應(yīng)用指南

    在three.js中攝像機(jī)的作用就是不斷的拍攝我們創(chuàng)建好的場景,然后通過渲染器渲染到屏幕中,下面這篇文章主要給大家介紹了關(guān)于three.js中正交與透視投影相機(jī)應(yīng)用的相關(guān)資料,需要的朋友可以參考下
    2022-08-08
  • Webpack中雪碧圖插件使用詳解

    Webpack中雪碧圖插件使用詳解

    這篇文章主要介紹了Webpack中雪碧圖插件使用詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-05-05
  • 詳解es6新增數(shù)組方法簡便了哪些操作

    詳解es6新增數(shù)組方法簡便了哪些操作

    這篇文章主要介紹了詳解es6新增數(shù)組方法簡便了哪些操作,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05
  • javascript實現(xiàn)點擊商品列表checkbox實時統(tǒng)計金額的方法

    javascript實現(xiàn)點擊商品列表checkbox實時統(tǒng)計金額的方法

    這篇文章主要介紹了javascript實現(xiàn)點擊商品列表checkbox實時統(tǒng)計金額的方法,涉及javascript鼠標(biāo)事件及頁面元素操作的相關(guān)技巧,需要的朋友可以參考下
    2015-05-05
  • javascript實現(xiàn)2016新年版日歷

    javascript實現(xiàn)2016新年版日歷

    這篇文章主要為大家介紹了javascript實現(xiàn)2016新年版日歷的詳細(xì)代碼,感興趣的小伙伴們可以參考一下
    2016-01-01

最新評論