用js来控制行为,控制页面表现。恐怕是我们用它来做的最多的事情了...
jquery为什么这么受欢迎,我想,一方面是它的选择器[selector]足够牛b,另一方面应该要归功于它在dom变换上做足了功夫。
于是,秉承着一个宅男的宗旨,周末花了两个晚上稍微总结了一下,写了一段控制dom元素变换的代码,与目前强大的框架比起来,确实显得有点拙劣,不过作为日常开发的工具函数,我想还是蛮实用的。(这也是我最初的目的 ^_^)。
开门见山,先把源码完整的贴出来:(本着分享学习的原则,源代码你可以任意修改)
复制代码 代码如下:
//////////////* = 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 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 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 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();
}
}
}
从调用方式来看,其实我的实现方法有点类似于yui,以下是个最简单的例子:
复制代码 代码如下:
hongru.anim(id, {
from: {
top: 0,
left: 100
},
to: {
left: 500,
}
});
以下是调用这段代码的效果:
tweens demo