JS高级运动实例分析


Posted in Javascript onDecember 20, 2016

本文实例分析了JS高级运动。分享给大家供大家参考,具体如下:

一、链式运动框架

1.他需要一个回调函数,在运动停止时,开始下一次运动(执行函数)

多物体运动框架改为如下:

function startMove(obj,attr,iTarget,fn){
...
  if(iCur==iTarget){
    clearInterval(obj.timer);
    fn();
  }...
};

然后就可以用它,比如先变宽再变高最后变透明度

startMove(this,'width',300,function(){
  startMove(this,'height',300,function(){
    startMove(this,'opacity',100);
  });
});

二、完美运动框架

1.原本多物体运动框架的缺陷

比如要让他宽度高度同时变300,这样写:

startMove(this,'width',300);
startMove(this,'height',300);

问题:只有高度变300了(因为宽度准备运动时会开一个定时器,这个定时器还没开始运动前,执行高度变化的运动,就把之前的定时器关了)

2.for in

for(i=0;i<=arr.length;i++)和for(i in arr)效果一样

①什么时候用for什么时候用for...in呢?

数组:两个都可以用   Json:只能用for...in(因为Json下标没有规律,没有length可言)

对数组而言for...in循环不灵活,因为for循环可以从1可以从2等等任意数字开始,而for...in一循环就全部

②for in小应用

function setStyle(obj,attr,value){
  obj.style[attr]=value;
};
setStyle(oDiv,'width','300px');
setStyle(oDiv,'height','300px');
setStyle(oDiv,'background','green');

=====>

function setStyle(obj,json){
  var attr='';
  for(attr in json){
    obj.style[attr]=json[attr];
  }
};
setStyle(oDiv,{width:'300px',height:'300px',background:'green'});

③多物体运动框架改进

function startMove(obj,json,fn){
  clearInterval(obj.timer);
  obj.timer=setInterval(function(){
    for(var attr in json){
   if(attr=='opacity'){
        var iCur=parseInt(parseFloat(getStyle(obj,attr))*100);
      }
      else{
        var iCur=parseInt(getStyle(obj,attr));
      }
      var iSpeed=(json[attr]-iCur)/8;
      iSpeed=iSpeed>0?Math.ceil(iSpeed):Math.floor(iSpeed);
      if(iCur==json[attr]){
        clearInterval(obj.timer);
        if(fn){
         fn();  //有传函数这个参数才执行,不然会出错
        }
      }
      else{
        if(attr=='opacity'){
          obj.style.filter='alpha(opacity:'+(iCur+iSpeed)+')';
          obj.style.opacity=(iCur+iSpeed)/100;
        }
        else{
          obj.style[attr]=iCur+iSpeed+'px'
        }
      }
    }
  },30);
};

这样还有个问题

if(iCur==json[attr]){
  clearInterval(obj.timer);
}

只要json里有任一值到达目标,计时器就停止

比如我让宽度变到103,高度变到300,那高度到不了300就停止了

解决方案

