Bookmark and Share

Lee's 程序人生

HTML CSS Javascript XML AJAX ATLAS C# C++ 数据结构 软件工程 设计模式 asp.net Java 数字图象处理 Sql 数据库
  博客园  :: 首页  :: 新随笔  :: 联系 :: 管理

google首页动画效果

Posted on 2008-12-06 10:04  analyzer  阅读(1230)  评论(0)    收藏  举报

 

原本以为google首页的动画是动画图片,后来发现是用js写的。

好奇,就仿着google首页的动画用jquery试着写了个。

难点就在切图和定位上。

 

下面讲一下这两个难点。

切图

a

 

 

这里我拉了些参考线,便于看得更清楚些。每个方框里的宽度高度都相同。然后用setTimeout延时,间隔相等的时间去改变背景图片的位置,连贯起来看起来就像是个小flash动画

 

Js代码 复制代码
  1. for(var i=0; i<5; i++){   
  2.             setTimeout("navScrollBg(" + i + "," + index +","+flag+")",40 * i);     
  3.         }  
for(var i=0; i<5; i++){
setTimeout("navScrollBg(" + i + "," + index +","+flag+")",40 * i);
}

 

这里的i<5是看这个动画有几步,如上图是5步。

 

b :mourseover和mourseout的动画顺序刚好相反,利用数组排序

 

Js代码 复制代码
  1. var a=[0,52,104,156,208];      
  2.         var spans = $("#info_" + index).find("span");   
  3.         if(flag == 0){   
  4.             spans.css("background-position",(0 - a[i]) + "px" + " " + (0-((index-1)*37)) +"px");               
  5.         }   
  6.         else{   
  7.             a.sort(function(b,c){return c-b;});            
  8.             spans.css("background-position",(0 - a[i]) + "px" + " " + (0-((index-1)*37)) +"px");   
  9.         }  
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尝试了下,无非就是要多加几个标签。如下:

Html代码 复制代码
  1. <style type="text/css">  
  2. div.text{text-align:center;position:absolute;left:0;top:0;cursor:pointer;display:none;}   
  3. div.text div.border{white-space:nowrap;padding:2px;line-height:14px;display:block;_padding-top:4px;}   
  4. div.text div.leftright{height:1px;overflow:hidden;clear:both;}   
  5. div.text div.leftright .left{width:1px;height:1px;float:left;}   
  6. div.text div.leftright .right{width:1px;height:1px;float:right;}   
  7. div.text div.topline{margin:0 1px;height:1px;overflow:hidden;}   
  8. 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;}   
  9.   
  10. div.text1 div.border{border-left:1px solid #54a70d;border-right:1px solid #54a70d;}   
  11. div.text1 div.leftright .left{background-color:#54a70d;}   
  12. div.text1 div.leftright .right{background-color:#54a70d;}   
  13. div.text1 div.topline{background-color:#54a70d;}   
  14. div.text1 div.arrow{background-position:-260px 0;}   
  15. </style>  
  16. <div class="text text1">  
  17.     <div class="topline"></div>  
  18.     <div class="leftright">  
  19.         <div class="left"></div>  
  20.         <div class="right"></div>  
  21.     </div>  
  22.     <div class="border">  
  23.         <span>搜索热门网络视频</span>  
  24.     </div>  
  25.     <div class="leftright">  
  26.         <div class="left"></div>  
  27.         <div class="right"></div>  
  28.     </div>  
  29.     <div class="topline"></div>  
  30.     <div class="arrow"></div>  
  31. </div>  
<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;}
div.text div.leftright .right{width:1px;height:1px;float:right;}
div.text div.topline{margin:0 1px;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的宽度都会动态的获取。

 

Js代码 复制代码
  1. var textWidth = $("div.text"+index).show().find("span").width() + 14;   
  2. $("div.text"+index).width(textWidth);  
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

 

Js代码 复制代码
  1. var elementLeft = $("li#info_" +index +" a").get(0).getBoundingClientRect().left;    
  2. var elementTop = $("li#info_" +index +" a").get(0).getBoundingClientRect().top;   
  3. var textLeft = elementLeft + 24 - parseInt(textWidth) / 2;   
  4. var textTop = elementTop - 32;   
  5. $("div.text"+index).css({"left":textLeft+"px","top":textTop+"px"});  
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"});

 

  • 4ed96a5f-1d8b-3e6c-bdf6-d511e1da6dc5-thumb
  • 大小: 19.2 KB
  • Bb70bd13-a4d8-347f-a1b7-0ab063c5d113-thumb 
  • 大小: 33.6 KB

/Files/analyzer/google_demo.rar