溫馨提示×

溫馨提示×

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

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

JavaScript運(yùn)動框架之多值運(yùn)動的示例分析

發(fā)布時間:2021-08-20 10:48:05 來源:億速云 閱讀:146 作者:小新 欄目:web開發(fā)

這篇文章主要介紹JavaScript運(yùn)動框架之多值運(yùn)動的示例分析,文中介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們一定要看完!

多值運(yùn)動,也就是對于某個對象來說,不僅僅只是其中一個屬性值在變化,而是好多個,比如寬,高,字體,透明度等等同時變化

當(dāng)然了,多值運(yùn)動會產(chǎn)生一個問題,就是定時器何時關(guān)閉的問題!當(dāng)然是所有的屬性值都運(yùn)動到目標(biāo)值了才能清理定時器,也就是等最慢的。就好比十個人一起聚餐,不能等到來一個人就開吃!

前幾篇講的都是一個元素對象中某一個屬性的運(yùn)動,這次講同一個元素對象中多個屬性值的緩沖運(yùn)動,那么每個屬性都有個終點(diǎn)(目標(biāo)點(diǎn)),我們把這些屬性及其目標(biāo)值寫成一個對象的形式,或者是json狀!容易產(chǎn)生的問題就是上面說的,這里用了共同的速度函數(shù),但有的屬性值從100 –> 101, 有的屬性值從100 –> 600,你得等耗時最長的屬性值到達(dá)目標(biāo)值才能關(guān)閉該obj所擁有的定時器,設(shè)計(jì)的思路就是每次執(zhí)行輪詢函數(shù)設(shè)置一個bStob = true;在遍歷掃描json中屬性的時候,只要有沒到到目標(biāo)值的屬性,就設(shè)為false,這樣定時器就不會關(guān)閉,即使有的屬性值已經(jīng)到達(dá)終點(diǎn),此時輪詢依舊會執(zhí)行掃描,只不過此時該屬性運(yùn)動速度為0了,也不會運(yùn)動了。也就是之前:

if(attr == cur) {
 cleartInterval(obj.timer);
}

要增強(qiáng)為:

if (bStop) {
 clearInterval(obj.timer);
}
<!DOCTYPE html>
<html>
<head>
 <meta charset="utf-8">
 <title>運(yùn)動框架(四):多值運(yùn)動</title>
 <style type="text/css">
 div {
  width: 100px;
  height: 100px;
  background: orange;
  margin: 10px;
  float: left;
 }
 </style>
</head>
<body>
 <div id="div1"></div>

 <script type="text/javascript">
 var oDiv = document.getElementById('div1');
 oDiv.onmouseover = function() {
  var json = {
  width: 600,
  height: 200,
  opacity: 30
  };
  startMove(this, json);
 };
 oDiv.onmouseout = function() {
  var json = {
  width: 100,
  height: 100,
  opacity: 100
  };
  startMove(this, json);
 };
 function getStyle(obj, attr) {
  if (obj.currentStyle) {
  return obj.currentStyle[attr];
  } else {
  return getComputedStyle(obj, false)[attr];
  }
 }

 function startMove(obj, json) {
  clearInterval(obj.timer);
  obj.timer = setInterval(function() {
  var bStop = true;
  for (var attr in json) {
   var cur = 0;
   if (attr === 'opacity') {
   cur = Math.round(parseFloat(getStyle(obj, attr)) * 100);
   } else {
   cur = parseInt(getStyle(obj, attr));
   }
   var speed = (json[attr] - cur) / 10;
   speed = speed > 0 ? Math.ceil(speed) : Math.floor(speed);
   if (cur != json[attr]) {//凡是有未到達(dá)目標(biāo)點(diǎn)的,一律不讓定時器停下,否則有的屬性不能到達(dá)目標(biāo)值
   bStop = false;
   }
   if (attr === 'opacity') {
   cur += speed;
   obj.style.filter = 'alpha(opacity:' + cur + ')';
   obj.style.opacity = cur / 100;//Chrome,IE
   } else {
   obj.style[attr] = cur + speed + 'px';
   }
  }
  //整個循環(huán)結(jié)束后,仍然保持著true,說明沒有沒到達(dá)目標(biāo)值的屬性,也就是都到了
  if (bStop) {
   clearInterval(obj.timer);//說明所有的屬性都到達(dá)了目標(biāo)值
  }

  }, 30);
 }
 </script>
</body>
</html>

JavaScript運(yùn)動框架之多值運(yùn)動的示例分析

以上是“JavaScript運(yùn)動框架之多值運(yùn)動的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對大家有幫助,更多相關(guān)知識,歡迎關(guān)注億速云行業(yè)資訊頻道!

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

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI