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滚动特效集锦
Jun 03 Javascript
JavaScript实现的类字典插入或更新方法实例
Jul 10 Javascript
深入剖析JavaScript编程中的对象概念
Oct 21 Javascript
借助FileReader实现将文件编码为Base64后通过AJAX上传
Dec 24 Javascript
Node.js程序中的本地文件操作用法小结
Mar 06 Javascript
浅谈Sublime Text 3运行JavaScript控制台
Jun 06 Javascript
js 单引号替换成双引号,双引号替换成单引号的实现方法
Feb 16 Javascript
AngularJS2中一种button切换效果的实现方法(二)
Mar 27 Javascript
vue数字类型过滤器的示例代码
Sep 07 Javascript
原生js实现Flappy Bird小游戏
Dec 24 Javascript
JavaScript中0、空字符串、'0'是true还是false的知识点分享
Sep 16 Javascript
Nest.js环境变量配置与序列化详解
Feb 21 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
在PHP中使用curl_init函数的说明
2010/11/02 PHP
浅析PHP中的字符串编码转换(自动识别原编码)
2013/07/02 PHP
PHP 记录访客的浏览信息方法
2018/01/29 PHP
golang实现php里的serialize()和unserialize()序列和反序列方法详解
2018/10/30 PHP
jQuery+slidereveal实现的面板滑动侧边展出效果
2015/03/14 Javascript
利用js实现禁止复制文本信息
2015/06/03 Javascript
JavaScript DOM 学习总结(五)
2015/11/24 Javascript
点评js异步加载的4种方式
2015/12/22 Javascript
基于jquery实现瀑布流布局
2020/06/28 Javascript
jQuery unbind()方法实例详解
2016/01/19 Javascript
详解.vue文件解析的实现
2018/06/11 Javascript
Angular resolve基础用法详解
2018/10/03 Javascript
layui的数据表格+springmvc实现搜索功能的例子
2019/09/28 Javascript
[42:48]完美世界DOTA2联赛PWL S3 Magma vs INK ICE 第二场 12.11
2020/12/16 DOTA
python实现斐波那契数列的方法示例
2017/01/12 Python
python操作MySQL 模拟简单银行转账操作
2017/09/27 Python
Django Web开发中django-debug-toolbar的配置以及使用
2018/05/06 Python
使用pandas将numpy中的数组数据保存到csv文件的方法
2018/06/14 Python
详解Django中间件执行顺序
2018/07/16 Python
Python的条件表达式和lambda表达式实例
2019/01/31 Python
详解Python打包分发工具setuptools
2019/08/05 Python
python3.7将代码打包成exe程序并添加图标的方法
2019/10/11 Python
Python如何实现感知器的逻辑电路
2020/12/25 Python
日本最新流行服饰网购:Nissen
2016/07/24 全球购物
自荐信包含哪些内容
2013/10/30 职场文书
中医专业应届生求职信
2013/11/17 职场文书
机关财务管理制度
2014/01/17 职场文书
文明班集体申报材料
2014/05/23 职场文书
2015年助理工程师工作总结
2015/04/03 职场文书
单位更名证明
2015/06/18 职场文书
2019年大学生职业生涯规划书
2019/03/25 职场文书
MySQL 使用索引扫描进行排序
2021/06/20 MySQL
Java并发编程必备之Future机制
2021/06/30 Java/Android
Nginx性能优化之Gzip压缩设置详解(最大程度提高页面打开速度)
2022/02/12 Servers
PyTorch中的torch.cat简单介绍
2022/03/17 Python
windows server 2012安装FTP并配置被动模式指定开放端口
2022/06/10 Servers