JavaScript Tween算法及缓动效果javascript

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 计算机绝版图书按需印刷服务


======================================================
在最后,我邀请大家参加新浪APP,就是新浪免费送大家的一个空间,支持PHP+MySql,免费二级域名,免费域名绑定 这个是我邀请的地址,您通过这个链接注册即为我的好友,并获赠云豆500个,价值5元哦!短网址是http://t.cn/SXOiLh我创建的小站每天访客已经达到2000+了,每天挂广告赚50+元哦,呵呵,饭钱不愁了,\(^o^)/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值