JS高级运动实例分析

 更新时间:2016年12月20日 10:50:52   作者:鬼畜十三  
这篇文章主要介绍了JS高级运动,结合实例形式分析了javascript运动框架原理、实现与应用技巧,需要的朋友可以参考下

本文实例分析了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切换特效与技巧总结》、《JavaScript查找算法技巧总结》、《JavaScript动画特效与技巧汇总》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》、《JavaScript遍历算法与技巧总结》及《JavaScript数学运算用法总结

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

相关文章

  • 不错的用resizeTo和moveTo两个函数实现窗口的“打乒乓球”效果

    不错的用resizeTo和moveTo两个函数实现窗口的“打乒乓球”效果

    不错的用resizeTo和moveTo两个函数实现窗口的“打乒乓球”效果...
    2007-08-08
  • js实现登录拖拽窗口

    js实现登录拖拽窗口

    这篇文章主要为大家详细介绍了js实现登录拖拽窗口,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-02-02
  • 详解JavaScript Alert函数执行顺序问题

    详解JavaScript Alert函数执行顺序问题

    本文主要介绍了Javascript的Alert函数执行顺序问题,对此感兴趣的同学,可以实验一下,以便解决平时遇到的一些奇怪的问题。
    2021-05-05
  • JavaScript命名约定的最佳实践指南

    JavaScript命名约定的最佳实践指南

    js命名应遵循简洁、语义化的原则,下面这篇文章主要给大家介绍了关于JavaScript命名约定的最佳实践指南,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2022-03-03
  • js获得页面的高度和宽度的方法

    js获得页面的高度和宽度的方法

    做一个弹出dialog时用到了取父页面的宽度和高度的方法,需要的朋友可以参考下
    2014-02-02
  • javaScript中indexOf用法技巧

    javaScript中indexOf用法技巧

    在本篇文章里小编给大家整理的是一篇关于javaScript中indexOf用法技巧的相关文章,有需要的朋友们学习下。
    2019-11-11
  • eclipse如何忽略js文件报错(附图)

    eclipse如何忽略js文件报错(附图)

    eclipse中js文件报错的情况,或许大家早已习以为常了,那么有什么好的方法可以将其忽略掉呢?如果你也在寻找此问题,那么本文或许可以帮助到你
    2013-10-10
  • 学习javascript的闭包,原型,和匿名函数之旅

    学习javascript的闭包,原型,和匿名函数之旅

    Javascript中有几个非常重要的语言特性——对象、原型继承、闭包。其中闭包 对于那些使用传统静态语言C/C++的程序员来说是一个新的语言特性,本文给大家介绍js的闭包,原型,和匿名函数之旅,感兴趣的朋友一起学习吧
    2015-10-10
  • 如何使用big.js解决JavaScript浮点数精度丢失问题

    如何使用big.js解决JavaScript浮点数精度丢失问题

    最近在项目中涉及到金额从元转为分(乘100即可),发现乘法居然也会有精度丢失的问题,关于浮点数计算精度丢失是很多语言都存在的问题,本文给大家分享使用big.js解决JavaScript浮点数精度丢失问题,感兴趣的朋友一起看看吧
    2023-12-12
  • 一文详解Vue中插槽的具体使用

    一文详解Vue中插槽的具体使用

    Vue的插槽(Slot)是一种可以让父组件向子组件传递内容的机制,这篇文章主要通过一些简单的示例为大家介绍了插槽的具体使用,感兴趣的小伙伴可以了解一下
    2023-06-06

最新评论