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/
Tag标签: JavaScript,渐变
posted @ 2008-08-27 00:17 cloudgamer 阅读(10959) 评论(50)  编辑 收藏 所属分类: Javascript

  回复  引用    
#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      
  回复  引用  查看    
#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      
支持一下,期待更多精品
发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

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

0 1277131


相关文章:

相关链接: