JS运动特效之同时运动实现方法分析

作者:竹影

时间:2026-10-22

浏览:225

本文详解JavaScript中实现多属性同时运动的框架修改方法。通过引入JSON对象替代单一属性参数,利用for...in循环遍历目标值,使物体宽高与透明度可同步变化,解决了链式运动的局限。

文章目录

同时运动需求与JSON引入

本文详细介绍JavaScript中实现多属性同时运动的特效方法,旨在为开发者提供实用的参考案例。

本内容基于前文《JS运动特效之链式运动》进行延伸探讨。

在前一篇介绍的运动框架中,我们已经能够完美实现物体先改变宽度、再改变高度、最后调整透明度的顺序运动效果,看似功能完备。

虽然看起来可以稍作休息,但老板突然要求同时改变一个物体的宽度、高度和透明度,这让人倍感压力。

尝试使用之前的运动框架发现,无法让div同时实现变宽、变高和改变透明度的效果。面对这一困境,我们引入了JSON对象来解决这个问题,不熟悉JSON的读者可以参考相关资料了解其用法。


function startMove(obj,attr,iTarget,fn)

框架修改:从单一属性到JSON对象

在之前的startMove()函数中,我们通常传入一个attr属性和一个iTarget目标值。引入JSON后,我们可以将属性和对应的目标值成对放入JSON对象中,然后在startMove函数中只传入这个JSON对象,从而替代原来的attr和iTarget参数。

例如,若要同时改变宽度、高度和透明度,可以构建如下JSON对象:{width:300,height:300,opacity:30}。

接着,使用for...in循环遍历该JSON对象以获取相应的属性和值。那么,在运动框架程序中应如何具体修改呢?

首先通过一个简单的测试来说明JSON的使用方式。


<script>
  var json = {width:200,height:300,opacity:30};
  for(attr in json){
    alert("属性是:" + attr+ "--目标值"+json[attr]);
  }
</script>

同时运动需求与JSON引入

从上述弹出结果可以看出,JSON中的width、height、opacity对应的是属性名称,而200、300、30对应的则是目标值。遍历该JSON对象时,可以看出attr对应的是各个属性名,而json[attr]对应的是各个目标值。理解这一点后,修改框架的思路便清晰了。

代码实现与测试

1. 首先修改function startMove(obj,attr,iTarget,fn)中的startMove函数,移除原有的attr和iTarget参数,改为传入一个json对象。


function startMove(obj,json,fn)

2. 接着在定时器内部遍历该JSON对象,以确定哪些属性需要发生变化。


function startMove(obj,json,fn) {//fn:执行下一个运动的函数
      clearInterval(obj.timer);
      obj.timer = setInterval(function () {
       for(key in json){
        //... 用key代替之前传入的属性,json[atrr]代替之前的目标值
    // 也就是把之前startMove函数里的attr改写成key,iTarget改写成json[atrr]
    // 但是为了方便虽好把for in里的key的名字直接改写成attr就好了,for(attr in json)这样就不要一个个去改写startMove里的attr,省事
       }
      },30);
}

完整的测试代码如下:

HTML部分:


<div id="div1"></div>

CSS部分:


<style>
    #div1{
      width: 200px;height: 200px;
      background: green;
    }
</style>

JS部分:


<script>
    window.onload = function(){
      var oDiv = document.getElementById('div1');
      oDiv.onmouseover = function () {
        startMove(oDiv,{width:300,height:300,opacity:30});
      }
      oDiv.onmouseout = function () {
        startMove(oDiv,{width:200,height:200,opacity:100});
      }
    }
    function getStyle(obj,attr){
      return getComputedStyle ? getComputedStyle(obj,false)[attr] : obj.currentStyle[attr];
    }
    function startMove(obj,json,fn) {//json代替了原来的attr和iTarger参数
      clearInterval(obj.timer);
      obj.timer = setInterval(function () {
       for(attr in json){
         var objAttr = 0;
         if(attr == "opacity"){ // 由于for in里的key名字是attr所以这里不用替换
           objAttr = Math.round(parseFloat(getStyle(obj,attr))*100);
         }else{
           objAttr = parseInt(getStyle(obj,attr));
         }
         var iSpeed = (json[attr] -objAttr)/10;// 由之前的iTarget替换成了json[attr]
         iSpeed = iSpeed>0 ?Math.ceil(iSpeed):Math.floor(iSpeed);
         if(objAttr == json[attr]){
           clearInterval(obj.timer);
           if(fn){// 如果传了 “下一个运动的函数” 就执行
             fn();
           }
         }else{
           if(attr == "opacity"){
             obj.style.filter = 'alpha(opacity:'+(objAttr+iSpeed)+')';
             obj.style.opacity = (objAttr+iSpeed)/100;
           }else{
             obj.style[attr] = objAttr+iSpeed+'px';
           }
         }
       }
      },30);
    }
</script>

同时运动需求与JSON引入

至此,我们的运动框架已近乎完美,但还存在一个小问题,具体是什么将在后续内容中继续探讨。

更多关于JavaScript相关内容感兴趣的读者可查看本站专题:《JavaScript运动效果与技巧汇总》、《JavaScript切换特效与技巧总结》、《JavaScript查找算法技巧总结》、《JavaScript动画特效与技巧汇总》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》、《JavaScript遍历算法与技巧总结》及《JavaScript数学运算用法总结》

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

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章