一、應用展示
關于層的智能浮動效果早在幾年前我就在國外的一些個人網站的垂直導航上見到了,現在似乎在國內一些商業網站上也屢見此效果,例如淘寶網的搜索結果頁的排序水平條,在默認狀態下,滾動條跟隨頁面滾動,如下:
隨著頁面向下滾動,當此水平條接觸瀏覽器的上邊緣時,水平條獨立出來,不跟隨滾動條滾動了,如下圖所示:
類似的效果在新浪微博上也有:
當頁面滾動,新動態提示開始要淡出瀏覽器窗口的時候,其浮動于瀏覽器窗口的最上沿顯示,如下圖所示:
此效果實現原理其實很簡單,本文就將展示其實現。
二、實現原理
默認狀態就是默認狀態做網頁用浮動還是定位,什么事情也不用做,定位是也好,也好做網頁用浮動還是定位,都ok。關鍵是當瀏覽器滾動的時候,對象(要浮動的層)要移除瀏覽器界面視區的時候,修改其屬性,讓其浮動在窗口的上沿顯示就可以了。最好的屬性就是fixed了,可以在IE6+和其他瀏覽器下浮動層平滑固定定位,由于IE6前輩不支持fixed屬性,所以,后退一步,使用屬性代替,但是會有副作用——滾動不平滑。但,這也是沒有辦法的事情了。
現在關鍵就是如何判斷當前層與瀏覽器窗口的上邊緣接觸呢?當浮動層與瀏覽器窗口上邊緣接觸的一瞬間,其頁面垂直偏移值與頁面的滾動高度其實是一致的,所以,用這個進行判斷就OK了,但是,如何獲得頁面上元素距離頁面的垂直距離呢?純粹的js代碼獲得此值還是比較麻煩的,好在庫幫我們解決了這些工作,所以,我們的工作其實就很平坦,下面就將展示如何在庫以及庫下實現該效果。
三、下的層的智能浮動
方法代碼如下:
$.fn.smartFloat = function() { var position = function(element) { var top = element.position().top, pos = element.css("position"); $(window).scroll(function() { var scrolls = $(this).scrollTop(); if (scrolls > top) { if (window.XMLHttpRequest) { element.css({ position: "fixed", top: 0 }); } else { element.css({ top: scrolls }); }
}else { element.css({ position: "absolute", top: top }); } }); }; return $(this).each(function() { position($(this)); }); };
調用很簡單,直接一行代碼就ok了,例如下面:
$("#float").smartFloat();
妥妥兒的,就一小段綁定就實現了id為float的標簽有了智能浮動功能,效果描述就是:當id為float的元素在滾動的時候與瀏覽器上邊緣接觸時就不會再跟隨滾動條滾動了。
您可以狠狠地點擊這里:下的層的智能浮動demo
打開demo頁面,您會看到右側自詡羞澀的浮動層了,滾動頁面觀察效果:
四、下的層的智能浮動
與實現一樣,庫下也已經將此方法包裝了起來,代碼如下:
var $smartFloat = function(elements) { var position = function(element) { var top = element.getPosition().y, pos = element.getStyle("position"); window.addEvent("scroll", function() { var scrolls = this.getScroll().y; if (scrolls > top) { if (window.XMLHttpRequest) { element.setStyles({ position: "fixed", top: 0}); } else { element.setStyles({ top: scrolls }); } }else { element.setStyles({ position: "absolute", top: top }); } }); }; if ($type(elements) === "array") { return elements.each(function(items) {
position(items); }); } else if ($type(elements) === "element") { position(elements); } };
使用也是非常的簡單,就一句代碼,同樣以id為float的標簽舉例,代碼如下:
$smartFloat($("float"));
您可以狠狠地點擊這里:下的層的智能浮動demo
滾動demo頁面的滾動條,當“羞澀”的浮動層與瀏覽器邊緣“接觸”的時候,就不再跟隨滾動條滾動了,如下圖所示:
五、光棍節結語
又是一年光棍節,巧的是今天也是德藝雙馨的青少年啟蒙教育家蒼井空姐姐的生日。我想起了高中時的“棍子幫”,想起了“封棍”,“黃棍”;想起來了大學時候的“光棍協議”(藏在墻上我的畫的后面)。今天我沒有過節,而是聽著悲催的音樂寫著同樣孤獨氣息的文章,不是因為我已經脫離“棍”的稱號,而是看不到脫離“棍”稱號的跡象。究其原因,或許正是因為在這個特殊的日子還宅在電腦前寫東西而不是出去看看靚妹。罷了罷了,孤獨是可以成就人的,聊以慰藉吧。
突然發現原來已經好久沒有寫效果實例了,悲催的時光正悄無聲息地帶走我年少的歲月,一晃數月已逝。當N年后再回過頭來看這段時光是會覺得得到的多呢還是失去多呢?誰知道呢!
資質尚淺,方法僅供參考,或許有更好更簡潔高效的實現方法,歡迎交流,歡迎指正。最后,祝同樣單身的人們“光棍節快樂!” ——去淘寶5折狂吧!
本文為原創文章,轉載請注明來自張鑫旭-鑫空間-鑫生活[]