js頁面滾動(dòng)時(shí)層智能浮動(dòng)定位實(shí)現(xiàn)(jQuery/MooTools)
一、應(yīng)用展示
關(guān)于層的智能浮動(dòng)效果早在幾年前我就在國外的一些個(gè)人網(wǎng)站的垂直導(dǎo)航上見到了,現(xiàn)在似乎在國內(nèi)一些商業(yè)網(wǎng)站上也屢見此效果,例如淘寶網(wǎng)的搜索結(jié)果頁的排序水平條,在默認(rèn)狀態(tài)下,滾動(dòng)條跟隨頁面滾動(dòng),如下:
隨著頁面向下滾動(dòng),當(dāng)此水平條接觸瀏覽器的上邊緣時(shí),水平條獨(dú)立出來,不跟隨滾動(dòng)條滾動(dòng)了,如下圖所示:
類似的效果在新浪微博上也有:
當(dāng)頁面滾動(dòng),新動(dòng)態(tài)提示開始要淡出瀏覽器窗口的時(shí)候,其浮動(dòng)于瀏覽器窗口的最上沿顯示,如下圖所示:
此效果實(shí)現(xiàn)原理其實(shí)很簡(jiǎn)單,本文就將展示其實(shí)現(xiàn)。
二、實(shí)現(xiàn)原理
默認(rèn)狀態(tài)就是默認(rèn)狀態(tài),什么事情也不用做,定位是absolute也好,static也好,都o(jì)k。關(guān)鍵是當(dāng)瀏覽器滾動(dòng)的時(shí)候,對(duì)象(要浮動(dòng)的層)要移除瀏覽器界面視區(qū)的時(shí)候,修改其position屬性,讓其浮動(dòng)在窗口的上沿顯示就可以了。最好的position屬性就是fixed了,可以在IE6+和其他瀏覽器下浮動(dòng)層平滑固定定位,由于IE6前輩不支持fixed屬性,所以,后退一步,使用absolute屬性代替,但是會(huì)有副作用——滾動(dòng)不平滑。但,這也是沒有辦法的事情了。
現(xiàn)在關(guān)鍵就是如何判斷當(dāng)前層與瀏覽器窗口的上邊緣接觸呢?當(dāng)浮動(dòng)層與瀏覽器窗口上邊緣接觸的一瞬間,其頁面垂直偏移值與頁面的滾動(dòng)高度其實(shí)是一致的,所以,用這個(gè)進(jìn)行判斷就OK了,但是,如何獲得頁面上元素距離頁面的垂直距離呢?純粹的js代碼獲得此值還是比較麻煩的,好在JavaScript庫幫我們解決了這些工作,所以,我們的工作其實(shí)就很平坦,下面就將展示如何在jQuery庫以及MooTools庫下實(shí)現(xiàn)該效果。
三、jQuery下的層的智能浮動(dòng)
方法代碼如下:
$.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));
});
};
調(diào)用很簡(jiǎn)單,直接一行代碼就ok了,例如下面:
$("#float").smartFloat();
妥妥兒的,就一小段綁定就實(shí)現(xiàn)了id為float的標(biāo)簽有了智能浮動(dòng)功能,效果描述就是:當(dāng)id為float的元素在滾動(dòng)的時(shí)候與瀏覽器上邊緣接觸時(shí)就不會(huì)再跟隨滾動(dòng)條滾動(dòng)了。
您可以狠狠地點(diǎn)擊這里:jQuery下的層的智能浮動(dòng)demo
打開demo頁面,您會(huì)看到右側(cè)自詡羞澀的浮動(dòng)層了,滾動(dòng)頁面觀察效果:
四、MooTools下的層的智能浮動(dòng)
與jQuery實(shí)現(xiàn)一樣,MooTools庫下也已經(jīng)將此方法包裝了起來,代碼如下:
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);
}
};
使用也是非常的簡(jiǎn)單,就一句代碼,同樣以id為float的標(biāo)簽舉例,代碼如下:
$smartFloat($("float"));
您可以狠狠地點(diǎn)擊這里:MooTools下的層的智能浮動(dòng)demo
滾動(dòng)demo頁面的滾動(dòng)條,當(dāng)“羞澀”的浮動(dòng)層與瀏覽器邊緣“接觸”的時(shí)候,就不再跟隨滾動(dòng)條滾動(dòng)了,如下圖所示:

來自張?chǎng)涡?/P>
- js阻止移動(dòng)端頁面滾動(dòng)的兩種方法
- 解決js頁面滾動(dòng)效果scrollTop在FireFox與Chrome瀏覽器間的兼容問題的方法
- js網(wǎng)頁側(cè)邊隨頁面滾動(dòng)廣告效果實(shí)現(xiàn)
- 基于AngularJS實(shí)現(xiàn)頁面滾動(dòng)到底自動(dòng)加載數(shù)據(jù)的功能
- js實(shí)現(xiàn)的鼠標(biāo)滾輪滾動(dòng)切換頁面效果(類似360默認(rèn)頁面滾動(dòng)切換效果)
- Javascript實(shí)現(xiàn)頁面滾動(dòng)時(shí)導(dǎo)航智能定位
- JavaScript實(shí)現(xiàn)頁面滾動(dòng)圖片加載(仿lazyload效果)
- 原生Js頁面滾動(dòng)延遲加載圖片實(shí)現(xiàn)原理及過程
- JS實(shí)現(xiàn)隨頁面滾動(dòng)顯示/隱藏窗口固定位置元素
- 原生js實(shí)現(xiàn)頁面滾動(dòng)動(dòng)畫
相關(guān)文章
jQuery+Ajax實(shí)現(xiàn)限制查詢間隔的方法
這篇文章主要介紹了jQuery+Ajax實(shí)現(xiàn)限制查詢間隔的方法,涉及jQuery的ajax方法參數(shù)設(shè)置及asp.net后臺(tái)交互的相關(guān)技巧,需要的朋友可以參考下2016-06-06jQuery實(shí)現(xiàn)模仿微博下拉滾動(dòng)條加載數(shù)據(jù)效果
這篇文章主要介紹了jQuery實(shí)現(xiàn)模仿微博下拉滾動(dòng)條加載數(shù)據(jù)效果,涉及jQuery響應(yīng)下拉滾動(dòng)事件動(dòng)態(tài)操作頁面元素的技巧,需要的朋友可以參考下2015-12-12JQuery實(shí)現(xiàn)級(jí)聯(lián)下拉框效果實(shí)例講解
這篇文章主要介紹了JQuery實(shí)現(xiàn)級(jí)聯(lián)下拉框效果,需要的朋友可以參考下2015-09-09