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的实现简单的表格中增加或删除下一行
Aug 01 Javascript
分别用marquee和div+js实现首尾相连循环滚动效果,仅3行代码
Sep 21 Javascript
js中prototype用法详细介绍
Nov 14 Javascript
JS获取html对象的几种方式介绍
Dec 05 Javascript
JavaScript中Math对象方法使用概述
Jan 02 Javascript
js中settimeout方法加参数
Feb 28 Javascript
JavaScript中Boolean对象的属性解析
Oct 21 Javascript
jQuery操作属性和样式详解
Apr 13 Javascript
Element UI 自定义正则表达式验证方法
Sep 04 Javascript
解决vue-cli webpack打包开启Gzip 报错问题
Jul 24 Javascript
layer ui 导入文件之前传入数据的实例
Sep 23 Javascript
vue请求服务器数据后绑定不上的解决方法
Oct 30 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中操作Excel实例代码
2010/04/29 PHP
PHP 基于文件头的文件类型验证类函数
2012/05/01 PHP
php中静态类与静态变量用法的区别分析
2015/01/15 PHP
php编译安装php-amq扩展简明教程
2016/06/25 PHP
php实现的二分查找算法示例
2017/06/20 PHP
Laravel框架文件上传功能实现方法示例
2019/04/16 PHP
php使用redis的几种常见操作方式和用法示例
2020/02/20 PHP
mapper--图片热点区域高亮组件官方站点
2007/12/22 Javascript
jQuery 打造动态渐变按钮 详细图文教程
2010/04/25 Javascript
jquery简单的拖动效果实现原理及示例
2013/07/26 Javascript
js获取数组的最后一个元素
2015/04/14 Javascript
jQuery实现下拉框功能实例代码
2016/05/06 Javascript
js和jQuery设置Opacity半透明 兼容IE6
2016/05/24 Javascript
js传值后台中文出现乱码的解决方法
2016/06/30 Javascript
Vue.js第三天学习笔记(计算属性computed)
2016/12/01 Javascript
探讨跨域请求资源的几种方式(总结)
2016/12/02 Javascript
原生js实现弹出层效果
2017/01/20 Javascript
从零学习node.js之express入门(六)
2017/02/25 Javascript
JavaScript正则替换HTML标签功能示例
2017/03/02 Javascript
微信小程序dom操作的替代思路实例分析
2018/12/06 Javascript
vue + typescript + video.js实现 流媒体播放 视频监控功能
2019/07/07 Javascript
python 环境变量和import模块导入方法(详解)
2017/07/11 Python
python实现淘宝秒杀聚划算抢购自动提醒源码
2020/06/23 Python
python 实现登录网页的操作方法
2018/05/11 Python
pandas dataframe添加表格框线输出的方法
2019/02/08 Python
pytorch GAN生成对抗网络实例
2020/01/10 Python
python数据库操作mysql:pymysql、sqlalchemy常见用法详解
2020/03/30 Python
动态设置django的model field的默认值操作步骤
2020/03/30 Python
Python tempfile模块生成临时文件和临时目录
2020/09/30 Python
10个示例带你掌握python中的元组
2020/11/23 Python
大学新生军训自我鉴定
2014/09/18 职场文书
司法局群众路线教育实践活动开展情况总结
2014/10/25 职场文书
教你漂亮打印Pandas DataFrames和Series
2021/05/29 Python
pandas数值排序的实现实例
2021/07/25 Python
MySQL利用UNION连接2个查询排序失效详解
2021/11/20 MySQL
RestTemplate如何通过HTTP Basic Auth认证示例说明
2022/03/17 Java/Android