Use js to control behavior and page performance. I'm afraid it's the most common thing we use it to do...
Why jQuery is so popular, I think, on the one hand, its selector [selector] is awesome enough, and on the other hand, it should be attributed to its use in A lot of effort has been put into DOM transformation.
Therefore, adhering to the purpose of being an otaku, I spent two nights on the weekend to summarize a little and wrote a piece of code to control the transformation of dom elements. Compared with the current powerful framework, it does seem a bit clumsy, but as a daily development I think the tool function is quite practical. (This is also my original purpose ^_^).
Let’s get straight to the point, first post the complete source code: (In line with the principle of sharing and learning, you can modify the source code at will)
//////////////* = Hongru.anim.js =*////////////
// @author: hongru.chen //
// @date: 2010-10-17 //
//////////////////// //////////////////////////
var Hongru = {
get : function (id) {return document.getElementById(id)} ,
tween : {
linear : function (f, t, d) { return t * d f; },
ease : function (f, t, d) { return -t * .5 * ( Math.cos(Math.PI * d) - 1) f; }
},
tweens: [],
tweensCnt: 0,
anim : function (obj, params) {
var self = this,
objList = [],
objReturn = [];
var animimg = function () {
var i = -1, o;
while( o = self.tweens[ i] ) {
var cTime = (new Date()).getTime() - o.start;
if (cTime < o.duration) {
for (var k in o.val) {
var m = o.val[k];
o.obj[k] = Math.ceil(o.ease(m.from, m.diff, cTime/o.duration) ) (o.cssMode ? 'px' : 0);
}
} else {
cTime = o.duration;
for (var k in o.val) {
var m = o.val[k];
o.obj[k] = Math.ceil(o.ease(m.from, m.diff, cTime/o.duration)) (o.cssMode ? 'px' : 0);
}
self.tweens.splice(i, 1);
self.tweensCnt--;
if (o.onFinish) o.onFinish (o.params);
self.stop();
}
if (!o.cssMode) o.obj.onTween();
}
};
if (typeof obj == "string" || !obj.length) objList.push(obj); else objList = obj;
for (var il = 0, l = objList.length; il < l; il ) {
var obj = this .get(objList[il]) || objList[il];
var o = {};
o.val = {};
o.cssMode = true;
o.o = obj;
o.obj = obj.style;
for (var k in params) {
var p = params[k];
if (k === "cssMode") {
if (p === false) {
o.cssMode = false;
o.obj = obj;
}
} else if (k === "onTween") {
o.obj.onTween = p;
} else if (k === "from") {
for (var i in p) o.obj[i] = o.cssMode ? (Math.ceil( p[i]) 'px') : p[i];
} else if (k === "to") {
for (var i in p) {
var from = o. cssMode ? (parseInt(o.obj[i]) || 0) : (o.obj[i] || 0);
o.val[i] = {
from: from,
diff: p[i] - from
};
}
} else o[k] = params[k];
}
if (!o.ease) o.ease = this.tween.ease;
if (!o.cssMode && params['from']) o.obj.onTween();
o.duration = params.duration ? params.duration : 1000;
o.start = (new Date()).getTime();
this.tweens.push(o);
this.tweensCnt;
if (!this.running) this.running = window .setInterval(animimg, 10);
objReturn.push(o);
}
return objReturn.length === 1 ? o : objReturn;
},
stop : function ( ) {
if (!this.tweensCnt) {
window.clearInterval(this.running);
this.running = false;
}
},
kill : function ( obj) {
if (obj) {
for (var i = 0; i < this.tweensCnt; i ) {
if (this.tweens[i] === obj || this. tweens[i].o === obj || this.tweens[i].o === this.get(obj)) {
this.tweensCnt--;
this.tweens.splice(i , 1);
this.stop();
}
}
}
},
reset : function () {
this.tweensCnt = 0;
this.stop();
while( this.tweens.length ) {
this.tweens.stop();
}
}
}
From the perspective of calling method, my implementation method is actually somewhat similar to YUI. The following is the simplest example:
Hongru.anim(id, {
from: {
top: 0,
left: 100
},
to: {
left: 500,
}
});
The following is the effect of calling this code: