国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > JavaScript > 正文

Javascript 完美運動框架(逐行分析代碼,讓你輕松了運動的原理)

2024-05-06 16:15:14
字體:
來源:轉載
供稿:網友

這篇文章主要介紹了Javascript 完美運動框架,逐行分析代碼,讓你輕松了運動的原理,需要的朋友可以參考下

大家一聽這名字就知道,有了這套框架 網上的效果基本都是可以實現的。實際上之前的運動框架還是有局限性的,就是不能讓好幾個值一塊運動。

那這個問題怎么解決呢? 我們先來看看之前的運動框架

 

 
  1. function getStyle(obj, name) { 
  2. if (obj.currentStyle) { 
  3. return obj.currentStyle[name]; 
  4. else { 
  5. return getComputedStyle(obj, null)[name]; 
  6.  
  7.  
  8. function startMove(obj, attr, iTarget) { 
  9. clearInterval(obj.time); 
  10. obj.time = setInterval(function() { 
  11. var cur = 0; 
  12.  
  13. if (attr == 'opacity') { 
  14. cur = Math.round(parseFloat(getStyle(obj, attr)) * 100); 
  15. else { 
  16. cur = parseInt(getStyle(obj, attr)); 
  17.  
  18. var speed = (iTarget - cur) / 6; 
  19.  
  20. speed = speed > 0 ? Math.ceil(speed) : Math.floor(speed); 
  21.  
  22. if (cur == iTarget) { 
  23. clearInterval(obj.time); 
  24. else { 
  25. if (attr == 'opacity') { 
  26. obj.style.filter = 'alpha(opacity=' + cur + speed + ')'
  27. obj.style.opacity = (cur + speed) / 100; 
  28. else { 
  29. obj.style[attr] = cur + speed + 'px'
  30. }, 30); 

怎么修改呢? 實際上很簡單, 在過去的框架中,你每一次只能傳一個樣式,和一個值。那么現在把這些改成一個json對象。相信大家就明白了。

我們調用的時候就是startMove(oDiv,{width:200,height:200}); 如果需要的話就在加上回調函數。那么我們具體看看代碼是怎么修改的。

 

 
  1. function startMove(obj, json, fnEnd) 
  2. var MAX=18; 
  3. //每次調用就只有一個定時器在工作(開始運動時關閉已有定時器) 
  4. //并且關閉或者開啟都是當前物體的定時器,已防止與頁面上其他定時器的沖突,使每個定時器都互不干擾  
  5. clearInterval(obj.timer);  
  6. obj.timer=setInterval(function (){ 
  7.  
  8. var bStop=true// 假設:所有的值都已經到了 
  9.  
  10. for(var name in json) 
  11. var iTarget=json[name]; // 目標點 
  12.  
  13. //處理透明度,不能使用parseInt否則就為0了  
  14.  
  15. if(name=='opacity'
  16.  
  17. // *100 會有誤差 0000007 之類的 所以要用 Math.round() 會四舍五入 
  18. var cur=Math.round(parseFloat(getStyle(obj, name))*100);  
  19. else 
  20. var cur=parseInt(getStyle(obj, name)); // cur 當前移動的數值 
  21.  
  22. var speed=(iTarget-cur)/5; // 物體運動的速度 數字越小動的越慢 /5 : 自定義的數字 
  23.  
  24. speed=speed>0?Math.ceil(speed):Math.floor(speed); 
  25.  
  26. if(Math.abs(speed)>MAX)speed=speed>0?MAX:-MAX; 
  27.  
  28. if(name=='opacity'
  29. obj.style.filter='alpha(opacity:'+(cur+speed)+')'//IE 
  30. obj.style.opacity=(cur+speed)/100; //ff chrome 
  31. else 
  32. obj.style[name]=cur+speed+'px'
  33.  
  34. // 某個值不等于目標點  
  35. if(cur!=iTarget) 
  36. bStop=false
  37.  
  38. // 都達到了目標點 
  39. if(bStop) 
  40. clearInterval(obj.timer); 
  41.  
  42. if(fnEnd) //只有傳了這個函數才去調用 
  43. fnEnd(); 
  44. }, 20); 

為什么會有bstop的假設呢?

其實如果我這樣調用startMove(oDiv,{width:101,height:200}); 寬度變成101 已經完成運動了,高度沒有到, 但是我們可能已經關閉了當前的定時器。運動已經結束了,就會出現一個特殊情況下的bug。解釋一下:

實際上來說,需要所有的運動都到了才關閉定時器,反過來說,如果沒有不到的,那就關閉。在程序上就是定義一個布爾值,一開始為true,假設

所有的值都已經到了,如果說有一個值不等于目標點,bstop為false 。 在整個循環結束后,bstop 為ture 就說明所有運動都完成了,這個時候就關閉定時器。

那么這個運動框架基本已經完成了,適用css2 不適用css3。

總結:

運動框架的演變過程

startMove(iTarget) 運動框架

startMove(obj,iTarget) 多物體

startMove(obj,attr,iTarget) 任意值

startMove(obj,attr,iTarget,fn) 鏈式運動

startMove(obj,json,fn) 完美運動

O(∩_∩)O謝謝 ~

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 滁州市| 屏东市| 新巴尔虎左旗| 马鞍山市| 河曲县| 徐水县| 雅安市| 扶沟县| 疏附县| 观塘区| 洪湖市| 武夷山市| 宜宾县| 华池县| 全南县| 阿图什市| 锡林浩特市| 塔城市| 迁西县| 越西县| 六盘水市| 松阳县| 乐清市| 曲靖市| 民丰县| 公主岭市| 米易县| 桦南县| 依安县| 富民县| 沅陵县| 阜宁县| 平顺县| 津南区| 五河县| 乐东| 赣州市| 团风县| 虎林市| 丰城市| 来宾市|