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