JavaScript链式与多物体运动框架实现解析

作者:函数茶馆时间:2026-10-21 18:37:28浏览:632

本文深入解析JavaScript高级运动框架,涵盖链式运动与多物体运动的实现原理。通过对比传统缺陷与for...in遍历的应用,详细演示如何改进多物体运动框架,解决属性同步更新及定时器过早停止的问题,提供完整的代码逻辑与优化方案。

本文通过具体实例解析JavaScript高级运动效果的实现机制,旨在为开发者提供可参考的代码实现与优化思路。

链式运动框架实现

一、链式运动框架

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,当宽度到达103时,即使高度尚未达到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程序设计有所帮助。

作者最新文章