欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-04-29 12:13:59
本文实例讲述了js运动特效之同时运动实现方法。分享给大家供大家参考,具体如下: 接着上一篇 《js运动特效之链式运动》继续折腾 上一篇中我们的运动框架,可以完美的实现让...

本文实例讲述了js运动特效之同时运动实现方法。分享给大家供大家参考,具体如下:

接着上一篇 《js运动特效之链式运动》继续折腾

上一篇中我们的运动框架,可以完美的实现让一个物体先变宽,在变高,在变透明度.....,看似很完美了!

貌似可以喝喝茶看看美女了。但是老板突然说,让你同时改变一个物体的宽高和透明度,心碎了一地!!!

拿过之前的运动框架发现,无法实现让div同时又变宽,又变高,有变透明度!!最后无能为力,只好有请json大神出场了,不认识json的小伙伴们就找度娘问一下吧!

function startmove(obj,attr,itarget,fn)

之前的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>

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

有上面的弹出结果可以看出,json里的widht,height,opacity就是对应的属性名字,200,300,30对于的就是目标值,遍历这个json对象,可以看出attr就对应的是各个属性名,而json[attr]就对应各个目标值,看到这里应该就大概明白怎么修改了吧!

1. 首先function startmove(obj,attr,itarget,fn)中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>

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

到这里我们的运动框架几乎接近完美了,但是还有一个小问题,什么问题那?下回继续

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

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