javascript動(dòng)畫(huà)對(duì)象支持加速、減速、緩入、緩出的實(shí)現(xiàn)代碼
更新時(shí)間:2012年09月30日 21:01:29 作者:
javascript動(dòng)畫(huà)對(duì)象支持加速、減速、緩入、緩出的實(shí)現(xiàn)代碼,需要的朋友可以參考下
調(diào)用接口:
/**
* @param elem {HTMLElement} 執(zhí)行動(dòng)畫(huà)的HTML元素
* @param params {JSON} 動(dòng)畫(huà)執(zhí)行過(guò)過(guò)程中需要修改的HTML屬性
* @param duration {Number} 可選,動(dòng)畫(huà)執(zhí)行時(shí)間,單位毫秒
* @param easing {String} 可選,動(dòng)畫(huà)執(zhí)行的方式,緩入easeIn、緩出easeOut
* @param callback {Function} 可選,動(dòng)畫(huà)執(zhí)行完成時(shí)的回調(diào)函數(shù)
* @return
*/
effect.animate(elem, params, duration, easing, callback);
使用它用不了20行代碼就可以做一個(gè)產(chǎn)品圖片減速淡出、加速淡入的切換效果點(diǎn)擊這里查看演示效果
//輔助對(duì)象,讀/寫(xiě)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動(dòng)畫(huà)算法。
* @param Number t: 動(dòng)畫(huà)已經(jīng)執(zhí)行的時(shí)間(實(shí)際上時(shí)執(zhí)行多少次/幀數(shù))
* @param Number b: 起始位置
* @param Number c: 終止位置
* @param Number d: 從起始位置到終止位置的經(jīng)過(guò)時(shí)間(實(shí)際上時(shí)執(zhí)行多少次/幀數(shù))
*/
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;
}
};
//動(dòng)畫(huà)對(duì)象
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
復(fù)制代碼 代碼如下:
/**
* @param elem {HTMLElement} 執(zhí)行動(dòng)畫(huà)的HTML元素
* @param params {JSON} 動(dòng)畫(huà)執(zhí)行過(guò)過(guò)程中需要修改的HTML屬性
* @param duration {Number} 可選,動(dòng)畫(huà)執(zhí)行時(shí)間,單位毫秒
* @param easing {String} 可選,動(dòng)畫(huà)執(zhí)行的方式,緩入easeIn、緩出easeOut
* @param callback {Function} 可選,動(dòng)畫(huà)執(zhí)行完成時(shí)的回調(diào)函數(shù)
* @return
*/
effect.animate(elem, params, duration, easing, callback);
使用它用不了20行代碼就可以做一個(gè)產(chǎn)品圖片減速淡出、加速淡入的切換效果點(diǎn)擊這里查看演示效果
復(fù)制代碼 代碼如下:
//輔助對(duì)象,讀/寫(xiě)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動(dòng)畫(huà)算法。
* @param Number t: 動(dòng)畫(huà)已經(jīng)執(zhí)行的時(shí)間(實(shí)際上時(shí)執(zhí)行多少次/幀數(shù))
* @param Number b: 起始位置
* @param Number c: 終止位置
* @param Number d: 從起始位置到終止位置的經(jīng)過(guò)時(shí)間(實(shí)際上時(shí)執(zhí)行多少次/幀數(shù))
*/
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;
}
};
//動(dòng)畫(huà)對(duì)象
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
您可能感興趣的文章:
- JS實(shí)現(xiàn)勻速運(yùn)動(dòng)的代碼實(shí)例
- 原生JS實(shí)現(xiàn)勻速圖片輪播動(dòng)畫(huà)
- JavaScript中的勻速運(yùn)動(dòng)和變速(緩沖)運(yùn)動(dòng)詳細(xì)介紹
- 原生javascript實(shí)現(xiàn)勻速運(yùn)動(dòng)動(dòng)畫(huà)效果
- Javascript模擬加速運(yùn)動(dòng)與減速運(yùn)動(dòng)代碼分享
- JS實(shí)現(xiàn)勻加速與勻減速運(yùn)動(dòng)的方法示例
- js運(yùn)動(dòng)動(dòng)畫(huà)的八個(gè)知識(shí)點(diǎn)
- JS實(shí)現(xiàn)基于Sketch.js模擬成群游動(dòng)的蝌蚪運(yùn)動(dòng)動(dòng)畫(huà)效果【附demo源碼下載】
- JS實(shí)現(xiàn)勻速與減速緩慢運(yùn)動(dòng)的動(dòng)畫(huà)效果封裝示例
相關(guān)文章
JS實(shí)現(xiàn)網(wǎng)頁(yè)導(dǎo)航條特效
這篇文章主要為大家詳細(xì)介紹了JS實(shí)現(xiàn)網(wǎng)頁(yè)導(dǎo)航條特效,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-10-10
三種動(dòng)態(tài)加載js的jquery實(shí)例代碼另附去除js方法
這篇文章主要介紹了三種動(dòng)態(tài)加載js的jquery實(shí)例代碼另附去除js方法,需要的朋友可以參考下2014-04-04
如何通過(guò)IntersectionObserver實(shí)現(xiàn)懶加載
這篇文章主要介紹了通過(guò)IntersectionObserver實(shí)現(xiàn)懶加載,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-04-04
紅黑樹(shù)的插入詳解及Javascript實(shí)現(xiàn)方法示例
這篇文章主要給大家介紹了關(guān)于紅黑樹(shù)的插入的相關(guān)資料,以及Javascript實(shí)現(xiàn)的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起看看吧。2018-03-03
手機(jī)端實(shí)現(xiàn)Bootstrap簡(jiǎn)單圖片輪播效果
這篇文章主要為大家詳細(xì)介紹了基于Bootstrap的簡(jiǎn)單輪播圖的手機(jī)實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-10-10

