在百度搜索"2012世界末日"所展现的地震效果的源代码

  昨天在同学群里收到这样的信息:【重磅消息:只要在百度搜索"2012世界末日",你的电脑显示器页面将会震动,出现地震山摇的状况,然后会有一张"船票"飘然而出 】。很想看看百度的前端工程师是怎么写出这个效果的。以前我研究过谷歌logo的代码,特别是昨天的拉链效果,虽然找到了源码,但是谷歌的页面里的代码都被压缩和混淆,加上谷歌自己的前端js框架代码混入其中实在难以看懂,抽百度的源码就想比较下百度和谷歌的前端技术,哈哈,百度还是简单多了,没有被压缩和混淆,可以作为学习的范本,好了不废话了,下面就是百度的地震效果源码。

  首先看看我代码的目录层次图:

在百度搜索"2012世界末日"所展现的地震效果的源代码

all.png:

 

url:http://s1.bdstatic.com/r/www/cache/2012cp/images/all.png

broken.png:

url:http://s1.bdstatic.com/r/www/cache/2012cp/images/broken.png

ticket.jpg:

在百度搜索"2012世界末日"所展现的地震效果的源代码

url:http://s1.bdstatic.com/r/www/cache/2012cp/images/ticket.jpg

baiduquake.js源码如下:

