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 相关文章推荐
xmlHTTP实例
Oct 24 Javascript
Extjs在exlipse中设置自动提示的方法
Apr 07 Javascript
jQuery链使用指南
Jan 20 Javascript
js+css简单实现网页换肤效果
Dec 29 Javascript
jQuery将表单序列化成一个Object对象的实例
Nov 29 Javascript
详解JavaScript模块化开发
Dec 04 Javascript
利用n 升级工具升级Node.js版本及在mac环境下的坑
Feb 15 Javascript
详解用vue-cli来搭建vue项目和webpack
Apr 20 Javascript
前端构建工具之gulp的语法教程
Jun 12 Javascript
vue2.0的contextmenu右键弹出菜单的实例代码
Jul 24 Javascript
详细分析Node.js 模块系统
Jun 28 Javascript
vue 组件间的通信之子组件向父组件传值的方式
Jul 29 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
[FAQ]PHP中的一些常识:类篇
2006/10/09 PHP
PHP 面向对象程序设计(oop)学习笔记(三) - 单例模式和工厂模式
2014/06/12 PHP
搭建自己的PHP MVC框架详解
2017/08/16 PHP
根据选择不同的下拉值出现相对应的文本输入框
2013/08/01 Javascript
jquery mobile动态添加元素之后不能正确渲染解决方法说明
2014/03/05 Javascript
javascript正则表达式使用replace()替换手机号的方法
2015/01/19 Javascript
jquery使用ul模拟select实现表单美化的方法
2015/08/18 Javascript
JS实现方向键切换输入框焦点的方法
2015/08/19 Javascript
JavaScript操作HTML元素和样式的方法详解
2015/10/21 Javascript
js获取当前日期时间及其它日期操作汇总
2016/03/08 Javascript
详解JavaScript对象类型
2016/06/16 Javascript
vue.js初学入门教程(2)
2016/11/07 Javascript
js将字符串中的每一个单词的首字母变为大写其余均为小写
2017/01/05 Javascript
jQuery编写设置和获取颜色的插件
2017/01/09 Javascript
Require.JS中的几种define定义方式示例
2017/06/01 Javascript
微信小程序 实现点击添加移除class
2017/06/12 Javascript
基于JS递归函数细化认识及实用实例(推荐)
2017/08/07 Javascript
JS+jQuery实现注册信息的验证功能
2017/09/26 jQuery
JavaScript如何对图片进行黑白化
2018/04/10 Javascript
JS与jQuery实现ListBox上移,下移,左移,右移操作功能示例
2018/05/31 jQuery
使用vue点击li,获取当前点击li父辈元素的属性值方法
2018/09/12 Javascript
使用express获取微信小程序二维码小记
2019/05/21 Javascript
微信小程序实现类似微信点击语音播放效果
2020/03/30 Javascript
layui实现checkbox的目录树tree的例子
2019/09/12 Javascript
vue实现一个矩形标记区域(rectangle marker)的方法
2020/10/28 Javascript
[00:08]DOTA2勇士令状等级奖励“天外飞星”
2019/05/24 DOTA
在Python中使用成员运算符的示例
2015/05/13 Python
python3注册全局热键的实现
2020/03/22 Python
Pytho爬虫中Requests设置请求头Headers的方法
2020/09/22 Python
Saks Fifth Avenue澳洲/亚太地区:萨克斯第五大道精品百货店
2019/06/09 全球购物
师范生实习个人的自我评价
2013/09/28 职场文书
承办会议欢迎词
2014/01/17 职场文书
环保倡议书100字
2014/05/15 职场文书
机关干部作风建设剖析材料
2014/10/23 职场文书
教师工作总结范文2014
2014/11/10 职场文书
《家世》读后感:看家训的力量
2019/12/30 职场文书