JavaScript運動框架 多值運動(四)
多值運動,也就是對于某個對象來說,不僅僅只是其中一個屬性值在變化,而是好多個,比如寬,高,字體,透明度等等同時變化
當(dāng)然了,多值運動會產(chǎn)生一個問題,就是定時器何時關(guān)閉的問題!當(dāng)然是所有的屬性值都運動到目標(biāo)值了才能清理定時器,也就是等最慢的。就好比十個人一起聚餐,不能等到來一個人就開吃!
前幾篇講的都是一個元素對象中某一個屬性的運動,這次講同一個元素對象中多個屬性值的緩沖運動,那么每個屬性都有個終點(目標(biāo)點),我們把這些屬性及其目標(biāo)值寫成一個對象的形式,或者是json狀!容易產(chǎn)生的問題就是上面說的,這里用了共同的速度函數(shù),但有的屬性值從100 –> 101, 有的屬性值從100 –> 600,你得等耗時最長的屬性值到達目標(biāo)值才能關(guān)閉該obj所擁有的定時器,設(shè)計的思路就是每次執(zhí)行輪詢函數(shù)設(shè)置一個bStob = true;在遍歷掃描json中屬性的時候,只要有沒到到目標(biāo)值的屬性,就設(shè)為false,這樣定時器就不會關(guān)閉,即使有的屬性值已經(jīng)到達終點,此時輪詢依舊會執(zhí)行掃描,只不過此時該屬性運動速度為0了,也不會運動了。也就是之前:
if(attr == cur) { cleartInterval(obj.timer); }
要增強為:
if (bStop) { clearInterval(obj.timer); }
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>運動框架(四):多值運動</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]) {//凡是有未到達目標(biāo)點的,一律不讓定時器停下,否則有的屬性不能到達目標(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,說明沒有沒到達目標(biāo)值的屬性,也就是都到了 if (bStop) { clearInterval(obj.timer);//說明所有的屬性都到達了目標(biāo)值 } }, 30); } </script> </body> </html>
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
JavaScript中的this例題實戰(zhàn)總結(jié)詳析
使用JavaScript開發(fā)的時候,很多人多多少少都會被this的指向問題搞蒙圈,下面這篇文章主要給大家介紹了關(guān)于JavaScript中this例題實戰(zhàn)的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下2022-06-06JS驗證日期的格式Y(jié)YYY-mm-dd 具體實現(xiàn)
這篇文章介紹了JS對日期格式的驗證實例,有需要的朋友可以參考一下2013-06-06在JavaScript 中按字母排序之如何在 JS 中按名稱排序
有時你可能有一個單詞數(shù)組,你想按字母順序(從 a-z)對每個單詞進行排序,或者你可能有一個包含用戶信息(包括名字)的對象數(shù)組,例如,你想按照用戶的名字來排序,接下來通過本文給大家介紹在JavaScript 中按字母排序之如何在 JS 中按名稱排序,需要的朋友可以參考下2023-09-09使用有限狀態(tài)機實現(xiàn)簡版的html解析器
FSM(Finite State Machines) 有限狀態(tài)機,也叫有限狀態(tài)自動機,是為研究有限內(nèi)存的計算過程和某些語言類而抽象出的一種計算模型,本文將使用有限狀態(tài)機實現(xiàn)一個簡版的html解析器,有需要的小伙伴可以參考下2023-11-11javascript 處理HTML元素必須避免使用的一種方法
我們在編寫前臺頁面的時候,可能經(jīng)常會用到“javascript+數(shù)據(jù)”生成頁面元素的方法,但當(dāng)我們要處理的數(shù)據(jù)量較大,導(dǎo)致頁面需要展現(xiàn)過多的控件的時候,頁面的響應(yīng)速度也會直線下降2009-07-07