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 相关文章推荐
ppk谈JavaScript style属性
Oct 10 Javascript
IE不支持getElementsByClassName最终完美解决方案
Dec 17 Javascript
页面js遇到乱码问题的解决方法是和无法转码的情况
Apr 30 Javascript
js实现下拉框选择要显示图片的方法
Feb 16 Javascript
JavaScript实现自动消除按钮功能的方法
Aug 05 Javascript
基于JavaScript代码实现微信扫一扫下载APP
Dec 30 Javascript
解析AngularJS中get请求URL出现的跨域问题
Dec 01 Javascript
JavaScript创建对象的常用方式总结
Aug 10 Javascript
Javascript实现动态时钟效果
Nov 17 Javascript
Vue 实例事件简单示例
Sep 19 Javascript
JS删除对象中某一属性案例详解
Sep 08 Javascript
基于Vant UI框架实现时间段选择器
Dec 24 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 命令行参数详解及应用
2011/05/18 PHP
讲解WordPress开发中一些常用的debug技巧
2015/12/18 PHP
js word表格动态添加代码
2010/06/07 Javascript
利用JQuery动画制作滑动菜单项效果实现步骤及代码
2013/02/07 Javascript
如何使用jQUery获取选中radio对应的值(一句代码)
2013/06/03 Javascript
javascript动态设置样式style实例分析
2015/05/13 Javascript
js弹出对话框方式小结
2015/11/17 Javascript
理解js回收机制通俗易懂版
2016/02/29 Javascript
jquery点击展示与隐藏更多内容
2016/12/03 Javascript
jQuery自定义插件详解及实例代码
2016/12/29 Javascript
bootstrap datetimepicker日期插件超详细使用方法介绍
2017/02/23 Javascript
JavaScript 异步调用
2017/10/25 Javascript
4个顶级JavaScript高级文本编辑器
2018/10/10 Javascript
微信小程序swiper禁止用户手动滑动代码实例
2019/08/23 Javascript
微信小程序实现图片翻转效果的实例代码
2019/09/20 Javascript
JS自定义右键菜单实现代码解析
2020/07/16 Javascript
Vue-cli4 配置 element-ui 按需引入操作
2020/09/11 Javascript
Python 列表list使用介绍
2014/11/30 Python
Python中pip安装非PyPI官网第三方库的方法
2015/06/02 Python
python简单获取本机计算机名和IP地址的方法
2015/06/03 Python
python实现图像识别功能
2018/01/29 Python
django-allauth入门学习和使用详解
2019/07/03 Python
python实现文件批量编码转换及注意事项
2019/10/14 Python
CSS3 绘制BMW logo实的现代码
2013/04/25 HTML / CSS
使用Html5中的cavas画一面国旗
2019/09/25 HTML / CSS
世界第一曲奇连锁店:Mrs. Fields Cookies
2017/02/04 全球购物
美国最流行的男士时尚网站:Touch of Modern
2018/02/05 全球购物
英国网上电器商店:Electricshop
2020/03/15 全球购物
视图的作用
2014/12/19 面试题
物流专业大学生求职信范文
2013/10/28 职场文书
初中生个人学习的自我评价
2013/12/04 职场文书
党在我心中演讲稿
2014/09/02 职场文书
读《瓦尔登湖》有感:每个人都需要一个瓦尔登湖
2019/10/17 职场文书
多表查询、事务、DCL
2021/04/05 MySQL
Redis如何实现验证码发送 以及限制每日发送次数
2022/04/18 Redis
海康机器人重磅发布全新算法开发平台VM4.2
2022/04/21 数码科技