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 相关文章推荐
javascript 基础篇1 什么是js 建立第一个js程序
Mar 14 Javascript
当前页禁止复制粘贴截屏代码小集
Jul 24 Javascript
js文本框输入点回车触发确定兼容IE、FF等
Nov 19 Javascript
Javascript实现检测客户端类型代码封包
Dec 03 Javascript
学习JavaScript设计模式(代理模式)
Dec 03 Javascript
ui组件之input多选下拉实现方法(带有搜索功能)
Jul 14 Javascript
vue-cli如何快速构建vue项目
Apr 26 Javascript
详解vue2.0 使用动态组件实现 Tab 标签页切换效果(vue-cli)
Aug 30 Javascript
Vue-Router2.X多种路由实现方式总结
Feb 09 Javascript
vue路由导航守卫和请求拦截以及基于node的token认证的方法
Apr 07 Javascript
JavaScript实现的开关灯泡点击切换特效示例
Jul 08 Javascript
微信小程序 Storage更新详解
Jul 16 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
打造计数器DIY三步曲(下)
2006/10/09 PHP
JS创建优美的页面滑动块效果 - Glider.js
2007/09/27 Javascript
DOM下的节点属性和操作小结
2009/05/14 Javascript
Jquery作者John Resig自己封装的javascript 常用函数
2009/11/09 Javascript
让IE6支持min-width和max-width的方法
2010/06/25 Javascript
JS文本框默认值处理详解
2013/07/10 Javascript
关于js数组去重的问题小结
2014/01/24 Javascript
在jquery中的ajax方法怎样通过JSONP进行远程调用
2014/04/04 Javascript
Javascript 多物体运动的实现
2014/12/24 Javascript
AngualrJS中的Directive制作一个菜单
2016/01/26 Javascript
基于jQuery实现Ajax验证用户名是否存在实例
2016/03/30 Javascript
javascript用正则表达式过滤空格的实现代码
2016/06/14 Javascript
js实现前端分页页码管理
2017/01/06 Javascript
ExtJs异步无法向外传值和赋值的完美解决办法
2017/06/14 Javascript
Vue源码学习之初始化模块init.js解析
2017/11/02 Javascript
react配合antd组件实现的管理系统示例代码
2018/04/24 Javascript
Vue.js 2.x之组件的定义和注册图文详解
2018/06/19 Javascript
JavaScript实现邮箱后缀提示功能的示例代码
2018/12/13 Javascript
详解element上传组件before-remove钩子问题解决
2020/04/08 Javascript
[52:20]VP vs VG Supermajor小组赛 B组胜者组决赛 BO3 第一场 6.2
2018/06/03 DOTA
把MySQL表结构映射为Python中的对象的教程
2015/04/07 Python
Python中.py文件打包成exe可执行文件详解
2017/03/22 Python
python2.7到3.x迁移指南
2018/02/01 Python
django2+uwsgi+nginx上线部署到服务器Ubuntu16.04
2018/06/26 Python
使用selenium模拟登录解决滑块验证问题的实现
2019/05/10 Python
美国畅销的跑步机品牌:ProForm
2017/02/06 全球购物
一套软件开发工程师笔试题
2015/05/18 面试题
善意的谎言事例
2014/02/15 职场文书
模特职业生涯规划范文
2014/02/26 职场文书
2014年国庆节活动总结
2014/08/26 职场文书
庆元旦演讲稿
2014/09/15 职场文书
应聘教师求职信范文
2015/03/20 职场文书
暖春观后感
2015/06/08 职场文书
幼儿园亲子活动感想
2015/08/07 职场文书
新年寄语2016
2015/08/17 职场文书
css3带你实现3D转换效果
2022/02/24 HTML / CSS