01
Sep 2009

现在网络上有许多用JS实现的动画效果,有些甚至可以和Flash的绚丽相媲美,如果使用纯JS来实现,那么必然要在setTimeout、setInterval和散落在程序各处的判断操作中来回反复,可能一不小心就迷失了方向。

幸好现在有很多JS库包含了动画组件,实现动画效果更加轻松自如。现在最流行的jQuery就包含了这样一个动画组件,它可以帮助我们简洁、高效地实现很多复杂的动画效果。

大家一定有见过谷歌中国的那个导航动画效果吧?没错,就是那个纯JS实现的帧动画。最近在我们的网站改版中,就有一个类似那样的动画,最终效果是这样的:
jqanimation

大家一看就知道了,这个动画就是鼠标移动到某个导航项上面的时候,把当前这一项的说明文字渐显,并把上一次的说明文字渐隐。下面我们就一步一步地把这个效果制作出来。

搭建HTML结构并增加样式

很简单的HTML结构,最终代码如下:

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
  13. 13
  14. 14
  15. 15
  16. 16
  17. 17
  18. 18
  19. 19
  20. 20
  21. 21
  22. 22
  23. 23
  24. 24
  25. 25
  26. 26
  27. 27
  28. 28
  29. 29
  30. 30
  31. 31
  32. 32
  33. 33
  34. 34
  35. 35
  36. 36
  37. 37
  38. 38
  39. 39
  40. 40
  41. 41
  42. 42
  43. 43
  44. 44
  45. 45
  46. 46
  47. 47
  48. 48
  49. 49
  50. 50
  51. 51
  52. 52
  53. 53
  1. <div class="strongfunc" id="FuncDiv">
  2. <ul>
  3. <li class="funcfirst">
  4. <div class="funcimg">
  5. <a href="#"><img src="images/ico_mailfunc1.png" alt="35EQ" /></a>
  6. </div>
  7. <span class="functxt"><a href="#">35EQ</a></span>
  8. <div class="floatinfo" style="left:-32px"><p><span>企业级即时聊天工具</span></p></div>
  9. </li>
  10. <li>
  11. <div class="funcimg">
  12. <a href="#"><img src="images/ico_mailfunc2.png" alt="多线接入" /></a>
  13. </div>
  14. <span class="functxt"><a href="#">多线接入</a></span>
  15. <div class="floatinfo" style="left:-28px"><p><span>彻底解决南北互通问题</span></p></div>
  16. </li>
  17. <li>
  18. <div class="funcimg">
  19. <a href="#"><img src="images/ico_mailfunc3.png" alt="全球转发" /></a>
  20. </div>
  21. <span class="functxt"><a href="#">全球转发</a></span>
  22. <div class="floatinfo" style="left:-38px"><p><span>多IP发送规避IP地址被封</span></p></div>
  23. </li>
  24. <li>
  25. <div class="funcimg">
  26. <a href="#"><img src="images/ico_mailfunc4.png" alt="手机邮箱" /></a>
  27. </div>
  28. <span class="functxt"><a href="#">手机邮箱</a></span>
  29. <div class="floatinfo" style="left:-14px"><p><span>邮箱随着手机走</span></p></div>
  30. </li>
  31. <li>
  32. <div class="funcimg">
  33. <a href="#"><img src="images/ico_mailfunc5.png" alt="短信提醒" /></a>
  34. </div>
  35. <span class="functxt"><a href="#">短信提醒</a></span>
  36. <div class="floatinfo" style="left:-38px"><p><span>让您随时随地把握商机!</span></p></div>
  37. </li>
  38. <li>
  39. <div class="funcimg">
  40. <a href="#"><img src="images/ico_mailfunc6.png" alt="邮件监控" /></a>
  41. </div>
  42. <span class="functxt"><a href="#">邮件监控</a></span>
  43. <div class="floatinfo" style="left:-20px"><p><span>Boss的第三只眼睛</span></p></div>
  44. </li>
  45. <li>
  46. <div class="funcimg">
  47. <a href="#"><img src="images/ico_mailfunc7.png" alt="自摧毁邮件" /></a>
  48. </div>
  49. <span class="functxt"><a href="#">自摧毁邮件</a></span>
  50. <div class="floatinfo" style="left:-6px"><p><span>发送隐形邮件</span></p></div>
  51. </li>
  52. </ul>
  53. </div>

大家应该注意到了里面包含了内联的style部分,其实是因为这一块提示文字准备用绝对定位实现,而每一块文字的长度又不一样,所以必须单独定义,给每一项添加ID,然后在样式表中设置也是可以的,这个就让大家自己去权衡吧。

