js页面滚动时层智能浮动定位实现(jQuery/MooTools)


Posted in Javascript onAugust 23, 2011

一、应用展示
关于层的智能浮动效果早在几年前我就在国外的一些个人网站的垂直导航上见到了,现在似乎在国内一些商业网站上也屡见此效果,例如淘宝网的搜索结果页的排序水平条,在默认状态下,滚动条跟随页面滚动,如下:

js页面滚动时层智能浮动定位实现(jQuery/MooTools)

随着页面向下滚动,当此水平条接触浏览器的上边缘时,水平条独立出来,不跟随滚动条滚动了,如下图所示:
js页面滚动时层智能浮动定位实现(jQuery/MooTools)

类似的效果在新浪微博上也有:
js页面滚动时层智能浮动定位实现(jQuery/MooTools)

当页面滚动,新动态提示开始要淡出浏览器窗口的时候,其浮动于浏览器窗口的最上沿显示,如下图所示:
js页面滚动时层智能浮动定位实现(jQuery/MooTools)

此效果实现原理其实很简单,本文就将展示其实现。 

二、实现原理

默认状态就是默认状态,什么事情也不用做,定位是absolute也好,static也好,都ok。关键是当浏览器滚动的时候,对象(要浮动的层)要移除浏览器界面视区的时候,修改其position属性,让其浮动在窗口的上沿显示就可以了。最好的position属性就是fixed了,可以在IE6+和其他浏览器下浮动层平滑固定定位,由于IE6前辈不支持fixed属性,所以,后退一步,使用absolute属性代替,但是会有副作用——滚动不平滑。但,这也是没有办法的事情了。

现在关键就是如何判断当前层与浏览器窗口的上边缘接触呢?当浮动层与浏览器窗口上边缘接触的一瞬间,其页面垂直偏移值与页面的滚动高度其实是一致的,所以,用这个进行判断就OK了,但是,如何获得页面上元素距离页面的垂直距离呢?纯粹的js代码获得此值还是比较麻烦的,好在JavaScript库帮我们解决了这些工作,所以,我们的工作其实就很平坦,下面就将展示如何在jQuery库以及MooTools库下实现该效果。

三、jQuery下的层的智能浮动

方法代码如下:

$.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的元素在滚动的时候与浏览器上边缘接触时就不会再跟随滚动条滚动了。

您可以狠狠地点击这里:jQuery下的层的智能浮动demo

打开demo页面,您会看到右侧自诩羞涩的浮动层了,滚动页面观察效果:
js页面滚动时层智能浮动定位实现(jQuery/MooTools)

四、MooTools下的层的智能浮动

与jQuery实现一样,MooTools库下也已经将此方法包装了起来,代码如下:

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"));
您可以狠狠地点击这里:MooTools下的层的智能浮动demo

滚动demo页面的滚动条,当“羞涩”的浮动层与浏览器边缘“接触”的时候,就不再跟随滚动条滚动了,如下图所示:
js页面滚动时层智能浮动定位实现(jQuery/MooTools)
来自张鑫旭

Javascript 相关文章推荐
在JavaScript中通过URL传递汉字的方法
Apr 09 Javascript
DOM和XMLHttpRequest对象的属性和方法整理
Jan 04 Javascript
使用js检测浏览器的实现代码
May 14 Javascript
javascript-表格排序(降序/反序)实现介绍(附图)
May 30 Javascript
jquery使用$(element).is()来判断获取的tagName
Aug 24 Javascript
javascript实现仿IE顶部的可关闭警告条
May 05 Javascript
jQuery插件扩展测试实例
Jun 21 Javascript
Node.js DES加密的简单实现
Jul 07 Javascript
jQuery如何封装输入框插件
Aug 19 Javascript
javascript判断元素存在和判断元素存在于实时的dom中的方法
Jan 17 Javascript
jQuery实现的点击图片居中放大缩小功能示例
Jan 16 jQuery
浅谈vue单页面中有多个echarts图表时的公用代码写法
Jul 19 Javascript
jQuery页面滚动浮动层智能定位实例代码
Aug 23 #Javascript
jqGrid jQuery 表格插件测试代码
Aug 23 #Javascript
30个精美的jQuery幻灯片效果插件和教程
Aug 23 #Javascript
js 函数的副作用分析
Aug 23 #Javascript
javascript 运算数的求值顺序
Aug 23 #Javascript
读jQuery之十四 (触发事件核心方法)
Aug 23 #Javascript
读jQuery之十三 添加事件和删除事件的核心方法
Aug 23 #Javascript
You might like
用PHP读取RSS feed的代码
2008/08/01 PHP
PHP中quotemeta()函数的用法讲解
2019/04/04 PHP
用JavaScript实现UrlEncode和UrlDecode的脚本代码
2008/07/23 Javascript
onbeforeunload与onunload事件异同点总结
2013/06/24 Javascript
window.navigate 与 window.location.href 的使用区别介绍
2013/09/21 Javascript
jquery下拉select控件操作方法分享(jquery操作select)
2014/03/25 Javascript
javascript实现des解密加密全过程
2014/04/03 Javascript
JavaScript实现鼠标点击后层展开效果的方法
2015/05/13 Javascript
简介JavaScript中的push()方法的使用
2015/06/09 Javascript
将页面table内容与样式另存成excel文件的方法
2015/08/05 Javascript
js文本框走动跑马灯效果代码分享
2015/08/25 Javascript
JS修改地址栏参数实例代码
2016/06/14 Javascript
详解webpack解惑:require的五种用法
2017/06/09 Javascript
jQuery插件artDialog.js使用与关闭方法示例
2017/10/09 jQuery
判断jQuery是否加载完成,没完成继续判断的解决方法
2017/12/06 jQuery
微信小程序自定义toast弹窗效果的实现代码
2018/11/15 Javascript
JS实现简单的抽奖转盘效果示例
2019/02/16 Javascript
[06:21]2014DOTA2国际邀请赛 庆祝VG首阶段领跑;B叔为挣牛排半夜整理情报
2014/07/13 DOTA
Python的Django框架中if标签的相关使用
2015/07/15 Python
Python正则表达式使用经典实例
2016/06/21 Python
分享一下如何编写高效且优雅的 Python 代码
2017/09/07 Python
python3.X 抓取火车票信息【修正版】
2018/06/19 Python
python实现栅栏加解密 支持密钥加密
2019/03/20 Python
使用Python画股票的K线图的方法步骤
2019/06/28 Python
Python图像处理之图片文字识别功能(OCR)
2019/07/30 Python
Python学习笔记之Zip和Enumerate用法实例分析
2019/08/14 Python
python爬虫库scrapy简单使用实例详解
2020/02/10 Python
Python模拟FTP文件服务器的操作方法
2020/02/18 Python
Python getsizeof()和getsize()区分详解
2020/11/20 Python
python 基于UDP协议套接字通信的实现
2021/01/22 Python
不开辟用于交换数据的临时空间,如何完成字符串的逆序
2012/12/02 面试题
幼儿园运动会加油词
2014/02/14 职场文书
工作证明格式及范本
2014/09/12 职场文书
就业协议书怎么填
2014/09/15 职场文书
初三语文教学反思
2016/03/03 职场文书
使用Python开发贪吃蛇游戏 SnakeGame
2022/04/30 Python