`
txbhcml
  • 浏览: 1956 次
  • 性别: Icon_minigender_1
  • 来自: 上海
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

google首页效果 js特效 全注释 记得当时分析了好长时间

阅读更多
最近将以前分析的google首页效果 拿了出来,发现挺有意思  拿来和大家分享一下

index.js


(//匿名函数,不需要被调用直接运行
  function()
  {
   //浏览器类型
    var e=navigator.userAgent.toLowerCase();
    //是否是下面各种浏览器(opera,ie,safari)
    google.isOpera = e.indexOf("opera")!=-1;
    google.isIE = document.all&&e.indexOf("msie")!=-1&&!google.isOpera;
    google.isSafari = e.indexOf("safari")!=-1;
    /*
    * obj-- 对象
    * b--mouseover,mouseout
    * evet--onmouseover,onmouseout
    * fuc--为事件响应调用的方法
    */
    //为邦定事件,onmouseover,onmouseout  
    window.google.bind = function(obj,evet,func)
    {
        var onevet = "on"+evet;/*onevet=onmouseover,onmouseout之类的事件*/
        if (obj.addEventListener)
            obj.addEventListener(evet,func,false);
        else
        {
            if(obj.attachEvent)
                obj.attachEvent(onevet,func);
            else
            {
                var h = obj[onevet];
                obj[evet] = function()
                {
                    var f = h.apply(this,arguments);
                    var g = callFunc.apply(this,arguments);
                    return (f == undefined)?g:(g == undefined?f:g&&f);
                }
            }
        }
     };
  }
)();

(
  function()
  {
    var PIC = "tool.png";
    //return all the onmouseover,onmouseout,onclick info
    //a:color
    //b:tooltip鼠标放上去的文字
    //c:name网站上显示的名字
    //d:url鼠标点击之后的超连接
    //e:yAdjust 显示图片的位置调整
    function p(d,c,b,a,e)
    {
      return {url:d,name:c,message:b,color:a,yAdjust:e}
    }
    var qutos= [
p("http://www.***.com/","<font size=-1>博客</font>","I","#54a70d",[2,5]),
p("http://www.***.com/","<font size=-1>工作室</font>","LOVE","#3b79e7",[2,5]),
p("http://www.***.com/","<font size=-1>资源</font>","YOU","#96cfec",[3,7]),
p("http://www.***.com/","<font size=-1>成功案例</font>","SO","#e8d40f",[4,9]),
p("http://www.***.com/","<font size=-1>资源共享</font>","MUCH!","#ea504c",[3,7])
   ];
     /*{icon:obj,element:this.element}*/
     var cacheObjs = [];
    /*
    *
    */
    function isac(url,name)
    {
    while (name&&url != name)
    {
    name = name.parentNode;
    }
    return name==url;
    }

    /*
    * 这个是bind方法中的参数,产生事件后调用的方法
    * param:d--mouseover
    */
    var DURATION1 = 100;
    function callFunc(evet,count)
    {
        return function(eventA)
        { 
          eventA = eventA || window.event;
            var cacheObj = cacheObjs[count];
            var isMouseOver = (evet == "mouseover");
            var element = eventA.target || eventA.srcElement;//event.srcElement触发事件的元素
            var currObj = eventA.relatedTarget || (isMouseOver?eventA.fromElement:eventA.toElement);
            var h =!currObj || isac(cacheObj.element,currObj);
            var i = isac(cacheObj.element,element);
            if (isMouseOver&&!h||!isMouseOver&&(!currObj||i&&!h))
            {
                var icon = cacheObj.icon;
                icon.mouseTimeout = window.clearTimeout(icon.mouseTimeout);
                var flag = isMouseOver?1:-1;
                if(icon.flag != flag)
                {   /*这个导致active只执行一次,鼠标移入移出每一次动作切换调用一次*/
                    icon.mouseTimeout = window.setTimeout(icon.active(flag,undefined),isMouseOver?DURATION1/3:DURATION1)
                }
            }
        }
    }
    /*
    * obj 对象
    * evet 事件
    * count 长度
    */
    function bindEvent(obj,evet,count)
    {
        google.bind(obj,evet,callFunc(evet,count));
    }
    /*  页面元素的提示信息
    *   param:obj:setDivObj;Ourl:超链接;Otext:显示提示;
    */
    function show(obj,Ourl,Otext)
    {
      this.obj = obj;
      var divObj = document.createElement("div");
      var color = obj.color;
      var bgcolor = "background-color:" + color;
      var f = "width:1px;height:1px;" + "background-color:" + color + ";float:";
      var h = '<div style="height:1px;overflow:hidden">'+'<div style="'+f+'left"></div>'+'<div style="'+f+'right"></div></div>';
      var i = "margin:0 1px;height:1px;overflow:hidden;" + bgcolor;
      divObj.innerHTML = '<div style="display:none;position:absolute;top:0;left:0;z-index:2;background:#fff;cursor:pointer;cursor:hand">'
                            + '<a href="'+Ourl+'" style="color:#444;text-decoration:none" target=_blank>'/*提示信息的超链接*/
                                + '<div style="' + i + '"></div>'/*提示信息上边框*/
                                + '<div style="text-align:center;border-left:1px solid;border-right:1px solid;border-color:'+color+'">'/*提示信息左右边框*/
                                    + ''
                                    + '<div style="margin:0 auto;white-space:nowrap;padding:.2em 0 0"><font size=-1><span>'+Otext+"</span></font></div>"/*提示信息*/
                                    + h +'</div>'
                                + '<div style="'+i+'"></div>'/*提示信息下边框*/
                                + '<div style="height:4px" align="center">'
                                    + '<div style="position:relative;top:-1px;z-index:3;width:8px;overflow:hidden;margin:0 auto;height:4px;background:no-repeat -260px '+-obj.coordinates[0].y+'px"></div></div></a></div>';/*提示信息的边框下箭头*/
      this.ObjSpan = divObj.getElementsByTagName("span")[0];
      document.body.appendChild(divObj);//直接将元素的提示信息放在body下
      divObj.firstChild.firstChild.lastChild.firstChild.style.backgroundImage = "url("+PIC+")";
      this.tagA = divObj.firstChild;//提示信息的超链接
      var count = cacheObjs.length;
      cacheObjs.push({icon:obj,element:this.tagA});
      bindEvent(this.tagA,"mouseover",count);   //给超链接绑定事件
      bindEvent(this.tagA,"mouseout",count);
    }
    show.prototype.play = function(num)
    {
        var divObj = this.obj.tagA.firstChild;
        var positionA = {left:-divObj.offsetLeft,top:0};
        while (divObj)
        {
            positionA.left += divObj.offsetLeft;
            positionA.top += divObj.offsetTop;
            divObj = divObj.offsetParent;
        }
        var styleA = this.tagA.style;//这里变量styleA指向this.tagA.style,相当于缩写
        if(styleA.display == "none")
        {
            styleA.visibility = "hidden";
            styleA.display = "block";
        }
        var heightA = this.tagA.offsetHeight;
        var widthA = this.ObjSpan.offsetWidth+14;
        if (styleA.visibility == "hidden")
        {
            styleA.display = "none";
            styleA.visibility ="visible";
        }
        styleA.width = widthA + "px";
        positionA.left -= (widthA - this.obj.tagA.parentNode.offsetWidth)/2;
        positionA.top -= heightA - 3;
        positionA.top += 20*Math.pow(1 - num/this.obj.countA,3);
        styleA.left = positionA.left + "px";
        styleA.top = positionA.top + "px";
        //d--[0,1,2]
        if (num == 0||this.obj.positionA < 0)
            styleA.display = "none";
        else
        {
            styleA.display = "";
            var f = num/this.obj.countA;
            //设置提示信息的透明度,有一个渐变过程
            if("opacity" in styleA)
                styleA.opacity = f;
            else
            {
                if("MozOpacity" in styleA)
                    styleA.MozOpacity = f;
                else
                {
                    if("KhtmlOpacity" in styleA)
                        styleA.KhtmlOpacity = f;
                    else
                    {
                        if("filter" in styleA)
                            styleA.filter = "alpha(opacity=" + f*100 + ")";
                    }
                }
            }
        }
    };

//第三步:设置图片坐标和绑定事件
/*
*   param:Ocolor:颜色;tagA:超链接元素,coordinates:坐标;Ourl:超链接指向地址,Otext:页面显示的文本
*/
    function setDivObj(tagA,coordinates,Ocolor,Ourl,Otext)
    {
      this.tagA = tagA;//页面元素最外面套的超链接
      this.mouseTimeout = null;
      this.countA = coordinates.length-1;//显示的每个元素动作次数
      this.coordinates = coordinates;
      this.color = Ocolor;//颜色
      this.PicDiv = tagA.getElementsByTagName("div")[1];//页面元素的动态图片
      this.ObjShow = new show(this,Ourl,Otext);/*计算坐标和显示图片*/
      this.flag = -1;//元素的状态(-1:mouseover效果;1:mouseout效果)
      this.num = 1;//元素的动作的步骤数目
      var count = cacheObjs.length;
      /*将来要通过cacheObjs[count]找到{icon:this,element:tagA}这个对象*/
      cacheObjs.push({icon:this,element:tagA});
      bindEvent(tagA,"mouseover",count);//绑定mouseover事件
      bindEvent(tagA,"mouseout",count);//绑定mouseout事件
    }

    setDivObj.prototype.active= function(flag,num)  //使用闭包,为其他函数中settimeout反复调用产生动态效果
    {
       var obj = this;
       return function(){obj.func(flag,num)}
    };

    setDivObj.prototype.func = function(flag,num)
    {
        if (flag)     
        {
          this.flag = flag;
          this.mouseTimeout = window.clearTimeout(this.mouseTimeout);
          this.timeOut = window.clearTimeout(this.timeOut)
        }
        (typeof num != "undefined")&&(this.num = num);
        var coordinate = this.coordinates[this.num];
        /*动态图片的动态效果,变换*/
        this.PicDiv.style.backgroundPosition = -coordinate.x + "px " + -coordinate.y + "px";
        /*提示信息的动态效果,渐变*/
        this.ObjShow.play(this.num);
        /*网站名字的动态效果,变色*/
        var styleB = this.tagA.getElementsByTagName("font")[0].style;
        if (this.flag < 0)//鼠标移出,设置网站名字字体的属性
        {
            styleB.color = "black";        
            styleB.textDecoration = "none";
        }
        else//鼠标移入状态的
        {
          styleB.color = this.color;
          styleB.textDecoration = "underline";
        }
        this.num += this.flag;   
        if (this.num > this.countA)
        {
          this.num = this.countA - 1;
        }
        else if (this.num < 0)
        {
            this.num = 1;
        }
        else
        {/*这个settimetou导致active执行多次产生动态效果*/
            this.timeOut = window.setTimeout(this.active(undefined,undefined),DURATION);
        }
    };

    var WIDTH=52;
    var HEIGHT=37;
    var DURATION=75;
    /*第二步:画出静态页面,并绑定元素的事件*/
    google.index.first.push( /*first内传入函数,该函数绘制初始化页面*/
        function()
        {
            var str = '<table style="margin:2em auto;border-collapse:collapse;line-height:1.4em" cellpadding="3" cellspacing="2" border="0"><tr>';
    for (var j = 0;j < qutos.length;++j)//循环页面的5个元素
    {
    var coordinates = [];//坐标,里面放的是left和top的值
    var topA = HEIGHT*j;
    for (var i = 0;i < 7; ++i)/*七个步骤构成一个元素的动态效果*/
    {
    if (i < 5)
        coordinates.push({x:WIDTH*i,y:topA});/*push进的为left和top*/
    else
    {  
        coordinates.push({x:WIDTH*4,y:topA-qutos[j].yAdjust[i-5]});
    }
        /*left不变了,top变化,成为最后一个效果的抖动*/
        }
    qutos[j].coordinates = coordinates;
    str +=  '<td valign=bottom style="text-align:center;padding:0 .35em 0 .4em;margin:0;cursor:pointer;cursor:hand;">'
                +'<a style="color:#444;text-decoration:none;vertical-align:bottom;" href="'+ qutos[j].url + '" target=_blank>'
                    +'<div>'
                        +'<div style="width:52px;height:37px;margin:.5em auto;cursor:pointer;cursor:hand;background:no-repeat 0 '+ -topA + 'px"></div>'
                        +'<span style="white-space:nowrap">' + qutos[j].name+"</span></div></a></td>";
    };
    str += "</tr></table>";
            var ObjDiv = document.getElementById("tb");
            ObjDiv.innerHTML = str;//添加一个动态图片
            var tagsA = ObjDiv.getElementsByTagName("a");//获取超链接标签
            for(var i = 0;i < tagsA.length; ++i)
            {
              tagsA[i].firstChild.firstChild.style.backgroundImage = "url("+PIC+")";//PIC是图片的路径,全局变量
              new setDivObj(tagsA[i],qutos[i].coordinates,qutos[i].color,qutos[i].url,qutos[i].message);//设置页面元素的响应事件
            }
        }
    );
  }
)();
/*第一步:*/
google.doFirst = function()
{
  if(!google.xjs_ready)
    window.setTimeout(google.doFirst,10);
  else//如果页面的js文件加载完成了
  {
    if(google.index.first)
    /*查看first phsh操作有未完成,如果完成了就执行其内部绘图函数,该函数绘制初始化静态页面*/
    {
        for(var i = 0,draw;draw = google.index.first[i];++i)
            draw();
        delete google.index.first;//静态页面绘制完成,删除绘图缓存
    }
  }
};
google.doFirst();
分享到:
评论

相关推荐

    JS动画效果源代码(含注释)

    "JS动画效果源代码(含注释)"这个资源包含了实现各种JavaScript动画效果的源码,这些代码经过了详细的注释,方便初学者理解和学习。 在JavaScript中,动画效果主要通过操作DOM(Document Object Model)元素的样式...

    js特效代码大全(网页必备)

    5. **其他特效**:除了上述常见的特效,这个集合可能还包括各种创新的JavaScript实现,如时间轴动画、粒子效果、滚动加载、计时器/计数器、轮盘抽奖、地图标记、表单验证等。这些特效可以提升网页的视觉吸引力和功能...

    30个国外精美js特效

    "30个国外精美js特效"这个资源集合提供了一系列预制的、高质量的JavaScript特效,对于那些希望在自己的网站上添加互动元素但又不熟悉编程的开发者来说,这是一个极好的资源库。 首先,我们要明确JavaScript特效的...

    JS特效,不规则闪卡切换,非常好的源码

    "index.js"(如果存在)可能是实现这个特效的主要脚本,里面包含了控制卡片翻转、动画时间线、用户交互逻辑等核心代码。 【readme.htm】 "readme.htm"通常包含关于项目的基本信息、使用指南或作者的注释。在这个...

    js 特效 html 特效 链接的文字解释

    js 特效 html 特效 链接的文字解释 js 特效 html 特效 链接的文字解释

    javascript一些小特效

    JavaScript是一种广泛应用于网页和网络应用开发的脚本语言,它主要负责实现客户端的交互性和动态效果。在"javascript一些小特效"这个主题中,我们可以深入探讨JavaScript如何在网页上创造各种吸引用户的视觉和功能...

    js代码 好用 js特效

    "js代码 好用 js特效"这个标题暗示了我们将探讨JavaScript在创建高效、实用且吸引人的视觉效果方面的应用。 首先,JavaScript的核心在于它的代码,它允许开发者在用户与网页交互时执行操作。例如,通过添加事件监听...

    酷炫的JS特效源码

    【JS特效】是一种在网页中实现动态视觉效果的技术,它主要依赖JavaScript这门脚本语言。JavaScript,简称JS,是Web开发中不可或缺的部分,能够增强网页的交互性,赋予静态HTML页面活力。在这个名为"酷炫的JS特效源码...

    js、css 注释清理工具 (yuicompressor)

    JavaScript和CSS是网页开发中的两种核心技术,它们用于实现动态交互和美化页面。然而,随着项目的不断迭代,这些文件可能会变得庞大,导致加载速度变慢,影响用户体验。为了解决这个问题,开发者通常会使用像`yui...

    javascript中的注释规范

    通过遵循上述JavaScript注释规范,不仅可以帮助自己更好地组织和理解代码,也能够让团队其他成员更轻松地阅读和维护代码。建议开发者在编写代码时,根据实际情况灵活运用以上提到的各种注释类型,为代码添加适当的...

    清除js中的注释

    清除js中的注释,但是对转行符支持的不是很好,如有需要请提前给处理掉转行符。

    ThreeJS 中文注释源码

    ThreeJS 是一个非常流行的JavaScript库,用于在Web浏览器中创建3D图形。它基于WebGL技术,使得开发者能够轻松地构建交互式的3D场景。这个"ThreeJS 中文注释源码"压缩包包含了对ThreeJS库的重要部分——`...

    jQuery图片点击弹出遮罩层标记注释特效

    JavaScript部分(可能在`js`文件夹内的某个脚本文件,如`jquery-plugin.js`)是实现功能的核心。它可能包含以下功能: 1. **事件监听**:使用`$(document).ready()`或`$(function() {...})`确保页面加载完毕后再...

    Visual Studio代码自动注释插件(C#、JS类、方法注释)

    在编程世界中,注释是代码可读性和可维护性的重要组成部分。...通过使用这些插件,开发者可以更专注于编写功能,而无需花费大量时间手动编写注释。同时,保持良好的注释习惯也有助于代码的长期维护和团队协作。

    一些用js实现的特效

    JavaScript,简称JS,是一种轻量级的解释型编程语言,广泛应用于网页和互联网应用开发,尤其在实现网页动态效果和交互方面具有强大的能力。在这个压缩包中,我们聚焦于使用JavaScript实现的各种特效。 1. **...

    【伯颜一笑】 固件特效kml自动注释器

    同时,为了更好地利用这个工具,学习者还需要掌握基本的XML语法和固件特效的基本原理,这样才能更好地理解和应用注释后的代码。 总的来说,"伯颜一笑"固件特效kml自动注释器是固件特效学习和开发过程中的得力助手,...

    javascript特效代码(最新)

    例如,"最新1"可能包含了最新流行的网页动态效果,如CSS3与JavaScript结合实现的过渡和动画效果,以及基于jQuery或Vue.js等库的高级功能。 JavaScript特效的实现通常涉及DOM操作,这包括元素的选择、添加、删除以及...

    雷达扫描特效+倒影效果+详细注释

    【雷达扫描特效】是Android平台上的一个视觉效果技术,它通常用于模拟雷达探测或类似功能的界面设计。这种效果能够创建动态的、环形扫描的动作,给人一种正在搜索或监测周围环境的感觉。在Android开发中,实现雷达...

    javascript 特效 学习它的好教材

    JavaScript特效是网页动态效果的核心技术,它为网页增添生动性和互动性,极大地提升了用户体验。学习JavaScript特效对于前端开发者来说至关重要,因为这不仅涉及到基础的DOM操作、事件处理,还涵盖CSS样式操纵、动画...

Global site tag (gtag.js) - Google Analytics