View Code
void function(window, undefined){



    //var baseURL = "http://s1.bdstatic.com/r/www/cache/2012cp/images/";

    var baseURL = "images/";



    // var baseURL = "http://hot.baidu.com/savetheearth/img/";

    var nopUrl = "http://hot.baidu.com/savetheearth/savetheearth/?a=total&cb=getNOP";



    var targetNumber = 500000;

    var nowNumber = 0;

    var activityUrl = "http://hot.baidu.com/savetheearth"; 



    var doc = document;

    var de = doc.documentElement;

    var body = doc.body;

    var out = doc.getElementById("sharpxiajun");

    var swapDoms = [];



    var max = Math.max;

    var min = Math.min;

    var sqrt = Math.sqrt;

    var pow = Math.pow;

    var abs = Math.abs;

    var round = Math.round;



    var ua = navigator.userAgent;

    var ie = /msie/i.test(ua) && !document.addEventListener;

    var ie6 = /msie 6/i.test(ua);

    var cr = /chrome/i.test(ua);

    var sf = /safari/i.test(ua);

    var ff = /firefox/i.test(ua);

    var op = /opera/i.test(ua);



    var time = ie ? 16 : 30;

    var sframesNum = 40;



    window.getNOP = function(data){

        nowNumber = data.total;

    };



    var zIndexs = {

        background: 4000, 

        forceground: 5000,

        chasm: 6000,

        chip: 7000, 

        ticket: 8000,

        text: 9000 

    };



    var css = function(window, undefined){



        var cache = {};



        var getPms = function(index){

            return [].slice.apply(

                arguments.callee.caller.arguments, [index || 1]);

        };



        var decode = function(styles){

            var res = [], idx = 0;

            for(var n in styles)

                res[idx ++] = fullname(n) + ": " + value(styles[n]) + "; ";

            return res.join("");

        };



        var fullname = function(){

            var shorts = { pos: "position", w: "width", h: "height", l: "left", t: "top" };

              return function(name){

                return shorts[name] || name;

            }

        }();



        var value = function(value){

            return value - 0 === value ? value + "px" : value;

        };



        var join = function(objs){

            var res = [];

            for(var i = 0, l = objs.length, obj; i < l; i ++){

                obj = objs[i];

                if(/^=/.test(obj))

                    res[i] = loadRes(obj);

                else if(obj + "" === obj)

                    res[i] = obj;

                else

                    res[i] = decode(obj);

            }

            return res.join(";");

        };



        var saveRes = function(name){

            cache[name] = join(getPms(1));

        };



        var loadRes = function(name){

            return cache[name];

        };



        var replaceTag = function(tag){

               if(/^<(\w+)([^>]*)>$/.test(tag)){

                   var tag = RegExp.$1, atts = RegExp.$2;

                   return "<" + tag + atts + " style='" + join(getPms(1)) + "'></" + tag + ">";

               }

        };



        var dom = function(dom){

            dom.style.cssText += ";" + join(getPms(1));

        };



        return function(fst, sec){

            var fn;

            if(!fst){

                throw new Error();

            }else if(/^=/.test(fst)){

                if(sec === undefined)

                    fn = loadRes;

                else

                    fn = saveRes;

            }else if(/^<[^>]+>$/.test(fst)){

                fn = replaceTag;

            }else if(fst.nodeType && fst.nodeType != 3){

                fn = dom;

            }

            return fn.apply(this, arguments);

        }

    }(window);



    var style = function(dom, config){

        for(var name in config)

            dom.style[name] = config[name];

    }



    var makeDom = function(tag, parent, style, recycle){

        var dom = doc.createElement(tag || "div");

           style && css.apply(null, [dom].concat(style));

           parent && parent.appendChild(dom);

           recycle && recycle.push(dom);

           return dom;

    };



    var frame = function(fn, time, min){

        var start = new Date().getTime();

        var end = start + time;

        var pRate = 1 / (min || 5);

        var lastRate = 0;

        var endCb;

        var interval = setInterval(function(){

            var now = new Date().getTime();

            var rate = (now - start) / time;

            if(rate > lastRate + pRate)

                rate = lastRate + pRate;

            lastRate = rate;

            if(rate < 1)

                fn(rate);

            else{

                clearInterval(interval);

                fn(1);

                endCb && endCb();

            }

        }, 1);

        return {

            end: function(fn){



                endCb = fn;

            }

        }

    };



    var alpha = function(){

        return typeof document.body.style.opacity == "string" ?



        function (dom, n){

            dom.style.opacity = n;

        } :



        function(dom, n){

            var key = "alpha";

            n = n * 100 | 0;

            if(~ dom.style.filter.indexOf(key)){

                dom.filters.item(key).opacity = n;

            }else{

                dom.style.filter += " alpha(opacity=" + n + ")";

            }

        }

    }();



    var rotate = function(dom, ang, origin){

        var r = ang * Math.PI / 180;

        var cos = Math.cos(r);

        var sin = Math.sin(r);

        matrix(dom, cos, -sin, sin, cos, origin || "center center");

    };



    var matrix = function(){

        var originKey, transformKey;

        if(cr || sf){

            originKey = "-webkit-transform-origin";

            transformKey = "-webkit-transform";

        }else if(ff){

            originKey = "MozTransformOrigin";

            transformKey = "MozTransform";

        }else if(op){

            originKey = "OTransformOrigin";

            transformKey = "OTransform";

        }

        return ie ?

        function(dom, M11, M12, M21, M22, origin){

            // TODO: origin 鏈疄鐜�

            var key = "DXImageTransform.Microsoft.Matrix";

            var style = dom.style;

            if(~ style.filter.indexOf(key)){

                var matrix = dom.filters.item(key);

                matrix.M11 = M11, matrix.M12 = M12, matrix.M21 = M21, matrix.M22 = M22;

            }else{

                style.filter += " progid:" + key + "(M11=" + M11 + ", M12=" + M12 +", M21=" + M21 + ", M22=" + M22 + ", FilterType='bilinear', SizingMethod='auto expand')";

            }

        } :

        function(dom, M11, M12, M21, M22, origin){

            var conf = {};

            conf[originKey] = origin || "0 0";

            conf[transformKey] = "matrix(" + [M11, M21, M12, M22].join(",") + ",0,0)";

            style(dom, conf);

        }

    }();



    var removeDom = function(parent, tag){

        var els = parent.getElementsByTagName(tag);

        for(var i = els.length - 1; i >= 0; i --)

            els[i].parentNode.removeChild(els[i]);

    };



    var turnOverX = function(dom, w, h, x, y, dx){

        var dy = h / 2;

        var center, end;

        frame(function(rate){

            rate = exponential(rate, 0, 1, 1);

            var r = rate * Math.PI;

            var p = rate < .5 ? -1 : 1;

            var M12 = p * Math.sin(r) * dx / w;

            var M22 = -p * Math.cos(r);

            if(rate >= .5)

                center && center(), center = null;

            matrix(dom, 1, M12, 0, M22);

            M12 = ie ? Math.abs(M12) : M12;

            style(dom, { left: x - M12 * w / 4 + "px", top: y + dy * (1 - M22) + "px" });

        }, 1200, 24).end(function(){ end && end(); });

        var rt = {

            center: function(fn){ center = fn; return rt; },

            end: function(fn){ end = fn; return rt; }

        };

        return rt;

    };



    var addEvent = function(target, name, fn){

        var call = function(){

            fn.apply(target, arguments);

        };

        if(window.attachEvent){

            target.attachEvent("on" + name, call);

        }else if(window.addEventListener){

            target.addEventListener(name, call, false);

        }else{

            target["on" + name] = call;

        };

        return call;

    };



    var swapDom = function(el, other){

        var p1, p2, t;

        p1 = el.parentNode;

        p2 = other.parentNode;

        t = document.createTextNode("");



        p1.insertBefore(t, el);

        p2.insertBefore(el, other);

        p1.insertBefore(other, t);

        p1.removeChild(t);

    };



    css("=abs", "position: absolute;");

    css("=thide", "top: -5000px;");

    css("=hide", "overflow: hidden");

    css("=chip", "=abs", "=hide", "background: url(" + baseURL + "all.png) no-repeat 0 0; z-index: " + zIndexs.chip + ";");

    css("=broken1", "=abs", "=thide", "background: url(" + baseURL + "all.png) no-repeat 0 0; z-index: " + zIndexs.chasm + ";");

    css("=broken2", "=abs", "=thide", "=hide", "z-index: " + zIndexs.chasm + ";");

    css("=background", "=abs", "=thide", "=hide", "background: #050006 url(" + baseURL + "all.png) no-repeat 0 -462px; z-index: " + zIndexs.background + ";");

    css("=forceground", "=abs", "=thide", "=hide", "height: 355px; background-color: #fff; z-index: " + zIndexs.forceground + ";");

    css("=ticket-layer", "=abs", "=hide", "z-index: " + zIndexs.ticket + "; width: 602px; height: 258px; background: url(" + baseURL + "ticket.jpg) no-repeat 0 0;");

    css("=ticket-shadow", "=ticket-layer", "background: #000;");

    css("=loading", "=abs", "z-index: " + zIndexs.text + "; background: url(" + baseURL + "all.png) no-repeat -829px -521px; width: 300px; height: 20px;");

    css("=loading-bar", "=hide", "width: 0; height: 20px; background: url(" + baseURL + "all.png) no-repeat -829px -541px;");

    css("=text", "=abs", "color: #a3cb4c; font-size: 18px; font-weight: 700; width: 72px; height: 20px; text-align: center; z-index: " + zIndexs.text + ";");

    css("=join", "=abs", "width: 132px; height: 42px; background: url(" + baseURL + "all.png) no-repeat -687px -521px; z-index: " + zIndexs.text + ";");

    css("=close", "=abs", "width: 27px; height: 27px; background: url(" + baseURL + "all.png) no-repeat -650px -521px; z-index: " + zIndexs.text + ";");





    var earthquake = function(){

        var level = 1;

        var interval;

        var onQuake = function(){};



        var f = ie6 ? function(x, y){

            return { left: x + "px", top: y + "px" };

        } : function(x, y){

            return { marginLeft: x + "px", marginTop: y + "px" };

        };



        return {

            start: function(){

                interval = itv(function(){

                    var left = level * 2 - random(level * 4);

                    var top = level * 1 - random(level * 2);

                    style(out, f(left, top));

                    onQuake(left, top);

                });

            },

            stop: function(){

                clearInterval(interval);

                tout(function(){

                    style(out, f(0, 0));

                    onQuake(0, 0);

                }, 1);

                // resetOver();

            },

            setLevel: function(n){

                level = n;

            },

            onQuake: function(callback){

                onQuake = callback;

            }

        }

    }();





    var chip = function(){

        var chips = [ [28, 27, 0], [22, 27, 27], [16, 25, 54] ]; // width, height, top

        return {

            create: function(){

                var c = chips[random(chips.length)];

                var top = -50, left = random(body.clientWidth) - 40;

                var div = makeDom("div", body, ["=chip", { w: c[0], h: c[1], l: left, t: top, "background-position": "-612px -" + (c[2] + 521) + "px" }]);



                frame(function(rate){

                     div.style.top = quadratic(rate, top, 800, 1) + "px"; // 800 = 750 - (-50)

                }, 1e3).end(function(){

                    body.removeChild(div);

                });

            }

        }

    }();





    var forceground;

    var chasm = function(){

        var level = 0;

        var bg = baseURL + "all.png";

        var img2 = baseURL + "broken.png";

        var imgObj1, imgObj2;

        var background;



        var searchBoxWidth = 620; 

        var fixTop = -7;

        var fixLeft = 68;

        var frameWidth = 227;

        var frameHeight = 452;

        var framePics = 8;

        var elQueue = [];



        return {

            prepare: function(){

                var iw = min(frameWidth, de.clientWidth - searchBoxWidth);



                imgObj1 = makeDom("div", body, ["=broken1", { l: searchBoxWidth + "px", w: iw + "px", h: frameHeight + "px" }], elQueue);

                imgObj2 = makeDom("div", body, ["=broken2", { l: searchBoxWidth, w: iw, h: frameHeight }], elQueue);



                imgObj2.innerHTML = "<div style=\"width: " + (frameWidth * framePics) + "px; height: " + frameHeight + "px; " +

                    (ie6 ? "filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + img2 + "',sizingMethod='scale');" :

                    "background: url(" + img2 + ") right 0;")

                + "\">&nbsp;</div>";



                background = makeDom("div", body, ["=background", { l: searchBoxWidth + fixLeft + 15, w: max(body.clientWidth - searchBoxWidth - fixLeft - 15, 0), h: 80 }], elQueue);



                forceground = makeDom("div", body, ["=forceground", { l: searchBoxWidth + fixLeft, w: max(body.clientWidth - searchBoxWidth - fixLeft, 0) }], elQueue);



                var body2 = makeDom("div", forceground, [{ w: body.clientWidth, "z-index": zIndexs.chasm, padding: "6px 0 0" }], elQueue);



                removeDom(out, "script");



                var outCloner = out.cloneNode(true);

                removeDom(outCloner, "iframe");

                

                outCloner.style.position = "relative";



                body2.appendChild(outCloner);

                this.disposeCloneEvent(outCloner);

                elQueue.push(outCloner);



                forceground.scrollLeft = 1e5;



                addEvent(window, "resize", function(){

                    if(closeAll.status)return;

                    background.style.width = max(0, body.clientWidth - searchBoxWidth - fixLeft - 15) + "px";

                    forceground.style.width = max(0, body.clientWidth - searchBoxWidth - fixLeft) + "px";

                    body2.style.width = body.clientWidth + "px";

                    background.style.background = "#050006 url(" + bg + ") no-repeat " + ((body.clientWidth - searchBoxWidth - fixLeft - 15) - 1214) + "px -452px";

                    forceground.scrollLeft = 1e5; });

            },



            disposeCloneEvent: function(cloneEl){

                var ids = " u tools ";

                var all = cloneEl.getElementsByTagName("*");

                for(var i = all.length - 1, el, o; i >= 0; i --)

                    if(el = all[i], el.id && (~ids.indexOf(" " + el.id + " "))){

                        o = document.getElementById(el.id);

                        swapDoms.push([el, o]);

                        swapDom(el, o);

                    }

            },



            setLevel: function(n){

                level = n;



                if(n == 0){

                    imgObj1.style.top =

                    imgObj2.style.top =

                    background.style.top =

                    forceground.style.top = "-5000px";

                    return ;

                }else{

                    imgObj1.style.top =

                    imgObj2.style.top = fixTop + "px";

                    background.style.top = "0";

                    forceground.style.top = "2px";

                }



                var left = (n - 1) * frameWidth;

                imgObj1.style.backgroundPosition = "-" + left + "px 0";

                imgObj2.scrollLeft = left;



                if(n > 3){

                    rotate(forceground, (n - 3) * .8, "left bottom");

                    background.style.background = "#050006 url(" + bg + ") no-repeat " + ((body.clientWidth - searchBoxWidth - fixLeft - 15) - 1214) + "px -452px";

                }else{

                    rotate(forceground, 0, "left bottom");

                    background.style.background = "#fff";

                }

            },



            healing: function(){

                var num = nowNumber > targetNumber ? targetNumber : nowNumber;

                var rate = round(framePics - (num / targetNumber) * framePics);

                var level = framePics;



                var interval = itv(function(){

                    if(level == rate)

                        return clearInterval(interval);

                    level > rate ? (level --) : (level ++);

                    chasm.setLevel(level);

                }, 500);

            },



            fixPos: function(left, top){

                if(level == 0)return ;

                imgObj1.style.left =

                imgObj2.style.left = searchBoxWidth + left + "px";

                imgObj1.style.top =

                imgObj2.style.top = top + fixTop + "px";

                forceground.style.left = searchBoxWidth + fixLeft + left + "px";

                forceground.style.top = top + 2 + "px";

            },



            dispose: function(){

                for(var i = elQueue.length - 1; i >= 0; i --)

                    try{elQueue[i].parentNode.removeChild(elQueue[i]);}catch(e){}

            }

        }

    }();





    var ticket = function(){

        var referenceDataSize = [642, 265];



        var dialogWidth = 602, dialogHeight = 258, shadowZoom = 1.25;

        var shadowDiffPos = [dialogWidth * (shadowZoom - 1) / 2, dialogHeight * (shadowZoom - 1) / 2];



        var keyPoints = [

            /* [point, helper, offsetAngle] */

            // A:

            [ [543, 56], [342, 182], .001 ],

            // B:

            [ [43, 59], [172, 192], 1/9 ],

            // C:

            // [ [852, 90], [431, 284], 1/3 ]

            [ [852, 150], [431, 284], 1/3 ]

            // D:

            // [ [461, 222], [336, 256] ]

        ];



        var referencePaths = [];



        for(var i = 1, s, e, kp, l = keyPoints.length; i < l; i ++){

            s = keyPoints[i - 1];

            e = keyPoints[i];

            referencePaths.push(bezierPoints([s[0], s[1], e[1], e[0]], 300));

        }



        var keyStartPoint = keyPoints[0], keyEndPoint = keyPoints[keyPoints.length - 1];

        var startPoint = keyPoints[0][0], endPoint, lightPoint, sDistance;

        var shadowOffset = [640, 480];

        var elQueue = [];

        var layer, shadow, centerd, scDistance;



        return {

            show: function(){

                var bodyWidth = de.clientWidth, bodyHeight = de.clientHeight;



                endPoint = [(bodyWidth - dialogWidth) / 2 | 0,  (bodyHeight - dialogHeight) / 2 | 0];



                lightPoint = [bodyWidth / 2 | 0, 0];



                // scDistance = [lightPoint[0] - startPoint[0], lightPoint[1] - startPoint[1]];

                scDistance = 640;



                shadow = makeDom("div", body, ["=ticket-shadow"]);

                layer = makeDom("div", body, ["=ticket-layer"], elQueue);

                // layer.src = baseURL + "ticket-front.png";



                var lastPoint = [0, 0], lastZoom = keyPoints[keyPoints.length - 1][2], lastAngle = 0;



                // var drawPoint = function(x, y){

                //     var div = document.createElement("div");

                //     div.style.cssText = "position: absolute; width: 3px; height: 3px; left: " + x + "px; top: " + y + "px; background: red; overflow: hidden;";

                //     document.body.appendChild(div);

                // }



                var setTicket = function(){

                    var last = [0, 0];

                      return function(x, y, z, a, r){

                          if(last[0] == x && last[1] == y)

                              return ;



                          // drawPoint(x, y);



                        var sinr = Math.sin(r *= Math.PI / 180) * z,

                            cosr = Math.cos(r) * z;

                        var sinr2 = sinr * .5,

                            sinr3 = sinr * .75;



                        if(ie)

                            x += dialogWidth * sinr2,

                            y += dialogHeight * sinr3;



                        var c = [x + dialogWidth * z / 2, y + dialogHeight * z / 2];

                        var distanceZoom = [(c[0] - lightPoint[0]) / scDistance, (c[1] - lightPoint[1]) / scDistance];



                        style(layer, { left: x + "px", top: y + "px" });

                        style(shadow, {

                            left: x + shadowOffset[0] * distanceZoom[0] * z - shadowDiffPos[0] * z + "px",

                            top: y + shadowOffset[1] * distanceZoom[1] * z - shadowDiffPos[1] * z + "px" });



                        alpha(shadow, a);

                        matrix(layer, cosr, sinr2, sinr3, cosr, "0 0");

                        matrix(shadow, cosr * shadowZoom, sinr2 * shadowZoom, sinr3 * shadowZoom, cosr * shadowZoom, "0 0");



                        last = [x, y];

                    }

                }();



                var playLastTicket = function(){

                    var targetAngle = abs(360 - lastAngle) > lastAngle ? 0 : 360;

                    // var index = 0, framesNum = 1e3;

                    frame(function(rate){

                        // var index = round(rate * framesNum);

                        setTicket(

                            cubic(rate, lastPoint[0], endPoint[0] - lastPoint[0], 1),

                            cubic(rate, lastPoint[1], endPoint[1] - lastPoint[1], 1),

                            cubic(rate, lastZoom, 1 - lastZoom, 1),

                            cubic(rate, .33, -.33, 1),

                            cubic(rate, lastAngle, targetAngle - lastAngle, 1)

                        );

                    }, 1200, 14).end(function(){

                        shadow.parentNode.removeChild(shadow);

                        tout(function(){

                            centerd = true;

                            ticket.turnOver(ticket.showLoadingBar);

                        }, 1e3);

                    });

                };



                var playBezierPath = function(points, bezierIndex, z1, z2, callback){

                    // var framesNum = 1e3, angle = 0;

                    frame(function(rate){

                        // var index = round(rate * framesNum);

                           var pIndex = round(cubic(rate, 0, 299, 1));

                        var z = cubic(rate, z1, z2 - z1, 1);

                        var a = 1 - cubic(rate, bezierIndex * .33, .33, 1);

                        var p = lastPoint = points[pIndex], p1;

                         var r;



                         if(p1 = points[pIndex + 1])

                             lastAngle = r = (getAngleByRadian(pointToRadian(p, p1)) + (bezierIndex % 2 ? 0 : 180)) % 360;



                        setTicket(p[0], p[1], z, a, r || lastAngle);

                    }, 1200, 14).end(callback);

                };



                var playPaths = function(index){

                    var points = referencePaths[index];

                    if(points){

                        // alert([keyPoints[index][2], keyPoints[index + 1][2]]);

                        playBezierPath(points, index, keyPoints[index][2], keyPoints[index + 1][2], function(){

                            playPaths(index + 1);

                        });

                    }else{

                        playLastTicket();

                    }

                };



                playPaths(0);



                   addEvent(window, "resize", function(){

                       if(closeAll.status)return;

                    endPoint = [(de.clientWidth - dialogWidth) / 2 | 0,  (de.clientHeight - dialogHeight) / 2 | 0];

                    if(centerd)

                        style(layer, { left: endPoint[0] + "px", top: endPoint[1] + "px" });

                });

            },



            turnOver: function(end){

                var x = parseInt(layer.style.left);

                var y = parseInt(layer.style.top);



                turnOverX(layer, dialogWidth, dialogHeight, x, y, 150).center(function(){

                    // layer.src = baseURL + "blank.gif";

                    layer.style.backgroundPosition = "0 -260px";

                }).end(end);

            },



            showLoadingBar: function(){

                var loadingOffset = [125, ie ? 206 : 207];

                var textOffset = [77, 230];

                var joinButtonOffset = [449, 208];

                var closeButtonOffset = [574, 3];



                var template = "<span id='deliverer-num'></span>";



                var loading = makeDom("div", body, ["=loading", { l: endPoint[0] + loadingOffset[0], t: endPoint[1] + loadingOffset[1] }], elQueue);

                var loadingBar = makeDom("div", loading, ["=loading-bar"], elQueue);

                var layer = makeDom("div", body, ["=text", { l: endPoint[0] + textOffset[0], t: endPoint[1] + textOffset[1] }], elQueue);

                var joinButton = makeDom("div", body, ["=join", { l: endPoint[0] + joinButtonOffset[0], t: endPoint[1] + joinButtonOffset[1] }], elQueue);

                var closeButton = makeDom("div", body, ["=close", { l: endPoint[0] + closeButtonOffset[0], t: endPoint[1] + closeButtonOffset[1] }], elQueue);



                   addEvent(window, "resize", function(){

                       if(closeAll.status)return;

                    endPoint = [(de.clientWidth - dialogWidth) / 2 | 0,  (de.clientHeight - dialogHeight) / 2 | 0];

                    css(loading, { l: endPoint[0] + loadingOffset[0], t: endPoint[1] + loadingOffset[1] });

                    css(layer, { l: endPoint[0] + textOffset[0], t: endPoint[1] + textOffset[1] });

                    css(joinButton, { l: endPoint[0] + joinButtonOffset[0], t: endPoint[1] + joinButtonOffset[1] });

                    css(closeButton, { l: endPoint[0] + closeButtonOffset[0], t: endPoint[1] + closeButtonOffset[1] });

                });



                joinButton.onmouseover = function(){ this.style.backgroundPosition = "-687px -563px"; };

                joinButton.onmouseout = function(){ this.style.backgroundPosition = "-687px -521px"; };

                joinButton.onclick = function(){ open(activityUrl); };



                closeButton.onmouseover = function(){ this.style.backgroundPosition = "-650px -548px"; };

                closeButton.onmouseout = function(){ this.style.backgroundPosition = "-650px -521px"; };

                closeButton.onclick = function(){ closeAll(); };



                var formatNumber = function(number){

                    return round(number).toString().replace(/(\d)(?=(\d{3})+$)/ig, "$1,");;

                };



                layer.innerHTML = template;



                var deliverer = doc.getElementById("deliverer-num");

                // var index = 0, framesNum = 60;

                // var interval = itv(function(){

                //     var number1 = linear(index, 0, nowNumber, framesNum);

                //     var number2 = exponential(index, 0, nowNumber, framesNum);

                //     deliverer.innerHTML = formatNumber(number2);

                //     loadingBar.style.width = round(number1 / targetNumber * 20) * 15 + "px";

                //     if(++ index > framesNum){

                //         clearInterval(interval);

                //         tout(function(){ chasm.healing(); }, 1e3);

                //     }

                // });

                frame(function(rate){

                    var number1 = linear(rate, 0, nowNumber, 1);

                    var number2 = exponential(rate, 0, nowNumber, 1);

                    deliverer.innerHTML = formatNumber(number2);

                    loadingBar.style.width = round(number1 / targetNumber * 20) * 15 + "px";

                }, 1200, 24).end(function(){

                    tout(function(){ chasm.healing(); }, 1e3);

                });

            },



            dispose: function(){

                for(var i = elQueue.length - 1; i >= 0; i --)

                    try{elQueue[i].parentNode.removeChild(elQueue[i]);}catch(e){}

            }

        }

    }();



    var closeAll = function(){

        closeAll.status = 1;

        chasm.dispose();

        ticket.dispose();



        for(var i = swapDoms.length - 1, s; i >= 0; i --){

            s = swapDoms[i];

            swapDom(s[0], s[1]);

        }



        resetOver();

    };



    try{

        ie && doc.execCommand("BackgroundImageCache", false, true);

    }catch(e){};



    var earthquakeLevel = 1;



    style(out,   ie6 ? ({ position: "relative", left: 0, top: 0, display: "block" }) : ({ display: "block" })  );



    earthquake.onQuake(function(left, top){

        if(random(10) < earthquakeLevel)

            chip.create();

        chasm.fixPos(left, top);

    });





    var nopScript = document.createElement("script");

    nopScript.type = "text/javascript";

    nopScript.src = nopUrl;

    body.appendChild(nopScript);



    var cimg = new Image();

    cimg.src = baseURL + "ticket.jpg";



    var imageLoader = new Image();

    imageLoader.onload = function(){

        disOver();



        tout(function(){

            earthquake.start();

            chasm.prepare();

        }, 0);



        tout(function(){ chasm.setLevel(1); }, 500);



        for(var i = 2; i < 8; i ++)

            tout(function(i){

                return function(){

                    earthquake.setLevel(earthquakeLevel = i);

                    chasm.setLevel(i);

                }

            }(i), i * 400);



        tout(function(){ earthquake.stop(); chasm.setLevel(8); }, 3500);

        tout(ticket.show, 4500);

    }

    imageLoader.src = baseURL + "all.png";



    /**

     * Tools

     */

    function itv(f, t){ return setInterval(f, t || time); }

    function tout(f, t){ return setTimeout(f, t || time); }

    function random(number){ return Math.random() * number | 0; }

    function quadratic(index, offset, target, framesNum){ return target * (index /= framesNum) * index + offset; }



    function disOver(){

        de.style.overflowX = "hidden";

    }



    function resetOver(){

        de.style.overflowX = "auto";

    }



    function getAngleByRadian(radian){ return radian * 180 / Math.PI; }



    function pointToRadian(origin, point){

        var PI = Math.PI;

        if (point[0] == origin[0]) {

            if (point[1] > origin[1])

                return PI * 0.5;

            return PI * 1.5

        } else if (point[1] == origin[1]) {

            if (point[0] > origin[0])

                return 0;

            return PI;

        }

        var t = Math.atan((origin[1] - point[1]) / (origin[0] - point[0]));

        if (point[0] > origin[0] && point[1] < origin[1])

            return t + 2 * PI;

        if (point[0] > origin[0] && point[1] > origin[1])

            return t;

        return t + PI; 

    }



    function curveLength(curve){ return max((distance(curve[0], curve[1]) + distance(curve[1], curve[2]) + distance(curve[2], curve[3])) | 0, 1); }



    function distance(a, b){ return sqrt(pow(a[0] - b[0], 2) + pow(a[1] - b[1], 2)); }



    function bezier(curve, rate){

        var cx = 3 * (curve[1][0] - curve[0][0])

            , bx = 3 * (curve[2][0] - curve[1][0]) - cx

            , ax = curve[3][0] - curve[0][0] - cx - bx

            , cy = 3 * (curve[1][1] - curve[0][1])

            , by = 3 * (curve[2][1] - curve[1][1]) - cy

            , ay = curve[3][1] - curve[0][1] - cy - by;

        return [ax * pow(rate, 3) + bx * pow(rate, 2) + cx * rate + curve[0][0],

            ay * pow(rate, 3) + by * pow(rate, 2) + cy * rate + curve[0][1]];

    }



    function bezierPoints(curve, count){

        if (count < 2) return;

        var len = curveLength(curve);

        var points = [];

        points[0] = {

            p: curve[0],

            t: 0,

            l: 0

        };

        for (var i = 1; i <= len; i++){

            var t = i / len,

                p = bezier(curve, t),

                l = points[i - 1].l + distance(p, points[i - 1].p);

            points[i] = {

                i: i,

                p: p,

                t: t,

                l: l

            }

        }

        var max = points[len].l;

        var result = [];

        var t = 0;

        for (var i = 0; i <= count; i++){

            var tl = max * (i / (count - 1));

            for (var j = t; j < points.length; j++){

                var point = points[j]

                if (point.l >= tl){

                    t = j;

                    result.push(point.p);

                    break;

                }

            }

        }

        return result;

    }



    function linear(index, offset, target, framesNum){ return target * index / framesNum + offset; }



    function cubic(index, offset, target, framesNum){

        if((index /= framesNum / 2) < 1)

            return target / 2 * index * index * index + offset;

        else

            return target / 2 * ((index -= 2) * index * index + 2) + offset;

    }



    function exponential(index, offset, target, framesNum){

        if(index == 0)

            return offset;

        else if(index == framesNum)

            return offset + target;

        else if((index /= framesNum / 2) < 1)

            return target / 2 * Math.pow(2, 10 * (index - 1)) + offset;

        else

            return target / 2 * (-Math.pow(2, -10 * -- index) + 2) + offset;

    }

}(window);

baiduquake.html源码如下:

View Code
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">

<head>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

<title>无标题文档</title>

</head>



<body>

<div id='sharpxiajun'>

重磅消息:只要在百度搜索"2012世界末日",你的电脑显示器页面将会震动,出现地震山摇的状况,然后会有一张"船票"飘然而出 ,请你参与"拯救地球"重磅消息:只要在百度搜索"2012世界末日",你的电脑显示器页面将会震动,出现地震山摇的状况,然后会有一张"船票"飘然而出 ,请你参与"拯救地球"重磅消息:只要在百度搜索"2012世界末日",你的电脑显示器页面将会震动,出现地震山摇的状况,然后会有一张"船票"飘然而出 ,请你参与"拯救地球"重磅消息:只要在百度搜索"2012世界末日",你的电脑显示器页面将会震动,出现地震山摇的状况,然后会有一张"船票"飘然而出 ,请你参与"拯救地球"重磅消息:只要在百度搜索"2012世界末日",你的电脑显示器页面将会震动,出现地震山摇的状况,然后会有一张"船票"飘然而出 ,请你参与"拯救地球"重磅消息:只要在百度搜索"2012世界末日",你的电脑显示器页面将会震动,出现地震山摇的状况,然后会有一张"船票"飘然而出 ,请你参与"拯救地球"重磅消息:只要在百度搜索"2012世界末日",你的电脑显示器页面将会震动,出现地震山摇的状况,然后会有一张"船票"飘然而出 ,请你参与"拯救地球"重磅消息:只要在百度搜索"2012世界末日",你的电脑显示器页面将会震动,出现地震山摇的状况,然后会有一张"船票"飘然而出 ,请你参与"拯救地球"重磅消息:只要在百度搜索"2012世界末日",你的电脑显示器页面将会震动,出现地震山摇的状况,然后会有一张"船票"飘然而出 ,请你参与"拯救地球"重磅消息:只要在百度搜索"2012世界末日",你的电脑显示器页面将会震动,出现地震山摇的状况,然后会有一张"船票"飘然而出 ,请你参与"拯救地球"重磅消息:只要在百度搜索"2012世界末日",你的电脑显示器页面将会震动,出现地震山摇的状况,然后会有一张"船票"飘然而出 ,请你参与"拯救地球"重磅消息:只要在百度搜索"2012世界末日",你的电脑显示器页面将会震动,出现地震山摇的状况,然后会有一张"船票"飘然而出 ,请你参与"拯救地球"重磅消息:只要在百度搜索"2012世界末日",你的电脑显示器页面将会震动,出现地震山摇的状况,然后会有一张"船票"飘然而出 ,请你参与"拯救地球"重磅消息:只要在百度搜索"2012世界末日",你的电脑显示器页面将会震动,出现地震山摇的状况,然后会有一张"船票"飘然而出 ,请你参与"拯救地球"重磅消息:只要在百度搜索"2012世界末日",你的电脑显示器页面将会震动,出现地震山摇的状况,然后会有一张"船票"飘然而出 ,请你参与"拯救地球"重磅消息:只要在百度搜索"2012世界末日",你的电脑显示器页面将会震动,出现地震山摇的状况,然后会有一张"船票"飘然而出 ,请你参与"拯救地球"重磅消息:只要在百度搜索"2012世界末日",你的电脑显示器页面将会震动,出现地震山摇的状况,然后会有一张"船票"飘然而出 ,请你参与"拯救地球"重磅消息:只要在百度搜索"2012世界末日",你的电脑显示器页面将会震动,出现地震山摇的状况,然后会有一张"船票"飘然而出 ,请你参与"拯救地球"重磅消息:只要在百度搜索"2012世界末日",你的电脑显示器页面将会震动,出现地震山摇的状况,然后会有一张"船票"飘然而出 ,请你参与"拯救地球"重磅消息:只要在百度搜索"2012世界末日",你的电脑显示器页面将会震动,出现地震山摇的状况,然后会有一张"船票"飘然而出 ,请你参与"拯救地球"重磅消息:只要在百度搜索"2012世界末日",你的电脑显示器页面将会震动,出现地震山摇的状况,然后会有一张"船票"飘然而出 ,请你参与"拯救地球"重磅消息:只要在百度搜索"2012世界末日",你的电脑显示器页面将会震动,出现地震山摇的状况,然后会有一张"船票"飘然而出 ,请你参与"拯救地球"重磅消息:只要在百度搜索"2012世界末日",你的电脑显示器页面将会震动,出现地震山摇的状况,然后会有一张"船票"飘然而出 ,请你参与"拯救地球"重磅消息:只要在百度搜索"2012世界末日",你的电脑显示器页面将会震动,出现地震山摇的状况,然后会有一张"船票"飘然而出 ,请你参与"拯救地球"重磅消息:只要在百度搜索"2012世界末日",你的电脑显示器页面将会震动,出现地震山摇的状况,然后会有一张"船票"飘然而出 ,请你参与"拯救地球"重磅消息:只要在百度搜索"2012世界末日",你的电脑显示器页面将会震动,出现地震山摇的状况,然后会有一张"船票"飘然而出 ,请你参与"拯救地球"重磅消息:只要在百度搜索"2012世界末日",你的电脑显示器页面将会震动,出现地震山摇的状况,然后会有一张"船票"飘然而出 ,请你参与"拯救地球""

</div>

<script type="text/javascript" src="baiduquake.js"></script>

</body>

</html>

  对前端技术感兴趣的童鞋可以好好研究下哈!!!!!!

 

下载源代码,请点击下面链接:

http://files.cnblogs.com/sharpxiajun/baidu.zip

你可能感兴趣的:(2012)