JavaScript实现带缓动效果的动画对象:加速、减速与淡入淡出

作者:窗边听雨时间:2026-10-26 20:23:27浏览:298

本文介绍了一个轻量级的JavaScript动画对象实现,支持对HTML元素属性进行动态修改。通过封装attribute读写接口和tween缓动算法,该对象支持easeIn(缓入)和easeOut(缓出)两种运动方式。代码展示了如何计算起始与终止位置,利用setTimeout实现帧率控制,并可配置动画持续时间及完成回调,适用于产品图片切换等场景。

动画对象接口定义与调用方式

接口调用说明:


代码示例如下:

 
/** 
* @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属性读写与缓动算法实现

代码示例如下:

 
//辅助对象,读/写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
作者最新文章