免费商城小程序怎么做_JavaScript缓动动画函数的封

2021-01-04 17:56

JavaScript缓动动画函数的封装方法       这篇文章主要为大家详细介绍了JavaScript缓动动画函数的封装方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了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等**

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持凡科。




扫描二维码分享到微信

在线咨询
联系电话

020-66889888