Javascript 完美运动框架(逐行分析代码,让你轻松了运动的原理)

 更新时间:2015年01月23日 16:33:48   投稿:mdxy-dxy  
这篇文章主要介绍了Javascript 完美运动框架,逐行分析代码,让你轻松了运动的原理,需要的朋友可以参考下

大家一听这名字就知道,有了这套框架 网上的效果基本都是可以实现的。实际上之前的运动框架还是有局限性的,就是不能让好几个值一块运动。

那这个问题怎么解决呢? 我们先来看看之前的运动框架

function getStyle(obj, name) {
  if (obj.currentStyle) {
    return obj.currentStyle[name];
  } else {
    return getComputedStyle(obj, null)[name];
  }
}


function startMove(obj, attr, iTarget) {
  clearInterval(obj.time);
  obj.time = setInterval(function() {
    var cur = 0;

    if (attr == 'opacity') {
      cur = Math.round(parseFloat(getStyle(obj, attr)) * 100);
    } else {
      cur = parseInt(getStyle(obj, attr));
    }

    var speed = (iTarget - cur) / 6;

    speed = speed > 0 ? Math.ceil(speed) : Math.floor(speed);

    if (cur == iTarget) {
      clearInterval(obj.time);
    } else {
      if (attr == 'opacity') {
        obj.style.filter = 'alpha(opacity=' + cur + speed + ')';
        obj.style.opacity = (cur + speed) / 100;
      } else {
        obj.style[attr] = cur + speed + 'px';
      }
    }
  }, 30);
}

怎么修改呢? 实际上很简单, 在过去的框架中,你每一次只能传一个样式,和一个值。那么现在把这些改成一个json对象。相信大家就明白了。

我们调用的时候就是startMove(oDiv,{width:200,height:200}); 如果需要的话就在加上回调函数。那么我们具体看看代码是怎么修改的。

function startMove(obj, json, fnEnd)
{
  var MAX=18;
  //每次调用就只有一个定时器在工作(开始运动时关闭已有定时器)
  //并且关闭或者开启都是当前物体的定时器,已防止与页面上其他定时器的冲突,使每个定时器都互不干扰 
  clearInterval(obj.timer); 
  obj.timer=setInterval(function (){
    
    var bStop=true; // 假设:所有的值都已经到了
    
    for(var name in json)
    {
      var iTarget=json[name]; // 目标点
      
      //处理透明度,不能使用parseInt否则就为0了 
      
      if(name=='opacity')
      {
        
        // *100 会有误差 0000007 之类的 所以要用 Math.round() 会四舍五入
        var cur=Math.round(parseFloat(getStyle(obj, name))*100); 
      }
      else
      {
        var cur=parseInt(getStyle(obj, name)); // cur 当前移动的数值
      }
      
      var speed=(iTarget-cur)/5; // 物体运动的速度 数字越小动的越慢 /5 : 自定义的数字
      
      speed=speed>0?Math.ceil(speed):Math.floor(speed);
      
      if(Math.abs(speed)>MAX)speed=speed>0?MAX:-MAX;
      
      if(name=='opacity')
      {
        obj.style.filter='alpha(opacity:'+(cur+speed)+')'; //IE
        obj.style.opacity=(cur+speed)/100; //ff chrome
      }
      else
      {
        obj.style[name]=cur+speed+'px';
      }
      
      // 某个值不等于目标点 
      if(cur!=iTarget)
      {
        bStop=false;
      }
    }
    
    // 都达到了目标点
    if(bStop)
    {
      clearInterval(obj.timer);
      
      if(fnEnd) //只有传了这个函数才去调用
      {
        fnEnd();
      }
    }
  }, 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谢谢 ~

相关文章

  • 在微信小程序中使用iconfont的最新图文教程

    在微信小程序中使用iconfont的最新图文教程

    由于微信小程序线上的资源限制了各种接口安全域名,所以在小程序里如果想使用iconfont字体图标就会稍有不同,下面这篇文章主要给大家介绍了关于在微信小程序中使用iconfont的相关资料,需要的朋友可以参考下
    2022-08-08
  • JS实现消灭星星小游戏

    JS实现消灭星星小游戏

    这篇文章主要为大家详细介绍了JS实现消灭星星小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • JavaScript逆向调试技巧总结分享

    JavaScript逆向调试技巧总结分享

    当我们抓取网页端数据时,经常被加密参数、加密数据所困扰,如何快速定位这些加解密函数,尤为重要,下面这篇文章主要给大家介绍了关于JavaScript逆向调试技巧的相关资料,需要的朋友可以参考下
    2022-06-06
  • ES10 特性的完整指南小结

    ES10 特性的完整指南小结

    这篇文章主要介绍了ES10 特性的完整指南小结,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-03-03
  • JavaScript进阶(三)闭包原理与用法详解

    JavaScript进阶(三)闭包原理与用法详解

    这篇文章主要介绍了JavaScript闭包原理与用法,结合实例形式详细分析了JavaScript闭包相关概念、原理、用法及操作注意事项,需要的朋友可以参考下
    2020-05-05
  • 《javascript设计模式》学习笔记三:Javascript面向对象程序设计单例模式原理与实现方法分析

    《javascript设计模式》学习笔记三:Javascript面向对象程序设计单例模式原理与实现方法分析

    这篇文章主要介绍了Javascript面向对象程序设计单例模式原理与实现方法,结合实例形式分析了《javascript设计模式》中Javascript面向对象单例模式相关概念、原理、用法及操作注意事项,需要的朋友可以参考下
    2020-04-04
  • js select实现省市区联动选择

    js select实现省市区联动选择

    这篇文章主要为大家详细介绍了js select实现省市区联动选择效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-08-08
  • js判断浏览器版本以及浏览器内核的方法

    js判断浏览器版本以及浏览器内核的方法

    这篇文章主要介绍了js判断浏览器版本以及浏览器内核的方法,可实现针对各个浏览器的判断,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-01-01
  • Javascript实现的Map集合工具类完整实例

    Javascript实现的Map集合工具类完整实例

    这篇文章主要介绍了Javascript实现的Map集合工具类,以完整实例形式分析了javascript实现map集合的构造、查找、删除、判断等相关技巧,需要的朋友可以参考下
    2015-07-07
  • javascript编程实现栈的方法详解【经典数据结构】

    javascript编程实现栈的方法详解【经典数据结构】

    这篇文章主要介绍了javascript编程实现栈的方法,简单说明了栈的概念、特点并结合实例形式分析了javascript栈的定义、入栈、出栈等操作相关实现技巧,需要的朋友可以参考下
    2017-04-04

最新评论