javascript tween算法及缓动效果
flash做动画时会用到tween类,利用它可以做很多动画效果,例如缓动、弹簧等等。
我这里要教大家的是怎么利用flash的tween类的算法,来做js的tween算法,并利用它做一些简单的缓动效果。
实例效果
tween类型:
linearquadraticcubicquarticquinticsinusoidal
exponentialcircularelasticbackbounce
ease类型:
easeineaseouteaseinout
效果说明
首先大家到这里下载flash的as脚本(建议看看这里的demo),1.0和2.0都可以(里面的算法都一样)。
例如打开2.0的可以看到几个as文件,每个文件对应一个tween效果,分别有(参考里面的说明):
linear:无缓动效果;
quadratic:二次方的缓动(t^2);
cubic:三次方的缓动(t^3);
quartic:四次方的缓动(t^4);
quintic:五次方的缓动(t^5);
sinusoidal:正弦曲线的缓动(sin(t));
exponential:指数曲线的缓动(2^t);
circular:圆形曲线的缓动(sqrt(1-t^2));
elastic:指数衰减的正弦曲线缓动;
back:超过范围的三次方缓动((s+1)*t^3 - s*t^2);
bounce:指数衰减的反弹缓动。
ps:以上都是自己的烂翻译,希望各位修正。
每个效果都分三个缓动方式(方法),分别是:
easein:从0开始加速的缓动;
easeout:减速到0的缓动;
easeinout:前半段从0开始加速,后半段减速到0的缓动。
其中linear是无缓动效果,没有以上效果。
然后看看里面的算法,以quad.as的easeout为例:
code
static function easeout (t:number, b:number, c:number, d:number):number {
return -c *(t/=d)*(t-2) + b;
}
这是as代码,四个参数分别是:
t: current time(当前时间);
b: beginning value(初始值);
c: change in value(变化量);
d: duration(持续时间)。
ps:elastic和back有其他可选参数,里面都有说明。
那如何在js中利用这些算法呢?可以看到,虽然是as代码,但里面的程序是可以直接放在js里使用的。
我们可以定义一个类,把它这部分放在里面:
code
var tween = {
quad: {
easeout: function(t,b,c,d){
return -c *(t/=d)*(t-2) + b;
}
}
}
这样,就可以用tween.quad.easeout取得这个算法了,其他算法也一样处理就行了。
接下来就可以利用这个js的tween来做一些缓动效果了。
先通过上面的坐标实例说一下算法原理:
x轴是时间,y轴是当前值,b是y轴的初始值,x轴的初始值是0,t是当前时间。当t(x轴)逐渐增加到达d时,当前值(y轴)会到达目标值(b+c)。
想详细理解的话可以找资料看看吧(貌似跟数学关系比较大)。
下面就介绍如何使用这个tween了,首先b、c、d三个参数(即初始值,变化量,持续时间)在缓动开始前,是需要先确定好的。
举一个简单的例子,一个div要向右缓动,left初始值是50,那么b就是50,要向右移动100,那c就是100,如果知道的是目标值,例如要向右移动到150,那就把目标值150减初始值b就是变化量c了。
至于d的设置就比较灵活,只要符合t是从0向d递增(或递减)就可以了。
d跟步长配合使用来设置持续时间,例如d设置为100,如果设置步长是1,那么从0到100就有100步,即分100次来完成这个过程,步数越多那么持续时间就越长。
至于t的变化相当于时间的变化,一般是均匀变化的,每次变化都增加一个步长,当t从0递增(或递减)到d时,缓动就结束了。
要注意的是t是从0开始的,设置步长时必须确定t确实能到达d,如果上面的步长是3,那么t就永远都到不了d了。更好的处理是当t等于或超过d之后,就停止定时器并设置当前值为目标值。
了解了tween的使用后就可以实现动画效果了。继续上面的例子,已经确定b是50,c是100,d是100,步长是1,使用tween.quad.easeout算法。那么可以用以下程序实现缓动:
code
var b=50,c=100,d=100,t=0;
function run(){
div.style.left = math.ceil(tween.quad.easeout(t,b,c,d)) + "px";
if(td){ t++; settimeout(run, 10); }
}
run();
一个简单的缓动效果就实现了,要实现不同的缓动,只需要使用对应的tween算法就行了,以前看来遥不可及的效果,现在这么容易就实现了(当然那些算法才是最难的地方)。
这样关于缓动的效果就介绍完了,但其实远远不止这些,我们还可以自己定义一些算法,发挥想象力,做一些好玩的效果。
code
input id="idclick" type="button" value="click">
div id="test1" style="position:absolute;width:5px;height:5px;background:#333; font-size:0;">div>
div id="test2" style="position:absolute;width:5px;height:5px;background:#f00; font-size:0;">div>
script>
var round = {
x: function(t,b,r){ return r*math.cos(t/20)+b; },
y: function(t,b,r){ return r*math.sin(t/20)+b; }
}
var t=x=y=0;
document.getelementbyid("idclick").onclick = function(e){
document.onmousemove = function(e){
e=e||event;
x=e.clientx+document.documentelement.scrollleft;
y=e.clienty+document.documentelement.scrolltop;
};
document.onmousemove(e);
setinterval(function(){
var ix = math.ceil(round.x(t,x,100)), iy = math.ceil(round.y(t,y,50));
with(document.getelementbyid("test1").style){ left = ix + "px"; top = iy + "px"; }
with(document.getelementbyid("test2").style){
left = math.ceil(round.x(t*5,ix,25)) + "px"; top = math.ceil(round.y(t*5,iy,25)) + "px";
}
t++;
}, 10);
}
script>
完整tween
code
var tween = {
linear: function(t,b,c,d){ return c*t/d + b; },
quad: {
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;
},
easeinout: function(t,b,c,d){
if ((t/=d/2)1) return c/2*t*t + b;
return -c/2 * ((--t)*(t-2) - 1) + b;
}
},
cubic: {
easein: function(t,b,c,d){
return c*(t/=d)*t*t + b;
},
easeout: function(t,b,c,d){
return c*((t=t/d-1)*t*t + 1) + b;
},
easeinout: function(t,b,c,d){
if ((t/=d/2)1) return c/2*t*t*t + b;
return c/2*((t-=2)*t*t + 2) + b;
}
},
quart: {
easein: function(t,b,c,d){
return c*(t/=d)*t*t*t + b;
},
easeout: function(t,b,c,d){
return -c * ((t=t/d-1)*t*t*t - 1) + b;
},
easeinout: function(t,b,c,d){
if ((t/=d/2)1) return c/2*t*t*t*t + b;
return -c/2 * ((t-=2)*t*t*t - 2) + b;
}
},
quint: {
easein: function(t,b,c,d){
return c*(t/=d)*t*t*t*t + b;
},
easeout: function(t,b,c,d){
return c*((t=t/d-1)*t*t*t*t + 1) + b;
},
easeinout: function(t,b,c,d){
if ((t/=d/2)1) return c/2*t*t*t*t*t + b;
return c/2*((t-=2)*t*t*t*t + 2) + b;
}
},
sine: {
easein: function(t,b,c,d){
return -c * math.cos(t/d * (math.pi/2)) + c + b;
},
easeout: function(t,b,c,d){
return c * math.sin(t/d * (math.pi/2)) + b;
},
easeinout: function(t,b,c,d){
return -c/2 * (math.cos(math.pi*t/d) - 1) + b;
}
},
expo: {
easein: function(t,b,c,d){
return (t==0) ? b : c * math.pow(2, 10 * (t/d - 1)) + b;
},
easeout: function(t,b,c,d){
return (t==d) ? b+c : c * (-math.pow(2, -10 * t/d) + 1) + b;
},
easeinout: function(t,b,c,d){
if (t==0) return b;
if (t==d) return b+c;
if ((t/=d/2)1) return c/2 * math.pow(2, 10 * (t - 1)) + b;
return c/2 * (-math.pow(2, -10 * --t) + 2) + b;
}
},
circ: {
easein: function(t,b,c,d){
return -c * (math.sqrt(1 - (t/=d)*t) - 1) + b;
},
easeout: function(t,b,c,d){
return c * math.sqrt(1 - (t=t/d-1)*t) + b;
},
easeinout: function(t,b,c,d){
if ((t/=d/2)1) return -c/2 * (math.sqrt(1 - t*t) - 1) + b;
return c/2 * (math.sqrt(1 - (t-=2)*t) + 1) + b;
}
},
elastic: {
easein: function(t,b,c,d,a,p){
if (t==0) return b;if ((t/=d)==1) return b+c;if (!p) p=d*.3;
if (!a || amath.abs(c)) { a=c; var s=p/4; }
else var s = p/(2*math.pi) * math.asin (c/a);
return -(a*math.pow(2,10*(t-=1)) * math.sin( (t*d-s)*(2*math.pi)/p )) + b;
},
easeout: function(t,b,c,d,a,p){
if (t==0) return b;if ((t/=d)==1) return b+c;if (!p) p=d*.3;
if (!a || amath.abs(c)) { a=c; var s=p/4; }
else var s = p/(2*math.pi) * math.asin (c/a);
return (a*math.pow(2,-10*t) * math.sin( (t*d-s)*(2*math.pi)/p ) + c + b);
},
easeinout: function(t,b,c,d,a,p){
if (t==0) return b;if ((t/=d/2)==2) return b+c;if (!p) p=d*(.3*1.5);
if (!a || amath.abs(c)) { a=c; var s=p/4; }
else var s = p/(2*math.pi) * math.asin (c/a);
if (t1) return -.5*(a*math.pow(2,10*(t-=1)) * math.sin( (t*d-s)*(2*math.pi)/p )) + b;
return a*math.pow(2,-10*(t-=1)) * math.sin( (t*d-s)*(2*math.pi)/p )*.5 + c + b;
}
},
back: {
easein: function(t,b,c,d,s){
if (s == undefined) s = 1.70158;
return c*(t/=d)*t*((s+1)*t - s) + b;
},
easeout: function(t,b,c,d,s){
if (s == undefined) s = 1.70158;
return c*((t=t/d-1)*t*((s+1)*t + s) + 1) + b;
},
easeinout: function(t,b,c,d,s){
if (s == undefined) s = 1.70158;
if ((t/=d/2)1) return c/2*(t*t*(((s*=(1.525))+1)*t - s)) + b;
return c/2*((t-=2)*t*(((s*=(1.525))+1)*t + s) + 2) + b;
}
},
bounce: {
easein: function(t,b,c,d){
return c - tween.bounce.easeout(d-t, 0, c, d) + b;
},
easeout: function(t,b,c,d){
if ((t/=d) /2.75)) {
return c*(7.5625*t*t) + b;
} else if (t(2/2.75)) {
return c*(7.5625*(t-=(1.5/2.75))*t + .75) + b;
} else if (t(2.5/2.75)) {
return c*(7.5625*(t-=(2.25/2.75))*t + .9375) + b;
} else {
return c*(7.5625*(t-=(2.625/2.75))*t + .984375) + b;
}
},
easeinout: function(t,b,c,d){
if (td/2) return tween.bounce.easein(t*2, 0, c, d) * .5 + b;
else return tween.bounce.easeout(t*2-d, 0, c, d) * .5 + c*.5 + b;
}
}
}
完整实例下载
应用实例:
javascript 图片滑动切换效果
转载请注明出处:http://www.cnblogs.com/cloudgamer/
如有任何建议或疑问,欢迎留言讨论。
如果觉得文章不错的话,欢迎点一下右下角的推荐。
程序中包含的js工具库cjl.0.1.min.js,原文在这里。
标签: javascript, 弹簧, tween, 缓动, ease, 加速, 减速, 运动, 动画, 反弹
绿色通道:好文要顶关注我收藏该文与我联系
posted @ 2009-01-06 09:17 cloudgamer 阅读(52762) 评论(73)编辑 收藏
发表评论
2281193
回复 引用 查看
#1楼 2009-01-06 09:27 leepy
很不错
回复 引用 查看
#2楼 2009-01-06 09:41 痴情客
很不错了
回复 引用 查看
#3楼 2009-01-06 09:42 狼robot
向楼主学习.
回复 引用 查看
#4楼 2009-01-06 10:23 mythysjh
神仙...
回复 引用 查看
#5楼 2009-01-06 10:38 yww
很有趣,呵呵,说的对,难的是那些数学公式!研究这些公式出来得到这个效果的是大牛。
回复 引用 查看
#6楼 2009-01-06 10:43 xzf158
从中学习了很多js不一样的写法,感觉自己的js水平一下提高了很多,谢谢了!
回复 引用 查看
#7楼[楼主] 2009-01-06 10:52 cloudgamer
@leepy
@痴情客
@狼robot
@mythysjh
@yww
@xzf158
谢谢支持
回复 引用 查看
#8楼 2009-01-06 11:26 坷垃和克拉
楼主js错误太多呀,
quadraticcubicquarticquinticsinusoidal
exponentialcircularelasticbackbounce
ease类型:
easeineaseouteaseinout
这些都不能点
回复 引用 查看
#9楼 2009-01-06 12:44 账号难注册
不错
回复 引用 查看
#10楼[楼主] 2009-01-06 14:04 cloudgamer
@坷垃和克拉
@账号难注册
谢谢支持
不能点?什么意思
回复 引用
#11楼 2009-01-07 02:23 diryboy is me[未注册用户]
谢谢楼主,讲解得很明白~
回复 引用 查看
#12楼 2009-01-07 09:28 dotnet菜园
学习
回复 引用
#13楼 2009-01-07 16:33 四五爱人[未注册用户]
哈哈 大家多点点那个click试下
回复 引用 查看
#14楼[楼主] 2009-01-07 16:56 cloudgamer
@diryboy is me
@dotnet菜园
谢谢支持
@四五爱人
呵呵
忘记clear掉
不过也挺好
回复 引用
#15楼 2009-01-08 08:59 tiger2009[未注册用户]
51js看了你的东西过来的。
强得一塌糊涂啊!
回复 引用
#16楼 2009-01-08 14:47 smile_bug[未注册用户]
很是强悍
申请交换链接www.fomly.cn
回复 引用 查看
#17楼[楼主] 2009-01-09 08:55 cloudgamer
@tiger2009
谢谢支持
@smile_bug
呵呵 可以的
回复 引用
#18楼 2009-01-13 16:06 chxwei[未注册用户]
强悍!
学习
回复 引用
#19楼 2009-01-14 15:50 xuyi[未注册用户]
对的,算法非常重要.
一般的增删查改用不到.
特别在js方面,算法体验了一好的程序.
回复 引用 查看
#20楼 2009-01-15 10:28 彭仁夔
在分析ext的特效时,不知道如何解决这些名词
同时也想把这些算法采用图表示出来
楼主已经做了,厉害!!
回复 引用
#21楼 2009-01-20 22:30 kim wang[未注册用户]
强!
回复 引用 查看
#22楼 2009-02-05 18:48 silvernet
很强!
回复 引用
#23楼 2009-02-17 14:06 passing[未注册用户]
只能说一句,谢谢了。
回复 引用 查看
#24楼 2009-02-22 17:46 rmania
- -越来越强大了!
谢谢分享!我也正在学js
想问下楼主:
function addevent( node, type, listener )
{
if(!iscompatible()) { return false }
if(!(node = $(node))) return false;
if (node.addeventlistener)
{
node.addeventlistener( type, listener, false );
return true;
}
else if(node.attachevent)
{
node['e'+type+listener] = listener;
node[type+listener] = function(){node['e'+type+listener]( window.event );}
node.attachevent( 'on'+type, node[type+listener] );
return true;
}
return false;
};
window['rmania']['addevent'] = addevent;
这是我从书上拿到自己类库上的一个方法,但是对这里node['e'+type+listener] = listener;我自己都不明白了node是取得的一个对象id,如你常用的方法$(node),type是注册好的事件,如click,load.listener是一方法.这样用'+'语法连接起来后listener他是一个东西了?先谢谢了
回复 引用 查看
#25楼[楼主] 2009-02-23 09:01 cloudgamer
@rmania
感觉是想把attachevent模拟成addeventlistener
不过我不清楚这样写的用意
建议看 精通javascript 的addevent
回复 引用 查看
#26楼[楼主] 2009-02-23 09:02 cloudgamer
@chxwei
@xuyi
@彭仁夔
@kim wang
@silvernet
@passing
谢谢支持
回复 引用 查看
#27楼 2009-03-08 23:00 杨云涛
楼主,你太有才了!用javascript实现这样的算法,让我这个新手眼前一亮。多谢!学习中……
回复 引用
#28楼 2009-03-27 16:45 wx525[未注册用户]
太强了,无语形容
回复 引用
#29楼 2009-05-19 13:13 雪!~[未注册用户]
牛人!
很强大……js也可以这么玩了,会不会有一天!网页代替windows系统所有的功能?
回复 引用 查看
#30楼[楼主] 2009-05-19 19:36 cloudgamer
@杨云涛
@wx525
谢谢支持
@雪!~
呵呵
那至少现在是没这个可能
回复 引用
#31楼 2009-05-22 16:24 1k-studio[未注册用户]
太酷了!!我赶紧给收藏了
晚上研究研究~~
感谢博主!
回复 引用 查看
#32楼 2009-05-26 00:01 biny
博主的每篇文章都是精华!
回复 引用
#33楼 2009-06-21 01:43 yihaijian1[未注册用户]
楼主真的太牛x了
回复 引用 查看
#34楼[楼主] 2009-06-22 08:44 cloudgamer
@1k-studio
@biny
@yihaijian1
谢谢支持
回复 引用 查看
#35楼 2009-07-14 10:00 选择多灵活多
牛人
回复 引用
#36楼 2009-07-28 10:38 抱抱[未注册用户]
感觉一个怪怪的地方,2次方的图形和3次方的图形前两个都那么像,第三个差别太大了吧。
不过已在博主这学到很大,我很高兴,真的很感谢博主。
回复 引用
#37楼 2009-07-28 10:50 抱抱[未注册用户]
对了,是不是:
所有easeinout都可以换成下面的形式啊?
easeinout: function(t,b,c,d){
if (t
回复 引用 查看
#38楼[楼主] 2009-07-28 13:58 cloudgamer
@抱抱
easeinout就是一半的easein一半的easeout
@选择多灵活多
谢谢支持
回复 引用
#39楼 2009-08-14 17:30 applezqp[未注册用户]
转载了,很强大。
回复 引用 查看
#40楼 2009-08-29 19:04 石头儿
@cloudgamer
x轴是时间,y轴是当前值,b是y轴的初始值,x轴的初始值是0,t是当前时间。当t(x轴)逐渐增加到达d时,当前值(y轴)会到达目标值(b+c)。
想详细理解的话可以找资料看看吧(貌似跟数学关系比较大)。
看到这句话时我笑歪了,b(begin)是y轴初始值,c(change)是y轴在0~d时的变化量,那b的值不是(b+c)么?还貌似跟数学有关系( ⊙ o ⊙ )~~
不过很佩服博主啊,看来只是融会贯通起来,都真成神仙了~
回复 引用 查看
#41楼 2009-08-29 19:05 石头儿
@cloudgamer
只是->知识
回复 引用 查看
#42楼[楼主] 2009-08-29 21:51 cloudgamer
@石头儿
y轴的初始值不是0哦,是b
那时应该弄个图比较好理解
@applezqp
谢谢支持
回复 引用
#43楼 2009-09-16 14:11 csdn--oominder[未注册用户]
cloudgamer大侠 偶然看到了你的博客 真是受益匪浅... 自己也想跟着你的教程好好学下js最近硬着头皮写了个效果..但 最后的缓动效果怎么也用不好..希望你有时间能帮我看看.写了两天了..再写不出来 不知道怎么坚持了.
http://topic.csdn.net/u/20090916/13/68c45885-b43c-4013-87bd-2d1fbe77e140.html?seed=1017804559&r=59838101#r_59838101
回复 引用 查看
#44楼[楼主] 2009-09-16 14:24 cloudgamer
@csdn--oominder
已经回复了
回复 引用 查看
#45楼 2009-10-22 22:17 none7
http://www.cnblogs.com/none/archive/2009/10/22/javascriptspringemluator.html
这是我刚申请的博客:里面有我刚放上去的弹簧振子,教教我怎么把代码放上去能隐藏,还能变色,想你的一样,带个加号,我自己先查查!
回复 引用 查看
#46楼[楼主] 2009-10-22 23:00 cloudgamer
@none7
博客的使用你可以问管理员
回复 引用 查看
#47楼 2009-10-25 02:10 none.
@cloudgamer
o了 谢谢!
回复 引用
#48楼 2009-11-02 14:40 dns地址[未注册用户]
很强大……js也可以这么玩了,会不会有一天!网页代替windows系统所有的功能?
回复 引用 查看
#49楼[楼主] 2009-11-02 15:11 cloudgamer
@dns地址
估计不会
有的话估计也不叫js了
回复 引用 查看
#50楼 2009-11-05 14:46 小zz
很喜欢你最后的小程序,在鼠标晃悠的那个。学习js,
回复 引用 查看
#51楼 2009-12-22 15:28 authen
步长越大持续性时间越短
回复 引用 查看
#52楼 2010-01-27 09:59 易明之光
在楼主这里能学到东西,谢谢楼主
回复 引用 查看
#53楼[楼主] 2010-03-03 17:06 cloudgamer
@小zz
@authen
@易明之光
谢谢支持
回复 引用 查看
#54楼 2010-07-27 17:00 carlos
js 在ie下运行总感觉不流畅,有没有那个动画类对ie专门做过优化的?
回复 引用 查看
#55楼[楼主] 2010-07-27 17:06 cloudgamer
@carlos
这个我也没研究
回复 引用
#56楼 2010-08-17 10:46 jinzhe.net[未注册用户]
如果是递减的应该修改哪个变量?
回复 引用 查看
#57楼[楼主] 2010-08-17 14:17 cloudgamer
@jinzhe.net
easein和easeout就是一个加速一个减速
回复 引用
#58楼 2010-09-02 17:38 陈小媛[未注册用户]
楼主~~楼主~~~楼主~~~哎哟我去。。。你咋这么牛呢?
回复 引用 查看
#59楼[楼主] 2010-11-11 08:55 cloudgamer
@陈小媛
谢谢支持
回复 引用 查看
#60楼 2010-11-17 18:27 前 端
div向右缓动怎么写的啊,看不懂啊。。。能黑格简单的例子吗?就是上面举例那个,在具体点哦,谢谢。。。
回复 引用 查看
#61楼[楼主] 2010-11-17 20:02 cloudgamer
@前 端
这里有用到
http://www.cnblogs.com/cloudgamer/archive/2008/07/06/slidetrans.html
参考一下吧
回复 引用 查看
#62楼 2010-12-16 19:14 sgof
学习中,牛人
回复 引用
#63楼 2011-01-07 20:07 lain0719[未注册用户]
强大,膜拜学习中...
回复 引用
#64楼 2011-01-28 11:24 softz[未注册用户]
非常感谢,可以说有了这个“函数库”,变速运动的基础就有了,什么特殊都好办了。
非常感谢,真的。
settimeout(run, 10);
这一段不好,这是利用计时器的函数递归调用。
每一次调用js会生成一个新的函数,而在js中,函数的本质是对象,这样一直调用下去,我认为算是一个小小的“内存泄露”吧。
当然函数占用非常小,网页也不会一直开着,我只是建议使用:
window.setinterval()代替window.settimeout()
回复 引用
#65楼 2011-01-28 12:08 softz[未注册用户]
对不起,我写错了,楼主的方法很好,不会一直调用下去。
反而用window.setinterval()会出现死循环。
回复 引用 查看
#66楼[楼主] 2011-01-28 13:28 cloudgamer
@sgof
@lain0719
@softz
谢谢支持
回复 引用 查看
#67楼 2011-04-20 17:06 montage
神人那
回复 引用
#68楼 2011-07-18 14:48 steve.bao[未注册用户]
引用softz:
对不起,我写错了,楼主的方法很好,不会一直调用下去。
反而用window.setinterval()会出现死循环。
settimeout比setinterval更贴近内核
另外setinterval才有可能照成泄露
settimeout会在之前的函数执行完之后再settimeout
另外内存泄露是由于错误的指针照成的,貌似js有问题也是出在编译器这块吧..
回复 引用 查看
#69楼[楼主] 2011-07-20 13:55 cloudgamer
@montage
@steve.bao
谢谢支持
回复 引用 查看
#70楼 2011-08-12 16:56 keairen101
很有用!!!
回复 引用 查看
#71楼 2011-11-06 20:30 纳米黑客
mark
相当有用
回复 引用 查看
#72楼 2011-11-06 20:31 纳米黑客
另外,
推荐使用requestanimframe来代替settimeout.
据说是最先进的...
回复 引用
#73楼 2011-12-28 11:12 bypasser[未注册用户]
非常有用,感谢楼主分享
刷新评论列表刷新页面返回页首
发表评论
昵称: [登录]
[注册]
主页:
邮箱:(仅博主可见)
验证码:看不清。
换一个
评论内容:
记住我的昵称和主页
-->
登录注册
[使用ctrl+enter键快速提交评论]
0
1369979
crih7dqmr2g=
首页博问闪存新闻园子招聘知识库
最新it新闻:
·windows 7官方rss动态主题:《昆虫》
·捡到iphone 4s玩自拍 icloud同步酿悲剧
·铁道部购票网站存泄密危险 cdn服务商技术短板是主因
·利用 mimo magictouch 打造另类的平板电脑
·但愿大嘴巴的消息再次失准
» 更多新闻...
最新知识库文章:
·设计师的品牌意识
·如何成为“10倍效率”开发者
·快速排序(quicksort)的javascript实现
·wcf服务端运行时架构体系详解[续篇]
·wcf服务端运行时架构体系详解[下篇]
» 更多知识库文章...
china-pub 2011秋季教材巡展
china-pub 计算机绝版图书按需印刷服务