标题: [原创] 即拷即用:三个动画函数,透明度渐变、位置移动、尺寸变化
abeet
爬虫
Rank: 2



UID 53586
精华 0
积分 164
帖子 49
威望 64
阅读权限 20
注册 2006-6-26
状态 离线
 
发表于 2010-3-25 20:44  资料  个人空间  主页 短消息  加为好友  QQ
即拷即用:三个动画函数,透明度渐变、位置移动、尺寸变化

先说明一下,现在网上有一些功能很强大的动画类,如MOOFX之类,我为什么要写这三个动画函数?
因为在写zDialog时需要且只需要用到透明度渐变动画,
但又不愿意引入一个大大的动画类使zDialog变得臃肿,于是就写了一个透明度渐变动画的函数,
前几天得空,把位置移动及尺寸变化这两种最常用的动画效果实现了,

所以这三个函数适用于以下情况,
1、在做前端页面时,只需要简单的动画效果,不想引入整个动画类,使用本函数。
2、在写js类时,需要用到简单的动画,为了降低藕合性,使用本函数。

代码及运行效果,见下面的代码框

   提示:您可以先修改部分代码再运行

var fade = function(element, transparency, speed, callback){……}
透明度渐变:transparency:透明度 0(全透)-100(不透);speed:速度1-100,默认为1
例<input type="button" value="透明度变化" onClick="fade('testDiv', 40)" />


var move = function(element, position, speed, callback){……}
//移动到指定位置,position:移动到指定left及top 格式{left:120, top:340}或{left:120}或{top:340};speed:速度 1-100,默认为10
例<input type="button" value="垂直移动" onClick="move('testDiv', {top:400})" />

var resize = function(element, size, speed, callback){……}
//长宽渐变:size:要改变到的尺寸 格式 {width:400, height:250}或{width:400}或{height:250};speed:速度 1-100,默认为10
例<input type="button" value="改变高度" onClick="resize('testDiv', {height:300})" />

[ 本帖最后由 abeet 于 2010-3-25 21:03 编辑 ]


本帖最近评分记录
西门轩辕   2010-3-26 22:08  威望  +20   相当不错的东西,严重支持。
顶部
abeet
爬虫
Rank: 2



UID 53586
精华 0
积分 164
帖子 49
威望 64
阅读权限 20
注册 2006-6-26
状态 离线
 
发表于 2010-3-25 20:46  资料  个人空间  主页 短消息  加为好友  QQ
回复 #1 abeet 的帖子

咦,给我加威望了,那我再啰嗦几句吧

简单解释一下我的动画函数里几个要点的实现

1、获取一个元素的透明度
如果是IE浏览器,则攻取最终样式的滤镜filter的值,再通过正则表达式获取到透明度滤镜alpha的值,如果不存在透明度滤镜值,则透明度为100。
如果是非IE浏览器,那么可以获取最终样式的opacity属性,
function getOpacity(elem){
                var alpha;
                if(navigator.userAgent.toLowerCase().indexOf('msie') != -1){
                                alpha=elem.currentStyle.filter.indexOf("opacity=") >= 0?(parseFloat( elem.currentStyle.filter.match(/opacity=([^)]*)/)[1] )) + '':
                                '100';
                }else{
                                alpha=100*elem.ownerDocument.defaultView.getComputedStyle(elem,null)['opacity'];
                }
                return alpha;
        };
为了简化函数

2、设置透明度
这个就简单了,不用管浏览器,通通的设置opacity及filter,
element.style.opacity =  start / 100;
element.style.filter = 'alpha(opacity=' + start + ')';
实际上这儿我偷了个懒,真正无懈可击的写法,应该是判断一下是否IE浏览器,因为在一些情况下可能使用多个滤镜,这时应该用正则替换alpha滤镜的值,而不是直接设置style.filter = 'alpha(opacity=' + start + ')';

