锁定老帖子 主题:google首页动画效果
该帖已经被评为良好帖
|
|
---|---|
作者 | 正文 |
发表时间:2008-12-04
最后修改:2009-02-13
原本以为google首页的动画是动画图片,后来发现是用js写的。 好奇,就仿着google首页的动画用jquery试着写了个。 难点就在切图和定位上。
下面讲一下这两个难点。 切图 : a :
这里我拉了些参考线,便于看得更清楚些。每个方框里的宽度高度都相同。然后用setTimeout延时,间隔相等的时间去改变背景图片的位置,连贯起来看起来就像是个小flash动画
for(var i=0; i<5; i++){ setTimeout("navScrollBg(" + i + "," + index +","+flag+")",40 * i); } 这里的i<5是看这个动画有几步,如上图是5步。
b :mourseover和mourseout的动画顺序刚好相反,利用数组排序
var a=[0,52,104,156,208]; var spans = $("#info_" + index).find("span"); if(flag == 0){ spans.css("background-position",(0 - a[i]) + "px" + " " + (0-((index-1)*37)) +"px"); } else{ a.sort(function(b,c){return c-b;}); spans.css("background-position",(0 - a[i]) + "px" + " " + (0-((index-1)*37)) +"px"); } 当flag=0,var a=[0,52,104,156,208]; 当flag=1,var a=[208,156,104,52,0];
定位 : 对于(上图)icon上方的文字描述的圆角背景框 1.如果圆角框做成背景图就没什么难的 2.如果用css写个圆角框,还是个比较新鲜的尝试(平时做圆角框都是切图的,因为切图简单些)。 google首页的圆角框是用css写的,为了练一下技术,我也用css尝试了下,无非就是要多加几个标签。如下: <style type="text/css"> div.text{text-align:center;position:absolute;left:0;top:0;cursor:pointer;display:none;} div.text div.border{white-space:nowrap;padding:2px;line-height:14px;display:block;_padding-top:4px;} div.text div.leftright{height:1px;overflow:hidden;clear:both;} div.text div.leftright .left{width:1px;height:1px;float:left;margin-left:1px;} div.text div.leftright .right{width:1px;height:1px;float:right;margin-right:1px;} div.text div.topline{margin:0 2px;height:1px;overflow:hidden;} div.text div.arrow{background:url(images/google_icons.jpg) no-repeat -260px 0;width:8px;height:4px;margin:0 auto;position:relative;top:-1px;overflow:hidden;} div.text1 div.border{border-left:1px solid #54a70d;border-right:1px solid #54a70d;} div.text1 div.leftright .left{background-color:#54a70d;} div.text1 div.leftright .right{background-color:#54a70d;} div.text1 div.topline{background-color:#54a70d;} div.text1 div.arrow{background-position:-260px 0;} </style> <div class="text text1"> <div class="topline"></div> <div class="leftright"> <div class="left"></div> <div class="right"></div> </div> <div class="border"> <span>搜索热门网络视频</span> </div> <div class="leftright"> <div class="left"></div> <div class="right"></div> </div> <div class="topline"></div> <div class="arrow"></div> </div> 这里我提了个text公用样式出来了,text1,text2....只是加了不同的颜色,代码上精减了不少。
对于icon上方的文字描述的定位,我必须始终让它的中心和icon的中心在一条垂直直线上。
a 那么首先我要对包文字描述的div(以下简称div)绝对定位。
b 然后取到div内包文字描述的span的宽度,加上左右的padding值(例子中取的值是10px),赋给div的宽度(以下简称textWidth)。 这样不管我文字描述有多长,div的宽度都会动态的获取。
var textWidth = $("div.text"+index).show().find("span").width() + 14; $("div.text"+index).width(textWidth);
c 最后用getBoundingClientRect()取到包icon和标签的a(以下简称a)在浏览器中距左上角的left(以下简称elementLeft)和top(以下简称elementTop)值; div绝对定位的 top值:elementTop-适当值; left值:elementLeft+icon宽度-div的宽度/2
var elementLeft = $("li#info_" +index +" a").get(0).getBoundingClientRect().left; var elementTop = $("li#info_" +index +" a").get(0).getBoundingClientRect().top; var textLeft = elementLeft + 24 - parseInt(textWidth) / 2; var textTop = elementTop - 32; $("div.text"+index).css({"left":textLeft+"px","top":textTop+"px"});
c(补充+纠正) : 今天重新看了下,发现getBoundingClientRect()方法不兼容chrome浏览器,稍作些修改,就是用jquery的offset()方法代替了getBoundingClientRect(),并把jquery更新到了1.3,修改版是兼容chrome的
var elementLeft = $("li#info_" +index +" a").offset().left; var elementTop = $("li#info_" +index +" a").offset().top; var textLeft = elementLeft + 26 - parseInt(textWidth) / 2; var textTop = elementTop - 32; $("div.text"+index).css({"left":textLeft+"px","top":textTop+"px"}); 这里的"26“是icon宽度/2,即52/2 所以: top值:elementTop-适当值; left值:elementLeft+icon宽度/2-div的宽度/2 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2008-12-04
good,不过firefox下提示样式有问题
|
|
返回顶楼 | |
发表时间:2008-12-04
lvbaosong 写道 good,不过firefox下提示样式有问题 firefox下有啥问题?我测过,没有问题哦 |
|
返回顶楼 | |
发表时间:2008-12-04
不错不错,动画过渡时间再稍微长点就好
|
|
返回顶楼 | |
发表时间:2008-12-04
俺早就发现了。
|
|
返回顶楼 | |
发表时间:2008-12-04
学习了..!
|
|
返回顶楼 | |
发表时间:2008-12-05
看着做都不难,关键是 需求->发现问题->解决方案->动手解决问题 的前三步
|
|
返回顶楼 | |
发表时间:2008-12-05
很嗨,很强大!!
|
|
返回顶楼 | |
发表时间:2008-12-05
你简直太强大了
|
|
返回顶楼 | |
发表时间:2008-12-05
好像在firefox下真有问题,Google的首页在firefox下不显示这一行动画。。。
|
|
返回顶楼 | |