网络编程
位置:首页>> 网络编程>> JavaScript>> JavaScript缓动动画函数的封装方法

JavaScript缓动动画函数的封装方法

作者:kuke_kuke  发布时间:2023-08-07 10:48:26 

标签:js,缓动动画

本文实例为大家分享了JavaScript缓动动画函数的封装代码,供大家参考,具体内容如下

本文将从封装缓动动画的以下几个部分进行封装(1、单个属性,2、多个属性,3、缓动框架之回调函数,4、缓动框架之层级与透明度)

首先:获取元素样式的兼容方式

function getStyle(ele,attr){      //获取任意类型的CSS样式的属性值
 if(window.getComputedStyle){    
   return window.getComputedStyle(ele,null)[attr];
 }
 return ele.currentStyle[attr];
}

封装单个属性

function animate(ele,attr,target){   //元素(box) 样式(left) 目标值(400)
 clearInterval(ele.timer);     //使用定时器时,先清除定时器,防止多个定时器并行
 ele.timer = setInterval(function(){
   //先定义一个当前值
   var leader = parseInt(getStyle(ele,attr)) || 0;   //当这个样式为空时设置为0,获取来的样式值要取整。
   var step = (target - leader)/10;
   step = step > 0 ? Math.ceil(step) : Math.floor(step);
   leader = leader + step;
   ele.style[attr] = leader + "px";     //注意设置元素样式,注意加单位
   if(Math.abs(target-leader) <= Math.abs(step)){
     ele.style[attr] = target + "px";
     clearInterval(ele.timer);
   }
 },25);
}

封装多个属性


function animate(ele,json){   //把样式和目标值放在json中,如:var json = {"left":10,"top":200,"width":300,"height":200}  
 clearInterval(ele.timer);
 ele.timer = setInterval(function(){
   //开闭原则,目的保证所有样式都到达目标值
   var bool = true;
   // 分别单独处理json;
   for(k in json){
     var attr = k;  //这里的k即上文中的样式
     var target = json[k];  //这里的json[k]即上文中的目标值,熟练后直接写k,json[k]。
     var leader = parseInt(getStyle(ele,attr)) || 0;
     var step = (target - leader) / 10;
     step = step > 0 ? Math.ceil(step) : Math.floor(step);
     leader = leader + step;
     ele.style[attr] = leader + "px";
//如果使用上文中清除定时器的方式,则完成了一个json内容就清除了定时器,显然不能这么做
     // if(Math.abs(target - leader) <= Math.abs(step)){
       // ele.style[attr] = target + "px";
       // clearInterval(ele.timer);
     // }
     if(target !== leader){  //依据上文定义的bool,遍历json时当有一个样式未完成,则bool值依旧为false。
       bool = false;
     }
   }
//只有所有属性样式都到了指定位置,bool值才变成true
   if(bool){  
     clearInterval(ele.timer);
   }
 },25);      
}

缓动框架之回调函数


function animate(ele,json,fn){
   clearInterval(ele.timer);
   ele.timer = setInterval(function(){
       var bool = true;
       for(k in json){      
           var leader = parseInt(getStyle(ele,k)) || 0;  
           var step = (json[k] - leader) / 10;
           step = step > 0 ? Math.ceil(step) : Math.floor(step);
           leader = leader + step;
           ele.style[k] = leader + "px";
           if(json[k] !== leader){
               bool = false;
           }
       }
       if(bool){
           clearInterval(ele.timer);
           if(fn){     //此处如果有函数,则掉用,如果没有则自动不执行,当然也可加个判断,if(typeof fn == "function"),当fn类型为函数时。
               fn();
           }
       }
   },25);
}
//调用
animate(box,json,function(){      //这里的function是一整个函数体,所以上文中的fn要加();
   animate(box,json1,function(){     //当执行完第一个缓动动画时,有function则继续执行。
       animate(box,json);
   });
});

缓动框架之层级与透明度


function animate(ele,json,fn){
 clearInterval(ele.timer);
 ele.timer = setInterval(function(){
   var bool = true;
   for(k in json){
     var leader;
     if(k === "opacity"){   //如果属性为opacity
       leader = getStyle(ele,k) * 100 || 1;  //不能取整,先把它乘100
     }else{
       leader = parseInt(getStyle(ele,k)) || 0;  
     }          
     var step = (json[k] - leader) / 10;
     step = step > 0 ? Math.ceil(step) : Math.floor(step);
     leader = leader + step;
     if(k === "opacity"){
       ele.style[k] = leader/100;   //如果是opacity,赋值时在除以100
       ele.style.filter = "alpha(opacity="+leader+")";   //兼容IE
     }else if(k === "zIndex"){
       ele.style[k] = leader;   //直接赋值就是了,不用加单位
     }else{
       ele.style[k] = leader + "px";
     }
     if(json[k] !== leader){
       bool = false;
       console.log(leader);
     }
   }
   if(bool){
     clearInterval(ele.timer);
     if(fn){
       fn();
     }
   }
 },30);
}
**//注意这里赋值的opacity要乘以100,如:30,100等**

来源:https://blog.csdn.net/qq_33599109/article/details/77257182

0
投稿

猜你喜欢

手机版 网络编程 asp之家 www.aspxhome.com