3、element.offsetWidth、element.offsetHeight与element.style.width、element.style.height的关系
只有在IE的border-content式盒模型情况下,这两个值才是相等的,即elementoffsetWidth==element.style.width+element.style.paddingLeft+element.style.paddingRight+element.style.borderLeftWidth+element.style.borderRightWidth
而我认为border-content式盒模型是符合修改元素尺寸时的心理预期的,对非border-content式盒模型情况下要作一个尺寸的修正。
在其它情况下应该对该值加以修正
        if(!(navigator.userAgent.toLowerCase().indexOf('msie') != -1&&document.compatMode == 'BackCompat')){
                //除了ie下border-content式盒模型情况外,需要对size加以修正
                var CStyle=document.defaultView?document.defaultView.getComputedStyle(element,null):element.currentStyle;
                if(typeof(size.width)=='number'){
        size.width=size.width-CStyle.paddingLeft.replace(/\D/g,'')-CStyle.paddingRight.replace(/\D/g,'');
                }
                if(typeof(size.height)=='number'){
        size.height=size.height-CStyle.paddingTop.replace(/\D/g,'')-CStyle.paddingBottom.replace(/\D/g,'');
                }
        }
有人认为以上的修正中默认了padding值的单位是px并且为整数,是不对的,
实际上经由我在ie及firefox下的测试,引用最终样式的padding值,必然是整数,并以px为单位。

