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


Posted in Javascript onJanuary 23, 2015

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

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

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谢谢 ~

Javascript 相关文章推荐
Jquery的Tabs内容轮换效果实现代码,几行搞定
Feb 12 Javascript
JavaScript使用HTML5的window.postMessage实现跨域通信例子
Apr 11 Javascript
基于jQuery Ajax实现上传文件
Mar 24 Javascript
bootstrap flask登录页面编写实例
Nov 01 Javascript
jquery处理checkbox(复选框)是否被选中实例代码
Jun 12 jQuery
JavaScript原型链与继承操作实例总结
Aug 24 Javascript
小程序获取当前位置加搜索附近热门小区及商区的方法
Apr 08 Javascript
jQuery操作cookie的示例代码
Jun 05 jQuery
jquery实现下载图片功能
Jul 18 jQuery
如何使用原生Js实现随机点名详解
Jan 06 Javascript
JS实现点击掉落特效
Jan 29 Javascript
javascript数组includes、reduce的基本使用
Jul 02 Javascript
Javascript 拖拽的一些高级的应用(逐行分析代码,让你轻松了拖拽的原理)
Jan 23 #Javascript
jQuery选择器querySelector的使用指南
Jan 23 #Javascript
jQuery中DOM操作实例分析
Jan 23 #Javascript
jquery实现点击页面计算点击次数
Jan 23 #Javascript
jQuery中DOM树操作之复制元素的方法
Jan 23 #Javascript
PHP实现的各种中文编码转换类分享
Jan 23 #Javascript
jQuery中DOM树操作之使用反向插入方法实例分析
Jan 23 #Javascript
You might like
封装一个PDO数据库操作类代码
2009/09/09 PHP
PHP输出一个等腰三角形的方法
2015/05/12 PHP
php使用substr()和strpos()联合查找字符串中某一特定字符的方法
2015/05/12 PHP
PHP的反射机制实例详解
2017/03/29 PHP
PHP基于XMLWriter操作xml的方法分析
2017/07/17 PHP
CL vs ForZe BO5 第五场 2.13
2021/03/10 DOTA
javascript 获取函数形参个数
2014/07/31 Javascript
jquery获取一个元素下面相同子元素的个数代码
2014/07/31 Javascript
Node.js模块加载详解
2014/08/16 Javascript
jquery实现聚光灯效果的方法
2015/02/06 Javascript
jquery滚动特效集锦
2015/06/03 Javascript
学习javascript面向对象 理解javascript原型和原型链
2016/01/04 Javascript
轻松掌握JavaScript装饰者模式
2016/08/27 Javascript
js中常用的Tab切换效果(推荐)
2016/08/30 Javascript
js关于getImageData跨域问题的解决方法
2016/10/14 Javascript
基于jQuery实现顶部导航栏功能
2016/12/27 Javascript
jQuery ajax实现省市县三级联动
2021/03/07 Javascript
Angular.js 4.x中表单Template-Driven Forms详解
2017/04/25 Javascript
js常用正则表达式集锦
2019/05/17 Javascript
JS实现瀑布流效果
2020/03/07 Javascript
JS实现手风琴特效
2020/11/08 Javascript
Python中使用第三方库xlutils来追加写入Excel文件示例
2015/04/05 Python
利用Python抓取行政区划码的方法
2016/11/28 Python
使用Python3 编写简单信用卡管理程序
2016/12/21 Python
详解如何用django实现redirect的几种方法总结
2018/11/22 Python
基于python实现微信好友数据分析(简单)
2020/02/16 Python
Python实现图片查找轮廓、多边形拟合、最小外接矩形代码
2020/07/14 Python
浅析python中的del用法
2020/09/02 Python
python在CMD界面读取excel所有数据的示例
2020/09/28 Python
ROSEFIELD手表荷兰官方网上商店:北欧极简设计女士腕表品牌
2018/01/24 全球购物
餐饮业的创业计划书范文
2013/12/26 职场文书
超市端午节活动方案
2014/01/23 职场文书
远程网络教育毕业生自我鉴定
2014/04/14 职场文书
法制宣传教育方案
2014/05/09 职场文书
单位绩效考核方案
2014/05/11 职场文书
美术学专业求职信
2014/07/23 职场文书