首页 > 语言 > 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谢谢 ~

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

图片精选