zoukankan      html  css  js  c++  java
  • javascript动画对象支持加速、减速、缓入、缓出

    调用接口:
    /**
     * @param elem {HTMLElement} 执行动画的HTML元素
     * @param params {JSON} 动画执行过过程中需要修改的HTML属性
     * @param duration {Number} 可选,动画执行时间,单位毫秒
     * @param easing {String} 可选,动画执行的方式,缓入easeIn、缓出easeOut
     * @param callback {Function} 可选,动画执行完成时的回调函数
     * @return 
     */
    effect.animate(elem, params, duration, easing, callback);
    

    使用它用不了20行代码就可以做一个产品图片减速淡出、加速淡入的切换效果点击这里查看演示效果

     

    //辅助对象,读/写DOM元素属性
    var attribute = {
    	
    	get: function(elem, attr){
    		var val;	
    		if(elem.currentStyle){
    			if(attr === "opacity") {
                    val = elem.filters.alpha[attr];
                }else {
    				val = elem.currentStyle[attr];
    			}
    		}
    		else{
    			val = getComputedStyle(elem)[attr];
    			if(attr === "opacity") {
    				val = 100 *  val;
    			}
    		}
    
    		return val;
    	},
    	
    	set: function(elem, attr, val){
    		if(attr=='opacity'){
    			elem.style.filter = 'alpha(opacity='+ (val) +')';
    			elem.style.opacity = (val)/100;
    		}
    		else{
    			elem.style[attr] = val + 'px';
    		}
    	}
    };
    
    /*
     * 描述: tween动画算法。
     * @param Number t: 动画已经执行的时间(实际上时执行多少次/帧数)
     * @param Number b: 起始位置
     * @param Number c: 终止位置
     * @param Number d: 从起始位置到终止位置的经过时间(实际上时执行多少次/帧数)
     */
    var tween = {
    	
    	//缓入
    	easeIn: function (t, b, c, d){
    		return c * (t/=d) * t + b;
    	},
    	
    	//缓出
    	easeOut: function (t,b,c,d){
    		return -c * (t/=d) * (t-2) + b;
    	}
    	
    };
    
    //动画对象
    var effect = {
    	
    	animate: function(elem, params, duration, easing, callback){
    		
    		var dt = new Date().getTime(),
    			b = 0,
    			c = 0,
    			d = duration || 500,
    			fps = 1000/60;
    			
    		var changes = [];
    		
    		for(var attr in params){
    			b = parseFloat(attribute.get(elem, attr));
    			c = params[attr] - b;
    			
    			changes.push({
    			    
    				attr: attr,
    				
    				b: b,
    				
    				c: c
    			});
    		}
    		
    		easing = easing || "easeOut";
    		callback = callback || new Function;
    		setTimeout(function(){			
    			var t = new Date().getTime() - dt;
    			var b, c, attr;
    			for(var i=0; i<changes.length; i++){
    				b = changes[i].b;
    				c = changes[i].c;
    				attr = changes[i].attr;
    				
    				attribute.set(elem, attr, tween[easing](t, b, c, d));
    				if(d <= t){
    					attribute.set(elem, attr, params[attr]);
    					callback();
    					return;
    				}
    			}
    			
    			setTimeout(arguments.callee, fps);
    		}, fps);
    	}
    };
    //by rentj1@163.com
    

      

     

  • 相关阅读:
    【WPF】代码触发Button点击事件
    [WPF]静态资源(StaticResource)和动态资源(DynamicResource)
    stm32f103_arduino
    解除github下载的文件的锁定
    c# wpf binding
    mysql 使用可能遇到的问题
    c# progressbar
    STM32串口IAP(YModem) (转载)
    VS2017、VS2019安装包制作(转)
    八、ES集群搭建
  • 原文地址:https://www.cnblogs.com/rentj1/p/2708126.html
Copyright © 2011-2022 走看看