JavaScript 渐变效果

程序集合了宽度、高度、透明度、top、left的渐变,可以自定义渐变项目和各个项目的初始值结束值,还能以任意点(定点)为中心渐变。

使用该程序能实现很多常见的动画特效,包括大小变换、位置变换、渐显渐隐等等。

 

效果:

 

 

程序说明:


渐变效果的原理就是利用定时器不断设置值,如果要减速效果就设置一个步长(详细看JavaScript 弹簧效果) 。
这里只是把能渐变的属性(透明度、宽、高、left、top)整合在一起,使用相同的渐变级数(Step)使渐变同步,形成多个属性同时渐变的效果。

下面说说有用的地方:


【最终样式】
JavaScript 图片切割效果的边宽获取中也说到了最终样式,在使用offset获取的数据设置宽度高度的时候,必须先减去最终样式中的边框宽度。
在这里我使用了muxrwc的在FF下实现currentStyle方法,这样在ff和ie都可以从currentStyle获取最终样式了:

Code


使用这个获取边框宽度:

this._xBorder = function(){ return (parseInt(obj.currentStyle.borderLeftWidth) + parseInt(obj.currentStyle.borderRightWidth)); }
this._yBorder = function(){ return (parseInt(obj.currentStyle.borderTopWidth) + parseInt(obj.currentStyle.borderBottomWidth)); }


【宽度或高度优先】
宽度或高度优先其实就是先执行其中一个渐变,在完成后再执行另一个渐变。
渐变程序中在执行完一次渐变之后会返回一个bool值表示是否渐变完成,利用这个可以这样:

this.SetWidth() && this.SetHeight();


由于&&的特性,当this.SetWidth()返回true时才会去执行this.SetHeight(),这也是不错的技巧。
同时为了同步渐变,另外的渐变使用了两倍的步长:

Code


这样就能做出宽度或高度优先的效果了。

【定点渐变】
先说说原理,例如以宽度中点为参照点,可以想象如果宽度减少n,那只要left相对增加n*0.5(即n/2),
那么就可以做出以中点为中心变换的效果(当然要先把变换对象设为相对或绝对定位)。
那这个“0.5”怎么来的呢?有点数理知识应该知道就是渐变对象左边到变换点跟渐变对象总宽度的比
程序里用Width.pos保存这个值,在变换前先计算好变换点的位置:

this._x = this._obj.offsetLeft + this._obj.offsetWidth * this.Width.pos;

每次变换都根据这个位置和宽度来重新设置left:

this._obj.style.left = this._x - this._obj.offsetWidth * this.Width.pos + "px";


可能有人会说直接在原有left基础上加上变换宽度*Width.pos不是一样吗?
但问题是经过多次的变换计算(到达目标值前会有多次计算)之后得到的值已经不准确了。
因为在变换计算过程中很多小数会被忽略,随着计算次数增多结果的出入也越大,
所以先定好变换位置参照值(_x),这样不论经过多少次计算变换位置都不会走位了。

同理只要设置不同的Width.pos(包括负数和大于1的数)和Height.pos就可以以任意点为中心渐变了。

还有就是程序的设计也花了不少心思,为了提高整合度,做了一个FadeStruct的结构,其中run、start、end、target属性分别是是否渐变、开始值、结束值、目标值。
用了两次的Object.extend来设置默认值,详细可以看程序。


使用说明:


必要的参数只有一个,就是渐变对象,不过只有渐变对象是没有效果的,必须设置其他属性:
Opacity:透明渐变参数
Height:高度渐变参数
Width:宽度渐变参数
Top:Top渐变参数
Left:Left渐变参数
Step:10,//变化率
Time:10,//变化间隔
Mode:"both",//渐变顺序
Show:false,//是否默认打开状态
onFinish:function(){}//完成时执行

其中Opacity、Height、Width、Top、Left比较特别,是FadeStruct结构

例子里实例化这个对象:

Code


设置run为true就表示开启这个变换,start和end是开始和结束值,pos是Height和Width特有的变换位置属性。

更详细的应用可以看实例。 

程序代码:

Code


下载完整测试代码

转载请注明出处:http://www.cnblogs.com/cloudgamer/

如有任何建议或疑问,欢迎留言讨论。

如果觉得文章不错的话,欢迎点一下右下角的推荐。

程序中包含的js工具库CJL.0.1.min.js,原文在这里

posted @ 2008-08-27 00:17 cloudgamer 阅读(25903) 评论(59) 编辑 收藏

 回复 引用   
#1楼 2008-08-27 00:19 AstarNoLogin[未注册用户]
不错
 回复 引用 查看   
