打印

[原创]向flash看齐——简简单单玩动画效果[更新]

简单动画函数:
优点:几百字节的代码即可实现缓冲动画效果,跨浏览器
缺点:一次只能应用于单个css属性(width/left/margin-Top)
ie6/ie7/ff/op下均ok,safari下未测试,应该也没问题。想实现多维度的动画(如width/height同时变化),调用两次即可。
复制内容到剪贴板
代码:
function ani(obj,what,value,callback){  //长CSS属性必须写成"margin-Top"的形式
    var tid;
    var ctrVal = getStyle(obj,what)||0;
    var stp = (value-ctrVal)/7;
    var _what = what.replace(/-/,"");
    if(Math.abs(stp)>=1){
        obj.style[_what] = ctrVal + stp + "px";
        tid = setTimeout(function(){
            ani(obj,what,value,callback);
            }
        ,40);
    }
    else{
        if(Math.abs(stp)>0.2){
            obj.style[_what]=ctrVal + (stp>0?1:-1) + "px";
            tid=setTimeout(function(){
                ani(obj,what,value,callback);
                }
            ,40);
        }
        else{
            obj.style[_what]=value+"px";
            if((typeof callback).toLowerCase() =="function")
                callback();
        }
    }
}
拓展1:

 提示:您可以先修改部分代码再运行
此例中,连点左键时会出现抖动现象,是因为多次执行结果作用与同一个元素上造成。为了保持函数短小,我未作此判断机制,使用时请自行做逻辑判断。

拓展2:

 提示:您可以先修改部分代码再运行
复杂动画函数:
优点:调用一次即可实现多个“维度”的动画效果
复制内容到剪贴板
代码:
function animate(obj,params,speed,callback){
    this.obj = (typeof obj).toLowerCase()=='object'?obj:$(obj);
    this.rate = (typeof speed).toLowerCase() =="string"?({slow:1/7,normal:1/5,fast:1/3}[speed]):0;
    this.isCB = ((typeof callback).toLowerCase() =="function");
    var __self  = this ,
    flag=[0,0,0,0] , //用以确定动画时候完成
    interval = 40 ,
    timerID = null ;
    this.start = function(){
        this.loop();
    }
    this.loop = function(){
        var k = -1;
        for(var attr in params){
            k++;
            if(flag[k]==1)
                continue; //如果完成,跳过该属性
            var crtDis = getStyle(__self.obj,attr);
            var togoDis = params[attr] - crtDis;
            var step = togoDis*__self.rate;
            if( Math.abs(step)>=1 ){
                __self.obj.style[attr] = crtDis + step + "px";
            }
            else{
              if(Math.abs(step)>__self.rate){ //即当togoDis<1/rate px时
                __self.obj.style[attr] = crtDis + (togoDis>0?1:-1)+ "px";
              }
              else{
                __self.obj.style[attr] = params[attr] + "px";
                flag[k] = 1;
                if(flag.toString().indexOf("0")==-1){
                  if(__self.isCB)
                    callback.call(__self.obj);
                  return false; // 终止程序
                } //if
              } //else
            } //else
        } //for
        timerID = setTimeout(arguments.callee,interval);
    } //loop
}
拓展:

 提示:您可以先修改部分代码再运行
此例在IE6/IE7/op下的效果较好,FF下不流畅,大概是由于程序效率和FF的js处理效率不高的原因。

[ 本帖最后由 zcfg 于 2008-6-16 17:58 编辑 ]
Thank you.

期待下文。
不错的效果,期待改进,比方说加入文字。
Discuz版版

TOP

认证您的手机,获得手机认证图标, 更多手机认证的好处
引用:
原帖由 Nicollelord 于 2008-6-15 00:22 发表
不错的效果,期待改进,比方说加入文字。
lz什么时候续啊?


 提示:您可以先修改部分代码再运行
如何把这个1234修改到图片上面呢?像 www.xyqb.net 这个效果!高手请指教谢谢

[ 本帖最后由 kf2s 于 2008-6-16 14:38 编辑 ]
www.xyqb.net

TOP

引用:
原帖由 kf2s 于 2008-6-16 14:36 发表
如何把这个1234修改到图片上面呢?像 www.xyqb.net 这个效果!高手请指教谢谢
你和三楼说的是一回事 自己动手改改html/css就ok了

 提示:您可以先修改部分代码再运行
[ 本帖最后由 zcfg 于 2008-6-16 18:15 编辑 ]

TOP

效果很不错,MARK

TOP

最终效果里连续点击的话出现抖动.
Thr's an I in happiness, thr's no Y in happiness

TOP

最终代码有问题各位兄弟,慢点点就不会有什么问题,要是连续快点,就会出现严重的抖动,没有办法看了,呵呵,希望能纠正

TOP

感觉JS比较酷的 收藏了 谢谢LZ
好好学习,天天向上!

TOP

不错收藏一下
www.designnull.com

TOP

真棒啊 收藏啦

TOP

不赖~学习了~
-若无其事-

TOP

而且在事件没完成就点其他图片会出现前一个图片不能回到初始位置的情况

TOP

ie7,好像有问题,点击后一直在抖动!
http://updayday.com

TOP

谢谢

TOP