function startMove(obj,json,fn){
  clearInterval(obj.timer);
  obj.timer=setInterval(function(){
    var bStop=true;  //先定义一个值,假设所有值都到了
    for(var attr in json){
   if(attr=='opacity'){
        var iCur=parseInt(parseFloat(getStyle(obj,attr))*100);
      }
      else{
        var iCur=parseInt(getStyle(obj,attr));
      }
      var iSpeed=(json[attr]-iCur)/8;
      iSpeed=iSpeed>0?Math.ceil(iSpeed):Math.floor(iSpeed);
      if(iCur!=json[attr]){
        bStop=false;    //并不是所有值都到了,就把bStop设成 false
      }
      if(attr=='opacity'){
        obj.style.filter='alpha(opacity:'+(iCur+iSpeed)+')';
        obj.style.opacity=(iCur+iSpeed)/100;
      }
      else{
        obj.style[attr]=iCur+iSpeed+'px'
      }
    }
    if(bStop){    //所有值都到了,关闭定时器
      clearInterval(obj.timer);
      if(fn){
        fn();  //有传函数这个参数才执行,不然会出错
      }
    }
  },30);
};

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
JS类的封装及实现代码
Dec 02 Javascript
JS去除数组重复值的五种不同方法
Sep 06 Javascript
JavaScript原生对象之Number对象的属性和方法详解
Mar 13 Javascript
JavaScript使用cookie记录临时访客信息的方法
Apr 07 Javascript
Javascript aop(面向切面编程)之around(环绕)分析
May 01 Javascript
jQuery中attr()与prop()函数用法实例详解(附用法区别)
Dec 29 Javascript
温习Javascript基础语法之词法结构
May 31 Javascript
JavaScript 函数模式详解及示例
Sep 07 Javascript
在 Angular 中使用Chart.js 和 ng2-charts的示例代码
Aug 17 Javascript
Vue学习之组件用法实例详解
Jan 06 Javascript
一百多行代码实现react拖拽hooks
Mar 23 Javascript
JavaScript 与 TypeScript之间的联系
Nov 27 Javascript
CSS+jQuery实现简单的折叠菜单
Dec 20 #Javascript
jQuery常见的选择器及用法介绍
Dec 20 #Javascript
JS基于面向对象实现的选项卡效果示例
Dec 20 #Javascript
解决Angular.Js与Django标签冲突的方案
Dec 20 #Javascript
AngularJS 在同一个界面启动多个ng-app应用模块详解
Dec 20 #Javascript
JS基于面向对象实现的拖拽功能示例
Dec 20 #Javascript
详解为Angular.js内置$http服务添加拦截器的方法
Dec 20 #Javascript
You might like
PHP define函数的使用说明
2008/08/27 PHP
php curl 登录163邮箱并抓取邮箱好友列表的代码(经测试)
2011/04/07 PHP
PHP下使用CURL方式POST数据至API接口的代码
2013/02/14 PHP
解析二进制流接口应用实例 pack、unpack、ord 函数使用方法
2013/06/18 PHP
解析php mysql 事务处理回滚操作(附实例)
2013/08/05 PHP
PHP判断表达式中括号是否匹配的简单实例
2016/10/22 PHP
PHP封装的验证码工具类定义与用法示例
2018/08/22 PHP
PHP实现长轮询消息实时推送功能代码实例讲解
2021/02/26 PHP
JS的递增/递减运算符和带操作的赋值运算符的等价式
2007/12/08 Javascript
jquery文字上下滚动的实现方法
2013/03/22 Javascript
如何实现修改密码时密码框显示保存到cookie的密码
2013/12/10 Javascript
js限制checkbox选中个数以限制六个为例
2014/07/15 Javascript
Javascript中For In语句用法实例
2015/05/14 Javascript
jQuery实现点击水纹波动动画
2016/04/10 Javascript
Knockoutjs 学习系列(二)花式捆绑
2016/06/07 Javascript
单行 JS 实现移动端金钱格式的输入规则
2017/05/22 Javascript
JavaScript正则表达式函数总结(常用)
2018/02/22 Javascript
react quill中图片上传由默认转成base64改成上传到服务器的方法
2019/10/30 Javascript
element-ui tree结构实现增删改自定义功能代码
2020/08/31 Javascript
Python中属性和描述符的正确使用
2016/08/23 Python
Django之Mode的外键自关联和引用未定义的Model方法
2018/12/15 Python
快速解决pyqt5窗体关闭后子线程不同时退出的问题
2019/06/19 Python
Django模板导入母版继承和自定义返回Html片段过程解析
2019/09/18 Python
python-numpy-指数分布实例详解
2019/12/07 Python
Python各种扩展名区别点整理
2020/02/27 Python
css实例教程 一款纯css3实现的超炫动画背画特效
2014/11/05 HTML / CSS
Michael Kors香港官网:美国奢侈品品牌
2019/12/26 全球购物
企业三严三实学习心得体会
2014/10/13 职场文书
2014年药品销售工作总结
2014/12/16 职场文书
2015年双拥工作总结
2015/04/08 职场文书
法院答辩状格式
2015/05/22 职场文书
优秀党员主要事迹材料
2015/11/04 职场文书
基于Redis延迟队列的实现代码
2021/05/13 Redis
Flask搭建一个API服务器的步骤
2021/05/28 Python
浅谈Java实现分布式事务的三种方案
2021/06/11 Java/Android
MySQL之select、distinct、limit的使用
2021/11/11 MySQL