然后对这部分结构添加样式,在处理了主流浏览器的样式兼容性之后,最终样式如下:

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
  13. 13
  14. 14
  15. 15
  16. 16
  1. <style type="text/css">
  2. body{ font:12px Arial, Helvetica, sans-serif;}
  3. a{ color:#5d5d5d; text-decoration:none;}
  4. .strongfunc{ position:relative; zoom:1;}
  5. .strongfunc ul{ margin:40px 0 0 80px; zoom:1; list-style:none;}
  6. .strongfunc li{ position:relative; float:left; width:70px; height:75px; padding-left:9px; background:url(images/ico_funcpoint.png) no-repeat left 27px; text-align:center;}
  7. .strongfunc .funcfirst{ padding:0; background:none;}
  8. .funcimg{ position:relative;}
  9. .funcimg a{ display:table-cell; vertical-align:middle; width:70px; height:60px; line-height:60px; *display:block; *font-size:45px;}
  10. .funcimg a img{ vertical-align:middle; border:0;}
  11. .functxt{ white-space:nowrap;}
  12. .floatinfo,.floatinfo p,.floatinfo p span{ background:url(images/floathint_bg.png) no-repeat; line-height:23px;}
  13. .floatinfo{ display:none; position:absolute; bottom:60px; white-space:nowrap; background-position:0 -7px;}
  14. .floatinfo p{ margin:0; padding:0; margin-left:12px; padding-right:12px; background-position:right -7px;}
  15. .floatinfo p span{ display:block; background-position:center 22px; height:29px;}
  16. </style>

接下来就是最后的步骤了,为这个页面添加脚本行为:

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
  13. 13
  14. 14
  15. 15
  16. 16
  17. 17
  18. 18
  19. 19
  20. 20
  21. 21
  22. 22
  23. 23
  24. 24
  25. 25
  1. $(document).ready(function(){
  2. //缓存外层容器及动画列表项的jQuery包装集
  3. var funcdiv = $("#FuncDiv"),actAreas = funcdiv.find("li");
  4.  
  5. //给动画列表项增加鼠标移入事件
  6. actAreas.hover(function(){
  7. showFloat($(this));
  8. },function(){});
  9.  
  10. function showFloat(actArea){//定义显示提示信息动画的方法
  11. var floatdiv = actArea.find("div.floatinfo");  //获取当前提示信息
  12. var curfloat = $.data(funcdiv,"curfloat");  //获取上一次鼠标移入时弹出的提示信息
  13. if(curfloat){
  14. if(curfloat[0] == floatdiv[0]) return;
  15. curfloat.stop()
  16. .animate({opacity:0,bottom:"60px"},200);  //如果已经有信息显示并且不是当前鼠标处的这一条,就用动画使它渐隐
  17. }
  18. $.data(funcdiv,"curfloat",floatdiv);  //标记当前提示信息
  19. floatdiv.stop()
  20. .css({opacity:0,display:"block"})
  21. .animate({opacity:1,bottom:"70px"},200);  //用动画使当前鼠标处的信息渐显
  22. }
  23.  
  24. showFloat(actAreas.eq(0));  //页面加载完成后默认显示第一项信息
  25. });

注意到curfloat.stop()和floatdiv.stop()这两个地方,为什么要用stop()呢?因为jQuery的动画机制是默认把动画加入队列里顺序播放的,一段动画播放完才会播放下一段,如果不加stop()的话,当鼠标在各个项之间来回移动时,就会出现提示信息此起彼伏了好几遍才结束的现象,就像酱紫:
jqanimation1

好了,页面完成了!点击这里查看最终效果

其中涉及到一些jQuery的基本函数和方法,不了解的可以去这个中文API查看:http://jquery-api-zh-cn.googlecode.com/svn/trunk/xml/jqueryapi.xml
或者英文原版的:http://www.visualjquery.com/

推荐(3)
收藏

网友评论:

  1. Alex 说:

    :lol: 沙发很难抢啊。。

    [回复]

    Mj 回复:

    真的吗,那你什么抢到的

    [回复]

  2. Plaris 说:

    奥特曼打小怪兽~~~~~

    [回复]

  3. 漫声细语 说:

    支持一下

    [回复]

  4. 虫二 说:

    甲硬阿~,很好用哦,攒一下 。

    [回复]

  5. Juns 说:

    :grin: 大师出品果然就是精品哈。好的设计也要有好的执行才行。
    现在很多网站都不太用flash直接用JS搞定,这是个趋势?

    [回复]

  6. bzbk 说:

    很受用,谢谢分享。

    另:
    一直垂涎35首页的flash展示,网上轮播广告多是图片轮换,换来换去用的自己都烦了,35这里支持flash轮换的让人眼前一亮。

    看不明白,网上也找不到办法,只好到这里发问,望不吝赐教。

    邮箱justontry@126.com

    qq:806755075 谢谢,盼复。

    [回复]

    Yang 回复:

    感谢您的回复,关于首页Flash轮换效果,届时将在博文内容中体现 :mrgreen:

    [回复]

    bzbk 回复:

    谢谢,期待中。。。

    [回复]

发表评论: