jquery版懸浮模塊demo

  在作在線客服時,代碼就是按照該模塊命名。如今,我要添加一個返回主頁的功能,我以爲再複製一遍以前的代碼,那個量有點多,若是我再添加一個功能,那個量會不少……如今我用建立對象字面量的方式來建立(其實我還想作的更簡單一點,將代碼封裝起來,直接用一個方法調用。可是如今還沒想到很好的封裝方式,就先把如今的這種方式記錄下來)。javascript

  1、演示圖css

  初始狀態:html

    

  滑動狀態(超過臨界值):java

 

  2、html代碼瀏覽器

<div class="container">
    <!-- start header -->
    <div class="header">
        <div class="header-inner"></div>
    </div>
    <!-- end header -->
<!-- start wrapper --> <div class="wrapper"> <div class="wrapper-inner"> <!-- 返回按鈕 --> <div class="returnHome"><a href="/demonstrate.htm"><img src="images/ico_return.png"/></a></div> <!-- 在線客服 --> <div class="online onlineBlue"> <ul> <li class="item1"> <a class="help" href="javascript:void(0);"></a> <div class="on-detail"> <h3><i></i>客服電話</h3> <p>更快更貼心的服務熱線</p> <p>服務時間:週一至六9:00-18:00</p> <p class="c-orange">000-0000-0000</p> </div> </li> <li class="item2"> <a class="help" href="javascript:void(0);"></a> <div class="on-detail"> <h3><i></i>QQ在線客服</h3> <p>爲您實時解決問題</p> <p>服務時間:週一至六9:00-18:00</p> <a href="javascript:void(0);"><img border="0" src="http://imgs1.mxthcdn.com/b/I16i2730m062365593198_lZXkeT.jpg" alt="客服,歡迎您來諮詢" title="客服,歡迎您來諮詢"></a> </div> </li> <li class="itemlast"> <a class="help" style="display: none;" id="returnTop" title="返回頂部" href="javascript:void(0);"></a> </li> </ul> </div> <div class="slide"></div> </div> </div> <!-- end wrapper -->
</div>

  3、js代碼app

$(function(){
    if ('undefined' == typeof(document.body.style.maxHeight)) {
        /* 在線客服 */
        var $own;
        $(".online li").hover(function(){
            $own = $(this);
            $own.addClass("ie6hover");
        },function(){
            $own.removeClass("ie6hover");
        })
    }

    /* 定位在線客服 */
    var $content = $(".wrapper-inner"), /* 中間主要內容 */
        $online = $(".online"), /* 在線客服 */
        $returnHome = $(".returnHome"), /* 返回首頁 */
        $returnTop = $("#returnTop"), /* 返回頂部 */
        contentWidth = $content.width(),
        onlineWidth = $online.width(),
        returnHomeWidth = $returnHome.width(),
        wWidth, /* window的寬度 */
        wHeight, /* window的高度 */
        contentLeft, /* $content距離左邊的距離 */
        contentTop, /* $content距離頂部的距離 */
        dScrollTop, /* 滾動條距離頂部位置 */
        crisisHeight, /* 臨界高度,就是滾動條滾動到哪一個位置就開始執行 */
        onlineConnectHeight = $(".slide").height(), /* online中鏈接header和在線客服中間的距離 */
        returnHomeConnectHeight = $(".header").height(), /* online中鏈接header和在線客服中間的距離 */
        targetValue = 960, /* 臨界大小,也就是當window的寬度爲960時怎麼樣怎麼樣,也能夠設置1200,看需求 */
        Hang = $.extend({
            defineReturnTop: function(){ /* 返回到頂部 */
                if(dScrollTop == 0){
                    $returnTop.fadeOut(200);
                }else if(dScrollTop > 0){
                    $returnTop.fadeIn();
                }
            },
            defineSize: function(){ /* 初始化 */
                wWidth = $(window).width(),
                    wHeight = $(window).height(),
                    dScrollTop = $(document).scrollTop(),
                    contentLeft = $content.offset().left, /* wrapper-inner距離左邊距離 */
                    contentTop = $content.offset().top, /* wrapper-inner距離頂部距離 */
                    crisisHeight = contentTop + onlineConnectHeight; /* online距離頂部的距離 */

                /* 懸浮對象 */
                var hangObj = {
                    online: {
                        target: $online, /* 目標標籤 */
                        crisisHeight: crisisHeight, /* 臨界高度值 */
                        left: "", /* absolute的left值 */
                        leftFixed: "", /* fixed的left值 */
                        top: crisisHeight, /* absolute的top值 */
                        topFixed: "20px", /* fixed的top值 */
                        topIe6: dScrollTop /* ie6下面top值 */
                    },
                    returnHome: {
                        target: $returnHome,
                        crisisHeight: contentTop,
                        left: "",
                        leftFixed: "",
                        top: contentTop,
                        topFixed: "10px",
                        topIe6: dScrollTop
                    }
                }
                Hang.defineReturnTop(); /* 返回頂部事件調用 */
                if(wWidth < targetValue){/* 當window的寬度小於960時作如下操做 */
                    hangObj.online.left = wWidth - onlineWidth;
                    hangObj.online.leftFixed = wWidth - onlineWidth;
                    hangObj.returnHome.left = 0;
                    hangObj.returnHome.leftFixed = 0;
                    Hang.defineHangCrisis(hangObj.online);
                    Hang.defineHangCrisis(hangObj.returnHome);
                }else if(wWidth >= targetValue){
                    hangObj.online.left = contentWidth + contentLeft;
                    hangObj.online.leftFixed = contentWidth + contentLeft;
                    hangObj.returnHome.left = contentLeft - returnHomeWidth;
                    hangObj.returnHome.leftFixed = contentLeft - returnHomeWidth;
                    Hang.defineHangCrisis(hangObj.online);
                    Hang.defineHangCrisis(hangObj.returnHome);
                }
            },
            defineHangCrisis: function(obj){ /* 定義懸浮臨界事件 */
                /* 除ie6之外的瀏覽器 */
                if ('undefined' != typeof(document.body.style.maxHeight)) {
                    /* 當滾動條高度小於online以上的高度(也就是還未碰到臨界值),讓online以absolute的形式顯示,寬度是相對於body定位 */
                    if(obj.crisisHeight > dScrollTop){
                        obj.target.removeClass("onlineFixed");
                        obj.target.css({left: obj.left, top: obj.top});
                    }else{
                        /* 當滾動條滾動到online處時,online就開始以fixed的形式持續顯示,寬度是相對於body定位 */
                        obj.target.addClass("onlineFixed");
                        obj.target.css({left: obj.leftFixed,top: obj.topFixed});
                    }
                }else{/* 針對ie6 */
                    if(obj.crisisHeight > dScrollTop){
                        obj.target.css({left: obj.left, top: obj.top});
                    }else{
                        obj.target.css({left: obj.left, top: obj.topIe6});
                    }
                }
            }
        },function(){});

    /*----------------- 如下爲觸發事件----------------------- */
    Hang.defineSize(); /* 初始化大小 */
    $(window).resize(function(){
        Hang.defineSize();
    })

    $(window).scroll(function(){
        Hang.defineSize();
    })

    /* 返回頂部 */
    $returnTop.click(function(){
        $(document).scrollTop(0);
    })
})

   分析:ide

  由於代碼裏註釋的很清楚,因此我這裏只作一個簡單介紹(關於在線客服)。this

  先說一下個人設計思路,我先考慮它會有幾種狀態,不改變窗口大小和改變窗口大小的區別,滾動滑動條和不滾動滑動條的區別。spa

  (1)不改變窗口大小而且不滾動滾動條(或者滾動條未超過臨界值),是用position:absolute定位在一個固定位置(相對於body),位置定義看本身需求,想要在左邊就左邊右邊就右邊。我這裏固定在wrapper-inner中間內容的左側,slide的底部那個位置(crisisHeight臨界高度就是根據這個獲得的)。因此left值爲wrapper-inner左邊的距離加上wrapper-inner的寬度,即contentWidth + contentLeft。高度爲header的高度加上slide的高度,即contentTop + onlineConnectHeight。.net

  (2)不改變窗口大小而且滾動滾動條(滾動條滾動超過臨界值),是用position:fixed定位在一個固定位置(不包括ie6,由於它不支持fixed,下面會有專門講解),fixed相對於body的(窗口左上角),left值爲wrapper-inner左邊的距離加上wrapper-inner的寬度,因此爲contentWidth + contentLeft。高度爲0(自定義的),即一直在窗口頂部。

  (3)改變窗口大小而且不滾動滾動條(或者滾動條未超過臨界值),這裏就是改變一下left值,把位置放在window的右邊,因此left值爲window的寬度減去left值自身的寬度,即wWidth - onlineWidth。top值不變。

  (4)改變窗口大小而且滾動滾動條(滾動條滾動超過臨界值),這裏就是改變一下left值,把位置放在window的右邊,因此left值爲window的寬度減去left值自身的寬度,即wWidth - onlineWidth。top值不變。

  (5)ie6下面定義就只有一點不同,沒有fixed這個屬性。全部top值不同,它的top值爲滾動滾動的高度,即dScrollTop

  hangObj爲懸浮對象字面量,能夠根據需求添加多個模塊,只需在這邊添加屬性,再調用方法便可,下降了代碼重複率(我後期還會繼續精簡代碼量)。

  但願這些能給須要的人一丁點幫助,若是有哪裏講的很差或者不對的地方往指正,謝謝~點擊下載demo

相關文章
相關標籤/搜索