4、关于把三个函数合并成一个通用动画函数
以上三个函数的主要逻辑都是一样的:
通过setInterval每隔一定时间修改元素的style属性,以达到动画效果。
所以,把三个函数合并成一个函数是可以的
只是需要在修改特定的属性时出于兼容性,必须作些处理,
因为不同的属性其值类型及单位不一样,不同浏览器下也有区别
如透明度 在非ie下为小数,在ie下是一个特别的滤镜设置
如颜色 一般是用16进制,并有#号前缀
预计这个通用的动画函数的参数会有点多,接口类下
function animator(element, interval, start, end, style, speed, tmp, callback){……}
说明
function animator(元素或元素ID, 计时器句柄,起始值,目标值,需修改的属性, 步进值(增量),值转换过滤方法(用于修改非普通递增递减形的数据,比如16进制颜色递增、前缀符号后缀单位修正), 回调函数)
运行示例
function animator('testdiv','bgcolor','#336699','#aabbcc','backgroundColor',2,changeColor,callback)
颜色修改方法示例(仅供参考,未测试)
changeColor=function(start,end,speed){
        var _10to16 = function(color){
                function tmp(index){
                        var        tmp = color[index].toString(16);
                        return tmp.length == 1 ? "0" + tmp : tmp;
                };
                return "#" + tmp(0) + tmp(1) + tmp(2);
        };
        var x16to10  = function(color){
                if(!/^#[0-9A-Fa-f]{3,6}$/i.test(color))retun color;
                function tmp(index){
                        return color.charAt(index);
                };
                color = color.substring(1);
                if(color.length == 3)
                        color = tmp(0) + tmp(0) + tmp(1) + tmp(1) + tmp(2) + tmp(2);
                return [parseInt(tmp(0) + tmp(1), 16), parseInt(tmp(2) + tmp(3), 16), parseInt(tmp(4) + tmp(5), 16)];
        };
        var        color = x16to10(start),
        var        end = x16to10(end),
        var index = 3;
        while(index--)
                color[index] = color[index] < end[index] ? min(color[index] + speed, end[index]) : max(color[index] - speed, end[index]);
        reutn color;
}

有兴趣的诸位可以自己实现一下这个通用动画函数,欢迎回复本帖。

[ 本帖最后由 abeet 于 2010-3-30 15:21 编辑 ]

顶部
satans17
霸王龙
Rank: 6Rank: 6


UID 31115
精华 0
积分 1093
帖子 541
威望 553
阅读权限 70
注册 2005-6-11
来自 湖北
状态 离线
 
发表于 2010-3-25 22:00  资料  个人空间  短消息  加为好友  添加 satans17 为MSN好友 通过MSN和 satans17 交谈 QQ
不错不错~





http://bbs.51js.com/
顶部
hxs_handle
爬虫
Rank: 2



UID 94677
精华 0
积分 86
帖子 38
威望 38
阅读权限 20
注册 2010-2-23
状态 离线
 
发表于 2010-3-26 00:45  资料  个人空间  短消息  加为好友 
好东西啊,先收起来,慢慢研究

顶部
naojin
大恐龙
Rank: 4



UID 94274
精华 0
积分 906
帖子 490
威望 464
阅读权限 50
注册 2008-12-31
状态 离线
 
发表于 2010-3-26 09:15  资料  个人空间  短消息  加为好友 
相当不错

顶部
wangjianbo (星期六的黄昏)
大恐龙
Rank: 4


UID 79170
精华 0
积分 963
帖子 449
威望 441
阅读权限 50
注册 2007-11-20
状态 离线
 
发表于 2010-3-26 09:29  资料  个人空间  短消息  加为好友 
收藏先

顶部
4769946
爬虫
Rank: 2



UID 92347
精华 0
积分 141
帖子 60
威望 57
阅读权限 20
注册 2008-10-17
状态 离线
 
发表于 2010-3-26 12:33  资料  个人空间  短消息  加为好友  添加 4769946 为MSN好友 通过MSN和 4769946 交谈 QQ

顶部
mailangel123
霸王龙
Rank: 6Rank: 6


UID 24899
精华 0
积分 2303
帖子 1369
威望 1375
阅读权限 70
注册 2005-3-12
来自 湖南长沙
状态 离线
 
发表于 2010-3-26 23:08  资料  个人空间  主页 短消息  加为好友  QQ
收藏了,





顶部
richie
爬虫
Rank: 2



UID 50926
精华 0
积分 124
帖子 29
威望 30
阅读权限 20
注册 2009-9-25
状态 离线
 
发表于 2010-3-29 16:59  资料  个人空间  短消息  加为好友 
这个很好啊

顶部
devin87
小虫
Rank: 1



UID 94683
精华 0
积分 3
帖子 2
威望 2
阅读权限 10
注册 2010-3-23
状态 离线
 
发表于 2010-3-30 12:52  资料  个人空间  短消息  加为好友 
好东西……收藏之……

顶部
hk8082
爬虫
Rank: 2



UID 69779
精华 0
积分 171
帖子 62
威望 61
阅读权限 20
注册 2007-5-14
状态 离线
 
发表于 2010-4-2 10:35  资料  个人空间  短消息  加为好友 
收藏

顶部
刺客你也抢
爬虫
Rank: 2



UID 92637
精华 0
积分 82
帖子 14
威望 13
阅读权限 20
注册 2008-10-22
状态 离线
 
发表于 2010-4-2 11:00  资料  个人空间  短消息  加为好友 
http://bbs.51js.com/viewthread.php?tid=84391
效果似曾相识,果果出品

顶部
芙蓉飘雪
小虫
Rank: 1



UID 92778
精华 0
积分 11
帖子 5
威望 4
阅读权限 10
注册 2008-10-26
状态 离线
 
发表于 2010-4-2 17:28  资料  个人空间  短消息  加为好友 
很强大,学习了~~~

顶部
芙蓉飘雪
小虫
Rank: 1



UID 92778
精华 0
积分 11
帖子 5
威望 4
阅读权限 10
注册 2008-10-26
状态 离线
 
发表于 2010-4-2 17:30  资料  个人空间  短消息  加为好友 
怎么防止页面刷新后数据重新提交,一刷界面就出现两条一样的回复~~~

[ 本帖最后由 芙蓉飘雪 于 2010-4-2 17:41 编辑 ]

顶部
 



当前时区 GMT+8, 现在时间是 2010-9-3 23:50
苏ICP备05080427号

Powered by Discuz! 5.5.0  © 2001-2007 51JS.COM
Processed in 0.239049 second(s), 9 queries , Gzip enabled

清除 Cookies - 联系我们 - 无忧脚本 - Archiver