现在网络上有许多用JS实现的动画效果,有些甚至可以和Flash的绚丽相媲美,如果使用纯JS来实现,那么必然要在setTimeout、setInterval和散落在程序各处的判断操作中来回反复,可能一不小心就迷失了方向。
幸好现在有很多JS库包含了动画组件,实现动画效果更加轻松自如。现在最流行的jQuery就包含了这样一个动画组件,它可以帮助我们简洁、高效地实现很多复杂的动画效果。
大家一定有见过谷歌中国的那个导航动画效果吧?没错,就是那个纯JS实现的帧动画。最近在我们的网站改版中,就有一个类似那样的动画,最终效果是这样的:

大家一看就知道了,这个动画就是鼠标移动到某个导航项上面的时候,把当前这一项的说明文字渐显,并把上一次的说明文字渐隐。下面我们就一步一步地把这个效果制作出来。
搭建HTML结构并增加样式
很简单的HTML结构,最终代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
| <div class="strongfunc" id="FuncDiv"> <ul> <li class="funcfirst"> <div class="funcimg"> <a href="#"><img src="images/ico_mailfunc1.png" alt="35EQ" /></a> </div> <span class="functxt"><a href="#">35EQ</a></span> <div class="floatinfo" style="left:-32px"><p><span>企业级即时聊天工具</span></p></div> </li> <li> <div class="funcimg"> <a href="#"><img src="images/ico_mailfunc2.png" alt="多线接入" /></a> </div> <span class="functxt"><a href="#">多线接入</a></span> <div class="floatinfo" style="left:-28px"><p><span>彻底解决南北互通问题</span></p></div> </li> <li> <div class="funcimg"> <a href="#"><img src="images/ico_mailfunc3.png" alt="全球转发" /></a> </div> <span class="functxt"><a href="#">全球转发</a></span> <div class="floatinfo" style="left:-38px"><p><span>多IP发送规避IP地址被封</span></p></div> </li> <li> <div class="funcimg"> <a href="#"><img src="images/ico_mailfunc4.png" alt="手机邮箱" /></a> </div> <span class="functxt"><a href="#">手机邮箱</a></span> <div class="floatinfo" style="left:-14px"><p><span>邮箱随着手机走</span></p></div> </li> <li> <div class="funcimg"> <a href="#"><img src="images/ico_mailfunc5.png" alt="短信提醒" /></a> </div> <span class="functxt"><a href="#">短信提醒</a></span> <div class="floatinfo" style="left:-38px"><p><span>让您随时随地把握商机!</span></p></div> </li> <li> <div class="funcimg"> <a href="#"><img src="images/ico_mailfunc6.png" alt="邮件监控" /></a> </div> <span class="functxt"><a href="#">邮件监控</a></span> <div class="floatinfo" style="left:-20px"><p><span>Boss的第三只眼睛</span></p></div> </li> <li> <div class="funcimg"> <a href="#"><img src="images/ico_mailfunc7.png" alt="自摧毁邮件" /></a> </div> <span class="functxt"><a href="#">自摧毁邮件</a></span> <div class="floatinfo" style="left:-6px"><p><span>发送隐形邮件</span></p></div> </li> </ul> </div>
|
大家应该注意到了里面包含了内联的style部分,其实是因为这一块提示文字准备用绝对定位实现,而每一块文字的长度又不一样,所以必须单独定义,给每一项添加ID,然后在样式表中设置也是可以的,这个就让大家自己去权衡吧。
然后对这部分结构添加样式,在处理了主流浏览器的样式兼容性之后,最终样式如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| <style type="text/css"> body{ font:12px Arial, Helvetica, sans-serif;} a{ color:#5d5d5d; text-decoration:none;} .strongfunc{ position:relative; zoom:1;} .strongfunc ul{ margin:40px 0 0 80px; zoom:1; list-style:none;} .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;} .strongfunc .funcfirst{ padding:0; background:none;} .funcimg{ position:relative;} .funcimg a{ display:table-cell; vertical-align:middle; width:70px; height:60px; line-height:60px; *display:block; *font-size:45px;} .funcimg a img{ vertical-align:middle; border:0;} .functxt{ white-space:nowrap;} .floatinfo,.floatinfo p,.floatinfo p span{ background:url(images/floathint_bg.png) no-repeat; line-height:23px;} .floatinfo{ display:none; position:absolute; bottom:60px; white-space:nowrap; background-position:0 -7px;} .floatinfo p{ margin:0; padding:0; margin-left:12px; padding-right:12px; background-position:right -7px;} .floatinfo p span{ display:block; background-position:center 22px; height:29px;} </style>
|
接下来就是最后的步骤了,为这个页面添加脚本行为:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| $(document).ready(function(){ //缓存外层容器及动画列表项的jQuery包装集 var funcdiv = $("#FuncDiv"),actAreas = funcdiv.find("li"); //给动画列表项增加鼠标移入事件 actAreas.hover(function(){ showFloat($(this)); },function(){}); function showFloat(actArea){//定义显示提示信息动画的方法 var floatdiv = actArea.find("div.floatinfo"); //获取当前提示信息 var curfloat = $.data(funcdiv,"curfloat"); //获取上一次鼠标移入时弹出的提示信息 if(curfloat){ if(curfloat[0] == floatdiv[0]) return; curfloat.stop() .animate({opacity:0,bottom:"60px"},200); //如果已经有信息显示并且不是当前鼠标处的这一条,就用动画使它渐隐 } $.data(funcdiv,"curfloat",floatdiv); //标记当前提示信息 floatdiv.stop() .css({opacity:0,display:"block"}) .animate({opacity:1,bottom:"70px"},200); //用动画使当前鼠标处的信息渐显 } showFloat(actAreas.eq(0)); //页面加载完成后默认显示第一项信息 });
|
注意到curfloat.stop()和floatdiv.stop()这两个地方,为什么要用stop()呢?因为jQuery的动画机制是默认把动画加入队列里顺序播放的,一段动画播放完才会播放下一段,如果不加stop()的话,当鼠标在各个项之间来回移动时,就会出现提示信息此起彼伏了好几遍才结束的现象,就像酱紫:

好了,页面完成了!点击这里查看最终效果
其中涉及到一些jQuery的基本函数和方法,不了解的可以去这个中文API查看:http://jquery-api-zh-cn.googlecode.com/svn/trunk/xml/jqueryapi.xml
或者英文原版的:http://www.visualjquery.com/
Alex 2009-09-02 10:53 am 说:
[回复]
Mj 2009-09-02 10:58 am 回复:
真的吗,那你什么抢到的
[回复]
Plaris 2009-09-02 12:24 pm 说:
奥特曼打小怪兽~~~~~
[回复]
漫声细语 2009-09-03 3:34 pm 说:
支持一下
[回复]
虫二 2009-09-04 9:12 am 说:
甲硬阿~,很好用哦,攒一下 。
[回复]
Juns 2009-09-05 11:33 am 说:
现在很多网站都不太用flash直接用JS搞定,这是个趋势?
[回复]
bzbk 2009-09-25 9:40 am 说:
很受用,谢谢分享。
另:
一直垂涎35首页的flash展示,网上轮播广告多是图片轮换,换来换去用的自己都烦了,35这里支持flash轮换的让人眼前一亮。
看不明白,网上也找不到办法,只好到这里发问,望不吝赐教。
邮箱justontry@126.com
qq:806755075 谢谢,盼复。
[回复]
Yang 2009-09-25 9:52 am 回复:
感谢您的回复,关于首页Flash轮换效果,届时将在博文内容中体现
[回复]
bzbk 2009-09-25 10:36 am 回复:
谢谢,期待中。。。
[回复]