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 相关文章推荐
javascript 读取XML数据,在页面中展现、编辑、保存的实现
Oct 27 Javascript
关于js中alert弹出窗口文本换行问题简单详细说明
Dec 11 Javascript
js Object2String方便查看js对象内容
Nov 24 Javascript
node.js中的buffer.fill方法使用说明
Dec 14 Javascript
angular分页指令操作
Jan 09 Javascript
react-native使用leanclound消息推送的方法
Aug 06 Javascript
小程序实现五星点评效果
Nov 03 Javascript
js实现贪吃蛇小游戏
Oct 29 Javascript
Vue export import 导入导出的多种方式与区别介绍
Feb 12 Javascript
基于javascript canvas实现五子棋游戏
Jul 08 Javascript
AJAX XMLHttpRequest对象创建使用详解
Aug 20 Javascript
JavaScript前后端JSON使用方法教程
Nov 23 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支持断点续传的源码
2010/05/16 PHP
Jquery替换已存在于element上的event的方法
2010/03/09 Javascript
JavaScript中通过闭包解决只能取得包含函数中任何变量最后一个值的问题
2010/08/12 Javascript
自己做的模拟模态对话框实现代码
2012/05/23 Javascript
form.submit()不能提交表单的原因分析
2014/10/23 Javascript
EasyUI中datagrid在ie下reload失败解决方案
2015/03/09 Javascript
JS实现自动定时切换的简洁网页选项卡效果
2015/10/13 Javascript
javascript 中的console.log和弹出窗口alert
2016/08/30 Javascript
BootStrap下拉菜单和滚动监听插件实现代码
2016/09/26 Javascript
vue实现点击图片放大效果
2017/08/15 Javascript
JS中跳出循环的示例代码
2017/09/14 Javascript
详解javascript常用工具类的封装
2018/01/30 Javascript
Vue-cli@3.0 插件系统简析
2018/09/05 Javascript
nodejs实现日志读取、日志查找及日志刷新的方法分析
2019/05/20 NodeJs
JS+canvas五子棋人机对战实现步骤详解
2020/06/04 Javascript
JS判断数组是否包含某元素实现方法汇总
2020/06/24 Javascript
Vue 解决通过this.$refs来获取DOM或者组件报错问题
2020/07/28 Javascript
maptalks+three.js+vue webpack实现二维地图上贴三维模型操作
2020/08/10 Javascript
Python 安装setuptools和pip工具操作方法(必看)
2017/05/22 Python
python实现八大排序算法(2)
2017/09/14 Python
Python使用matplotlib简单绘图示例
2018/02/01 Python
简单实现Python爬取网络图片
2018/04/01 Python
python opencv3实现人脸识别(windows)
2018/05/25 Python
pytorch中tensor的合并与截取方法
2018/07/26 Python
详解利用django中间件django.middleware.csrf.CsrfViewMiddleware防止csrf攻击
2018/10/09 Python
对python pandas 画移动平均线的方法详解
2018/11/28 Python
python中count函数简单用法
2020/01/05 Python
pytorch掉坑记录:model.eval的作用说明
2020/06/23 Python
python实现测试工具(一)——命令行发送get请求
2020/10/19 Python
Gloeilampgoedkoop荷兰:在线购买灯泡
2019/02/16 全球购物
应届专科生个人的自我评价
2014/01/05 职场文书
产品委托授权书范本
2014/09/16 职场文书
邀请函格式范文
2015/02/02 职场文书
Oracle笔记
2021/04/05 Oracle
python+pytest接口自动化之token关联登录的实现
2022/04/06 Python
SQL Server数据库查询出现阻塞之性能调优
2022/04/10 SQL Server