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 相关文章推荐
HTML中不支持静态Expando的元素的问题
Mar 08 Javascript
减少访问DOM的次数提升javascript性能
Feb 24 Javascript
jQuery之字体大小的设置方法
Feb 27 Javascript
JS中使用Array函数shift和pop创建可忽略参数的例子
May 28 Javascript
jQuery中scrollLeft()方法用法实例
Jan 16 Javascript
jQuery实现hover合成事件的方法
Aug 06 Javascript
AngularJS基础 ng-dblclick 指令用法
Aug 01 Javascript
Bootstrap实现渐变顶部固定自适应导航栏
Aug 27 Javascript
微信小程序实现图片预览功能
Jan 31 Javascript
js replace 全局替换的操作方法
Jun 12 Javascript
vue鼠标悬停事件实例详解
Apr 01 Javascript
vue操作dom元素的3种方法示例
Sep 20 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
安健A254立体声随身听的分析与打磨
2021/03/02 无线电
sae使用smarty模板的方法
2013/12/17 PHP
php 利用array_slice函数获取随机数组或前几条数据
2015/09/30 PHP
如何使用GDB调试PHP程序
2015/12/08 PHP
PHP模板引擎Smarty中变量的使用方法示例
2016/04/11 PHP
JS 自动安装exe程序
2008/11/30 Javascript
JavaScript中对象介绍
2014/12/31 Javascript
javascript实现label标签跳出循环操作
2016/03/06 Javascript
Linux下为Node.js程序配置MySQL或Oracle数据库的方法
2016/03/19 Javascript
DOM 事件的深入浅出(二)
2016/12/05 Javascript
微信小程序组件 contact-button(客服会话按钮)详解及实例代码
2017/01/10 Javascript
原生JS实现导航下拉菜单效果
2020/11/25 Javascript
Require.JS中的几种define定义方式示例
2017/06/01 Javascript
vue中Axios的封装与API接口的管理详解
2018/08/09 Javascript
Python中subprocess模块用法实例详解
2015/05/20 Python
python 实现tar文件压缩解压的实例详解
2017/08/20 Python
Tensorflow的可视化工具Tensorboard的初步使用详解
2018/02/11 Python
Python 记录日志的灵活性和可配置性介绍
2018/02/27 Python
python leetcode 字符串相乘实例详解
2018/09/03 Python
Python根据成绩分析系统浅析
2019/02/11 Python
Python基础之文件读取的讲解
2019/02/16 Python
python使用Paramiko模块实现远程文件拷贝
2019/04/30 Python
python opencv 图像拼接的实现方法
2019/06/27 Python
Python 分享10个PyCharm技巧
2019/07/13 Python
在django模板中实现超链接配置
2019/08/21 Python
在OpenCV里使用特征匹配和单映射变换的代码详解
2019/10/23 Python
详解torch.Tensor的4种乘法
2020/09/03 Python
python+excel接口自动化获取token并作为请求参数进行传参操作
2020/11/10 Python
Python基于Socket实现简易多人聊天室的示例代码
2020/11/29 Python
美国专业汽车音响和移动电子产品零售商:Car Toys
2019/05/13 全球购物
手工制作的男士奢华英国鞋和服装之家:Goodwin Smith
2019/06/21 全球购物
求职自荐信范文格式
2013/11/29 职场文书
幼教毕业生自我鉴定
2014/01/12 职场文书
学习走群众路线心得体会
2014/11/05 职场文书
如何有效防止sql注入的方法
2021/05/25 SQL Server
Win10多屏显示如何设置?Win10电脑多屏显示设置操作方法
2022/07/07 数码科技