#2楼 2008-08-27 00:19 悟〈--觉      
真帅,有源代码不?

 回复 引用 查看   
#3楼[楼主] 2008-08-27 01:04 cloudgamer      
@AstarNoLogin
谢谢

@悟〈--觉
贴出来了
不过还没完成的

 回复 引用 查看   
#4楼 2008-08-27 01:04 崇山峻岭      
楼主...强...小弟向你看齐.....可以将整个源源码参考吗...呵呵sunjun2008@163.com
 回复 引用 查看   
#5楼[楼主] 2008-08-27 01:06 cloudgamer      
@崇山峻岭
等我完成后会放完全的测试代码下载的

 回复 引用   
#6楼 2008-08-27 01:24 AstarNoLogin[未注册用户]
呵呵,都不睡呀。注意身体哦
 回复 引用 查看   
#7楼 2008-08-27 07:52 一杰      
很强大,支持下。
 回复 引用 查看   
#8楼 2008-08-27 08:32 小情      
很强大,支持下。
 回复 引用 查看   
#9楼 2008-08-27 08:51 Exile      
MM好漂亮,@^@
 回复 引用 查看   
#10楼 2008-08-27 08:55 侯垒      
不错.
 回复 引用 查看   
#11楼[楼主] 2008-08-27 09:01 cloudgamer      
@AstarNoLogin
谢谢关心

@jannock
@一杰
@小情
@Exile
@侯垒
谢谢支持

 回复 引用   
#12楼 2008-08-27 09:11 爽肤水[未注册用户]
效果不错,妞也不错
 回复 引用 查看   
#13楼 2008-08-27 09:13 对月而歌      
支持 支持
 回复 引用 查看   
#14楼 2008-08-27 09:14 Such Cloud      
一大早看到 支持一下!
 回复 引用 查看   
#15楼 2008-08-27 09:20 michaellu      
看了那个妞不错啊,哈哈
 回复 引用 查看   
#16楼 2008-08-27 09:22 michaellu      
大清早,不顶不行。
 回复 引用 查看   
#17楼 2008-08-27 09:28 爱上北溟鸟      
再顶一个
 回复 引用 查看   
#18楼 2008-08-27 09:28 海皮球      
酷呆了!不错!
 回复 引用   
#19楼 2008-08-27 09:38 graystar[未注册用户]
代码写得好不好不要紧,关键是妞正不正点.
 回复 引用 查看   
#20楼 2008-08-27 09:54 阿一(杨正祎)      
效果果然不错。
 回复 引用 查看   
#21楼 2008-08-27 09:54 有容乃大      
值得欣赏,赞一下。
 回复 引用 查看   
#22楼 2008-08-27 10:06 Ryan Gene      
var Fade = Class.create();

base on prototype framework?

 回复 引用 查看   
#23楼[楼主] 2008-08-27 10:13 cloudgamer      
@爽肤水
@对月而歌
@Such Cloud
@michaellu
@michaellu
@爱上北溟鸟
@海皮球
@graystar
@阿一(杨正祎)
@有容乃大
谢谢支持

@Ryan Gene
是使用了prototype 的类结构但没有真的使用框架

 回复 引用 查看   
#24楼 2008-08-27 10:42 Cat Chen      
这些简单的效果直接去用Prototype+Scriptaculous就好了,用不着自己写。复杂的效果,可以基于Scriptaculous来写。
 回复 引用 查看   
#25楼[楼主] 2008-08-27 10:49 cloudgamer      
@Cat Chen
这是个人兴趣用于学习
用框架感觉意义就不大了

 回复 引用 查看   
#26楼 2008-08-27 12:25 烟仔      
支持 支持
 回复 引用   
#27楼 2008-08-27 13:16 zbinxp[未注册用户]
楼主的失误之处在于那张图片,让代码都黯然失色了

不过我美女看太多了,没有感觉了。还是学习一下代码先

 回复 引用 查看   
#28楼[楼主] 2008-08-27 14:33 cloudgamer      
@烟仔
@zbinxp
谢谢

 回复 引用 查看   
#29楼 2008-08-27 16:45 love&tiger      
lz很刻苦呀,那么晚了还在忙
 回复 引用 查看   
#30楼[楼主] 2008-08-27 17:22 cloudgamer      
@love&tiger
谢谢关心

 回复 引用 查看   
#31楼 2008-08-27 21:22 阿滨       
我要美女不要代码啊!!
 回复 引用 查看   
#32楼[楼主] 2008-09-02 21:45 cloudgamer      
@阿滨
美女图片地址
http://images.cnblogs.com/cnblogs_com/cloudgamer/143727/r_mm14.jpg

 回复 引用 查看   
