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 相关文章推荐
仅IE6/7/8中innerHTML返回值忽略英文空格的问题
Apr 07 Javascript
js获取日期:昨天今天和明天、后天
Jun 11 Javascript
JavaScript中创建字典对象(dictionary)实例
Mar 31 Javascript
javascript实现漂亮的拖动层,窗口拖拽特效
Apr 24 Javascript
jQuery插件Slider Revolution实现响应动画滑动图片切换效果
Jun 05 Javascript
javascript:void(0)点击登录没反应怎么解决
Nov 13 Javascript
jQuery通过写入cookie实现更换网页背景的方法
Apr 15 Javascript
Vue.js实现移动端短信验证码功能
Mar 29 Javascript
js学习总结之DOM2兼容处理this问题的解决方法
Jul 27 Javascript
对node.js中render和send的用法详解
May 14 Javascript
解决layui laydate 时间控件一闪而过的问题
Sep 28 Javascript
基于aotu.js实现微信自动添加通讯录中的联系人功能
May 28 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&mysql(四)
2006/10/09 PHP
PHP面向对象编程快速入门
2006/12/14 PHP
Laravel 中获取上一篇和下一篇数据
2015/07/27 PHP
Yii2框架dropDownList下拉菜单用法实例分析
2016/07/18 PHP
PHP云打印类完整示例
2016/10/15 PHP
php 使用curl模拟ip和来源进行访问的实现方法
2017/05/02 PHP
thinkphp ajaxfileupload实现异步上传图片的示例
2017/08/28 PHP
jquery tools 系列 scrollable(2)
2009/09/06 Javascript
网页禁用右键实现代码(JavaScript代码)
2009/10/29 Javascript
JS实现双击编辑可修改状态的方法
2015/08/14 Javascript
javascript下拉列表中显示树形菜单的实现方法
2015/11/17 Javascript
vue的props实现子组件随父组件一起变化
2016/10/27 Javascript
JS定时检测任务任务完成后执行下一步的解决办法
2016/12/22 Javascript
详解JS去重及字符串奇数位小写转大写
2016/12/29 Javascript
javascript html5轻松实现拖动功能
2017/03/01 Javascript
基于BootStrap multiselect.js实现的下拉框联动效果
2017/07/28 Javascript
浅析Node.js非对称加密方法
2018/01/29 Javascript
在Vue中使用HOC模式的实现
2020/08/23 Javascript
Python中AND、OR的一个使用小技巧
2015/02/18 Python
Python中利用sorted()函数排序的简单教程
2015/04/27 Python
python遍历序列enumerate函数浅析
2017/10/17 Python
在cmd中运行.py文件: python的操作步骤
2018/05/12 Python
Python多进程池 multiprocessing Pool用法示例
2018/09/07 Python
利用Python将文本中的中英文分离方法
2018/10/31 Python
Python 函数list&read&seek详解
2019/08/28 Python
已安装tensorflow-gpu,但keras无法使用GPU加速的解决
2020/02/07 Python
如何利用pycharm进行代码更新比较
2020/11/04 Python
CSMA/CD介质访问控制协议
2015/11/17 面试题
C#软件工程师英语面试题
2015/06/07 面试题
客户代表实习人员自我鉴定
2013/09/27 职场文书
素食餐饮项目创业计划书
2014/02/02 职场文书
2014学雷锋活动总结
2014/03/09 职场文书
融资合作协议书范本
2014/10/17 职场文书
九年级语文教学反思
2016/03/03 职场文书
Mysql服务添加 iptables防火墙策略的方案
2021/04/29 MySQL
Mysql 文件配置解析介绍
2022/05/06 MySQL