#33楼 2008-10-03 10:33 漂零      
太强大了
 回复 引用 查看   
#34楼[楼主] 2008-10-03 15:20 cloudgamer      
@漂零
谢谢支持

 回复 引用 查看   
#35楼 2008-10-13 18:45 daml      
学习中。。
 回复 引用 查看   
#36楼[楼主] 2008-10-14 08:40 cloudgamer      
@daml
共同学习

 回复 引用   
#37楼 2008-10-29 19:08 剑无名[未注册用户]
大哥你真NB
 回复 引用 查看   
#38楼[楼主] 2008-10-29 21:14 cloudgamer      
@剑无名
谢谢支持

 回复 引用   
#39楼 2008-10-30 10:02 剑无名[未注册用户]
我想问下,idContainer的onclick事件函数中,在f.start()之前的代码是处理什么的?还有我改变了fade的Width.pos值,但是看不到有什么效果,能不能帮忙解答一下,谢谢!
 回复 引用 查看   
#40楼[楼主] 2008-10-30 20:17 cloudgamer      
@剑无名
如果f.Show即打开状态时设置f.Width.pos,f.Height.pos
即变换点位置
目的是使渐变关闭点设置到点击位置
使用这个两个属性必须是相对定位或绝对定位
还是不明白的话可以发代码给我看看

 回复 引用 查看   
#41楼 2008-11-13 10:11 言学      
好帅气啊。
 回复 引用   
#42楼 2008-12-04 09:19 gyct[未注册用户]
博主你太NB了~
每篇日志对我都有很大的价值哦~
虽然我是后台程序员,但是也得到很多帮助,谢谢~

 回复 引用   
#43楼 2009-02-10 09:01 jaychaoqun[未注册用户]
MM身材不错
 回复 引用   
#44楼 2009-05-17 12:48 wrw[未注册用户]
拜托代码............................
 回复 引用 查看   
#45楼[楼主] 2009-05-17 13:02 cloudgamer      
@wrw
上面已经有测试代码下载

@jaychaoqun
@gyct
@言学
谢谢支持

 回复 引用   
#46楼 2009-05-19 09:21 很强的内容[未注册用户]
为什么全是美女
哎,什么什么欲动

 回复 引用   
#47楼 2009-05-21 00:18 wtcsy[未注册用户]
拜读了很久,顺便模仿了一下
基本上是按你的思路来的
可是出问题了,可否指教一下(部分步骤不一样!~)..............

 回复 引用 查看   
#48楼[楼主] 2009-05-21 08:25 cloudgamer      
@很强的内容
呵呵

@wtcsy
其实这东西最好还是参考jq的
不知你的是什么问题

 回复 引用   
#49楼 2009-05-21 11:23 wtcsy[未注册用户]
发送到了你的邮箱. 期待解答!~
 回复 引用 查看   
#50楼 2009-06-02 02:12 Selfocus      
支持一下,期待更多精品
 回复 引用 查看   
#51楼 2009-08-09 01:36 江苏-茄子      
哪几个例子是比较基础的啊?前辈能不能告知一下qq号码!以后讨教一下阿
 回复 引用 查看   
#52楼[楼主] 2009-08-09 18:29 cloudgamer      
@江苏-茄子
也就二十篇左右,你可以选适合的看
有什么问题可以留言或email

@Selfocus
谢谢支持

 回复 引用   
#53楼 2009-08-11 03:35 磊子的[未注册用户]
空间绝后 jascript大师一级!
 回复 引用 查看   
#54楼 2009-08-21 18:03 江苏-茄子      
@cloudgamer
您主要用的什么知识点啊!我今天看了一下prototype!是不是主要用的这个啊!
用没用什么jquery啊

 回复 引用 查看   
#55楼[楼主] 2009-08-21 20:07 cloudgamer      
@磊子的
谢谢支持

@江苏-茄子
风格开始是参考prototype.js现在也有一些自己的风格

 回复 引用   
#56楼 2009-08-25 23:03 qqww1122[未注册用户]
看完之后觉得自己啥都不会
 回复 引用 查看   
#57楼[楼主] 2009-08-25 23:21 cloudgamer      
@qqww1122
是说文章没有可取之处还是...?

 回复 引用 查看   
#58楼 2010-12-17 17:29 前 端      
为什么每次下载源代码都下的是个login.aspx的文档呢???
 回复 引用 查看   
#59楼[楼主] 2010-12-18 08:53 cloudgamer      
@前 端
右键另存为

发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 1277131 FgF3O4FxN68=