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 相关文章推荐
js switch case default 的用法示例介绍
Oct 23 Javascript
JS随机打乱数组的方法小结
Jun 22 Javascript
详解AngularJS如何实现跨域请求
Aug 22 Javascript
基于javascript 显式转换与隐式转换(详解)
Dec 15 Javascript
vue axios 给生产环境和发布环境配置不同的接口地址(推荐)
May 08 Javascript
如何使用 vue + d3 画一棵树
Dec 03 Javascript
JQuery animate动画应用示例
May 14 jQuery
微信小程序实现点击空白隐藏的方法示例
Aug 13 Javascript
JavaScript实现图片上传并预览并提交ajax
Sep 30 Javascript
JavaScript canvas绘制折线图
Feb 18 Javascript
vue.js实现简单的计算器功能
Feb 22 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
用PHP+MySQL搭建聊天室功能实例代码
2012/08/20 PHP
PHP使用curl模拟post上传及接收文件的方法
2016/03/04 PHP
PHP MySql增删改查的简单实例
2016/06/21 PHP
删除PHP数组中头部、尾部、任意元素的实现代码
2017/04/10 PHP
PHP 加密 Password Hashing API基础知识点
2020/03/02 PHP
跨浏览器的事件对象介绍
2012/06/27 Javascript
ajax处理php返回json数据的实例代码
2013/01/24 Javascript
js关闭浏览器窗口及检查浏览器关闭事件
2013/09/03 Javascript
Google Dart编程语法和基本类型学习教程
2013/11/27 Javascript
jquery.post用法示例代码
2014/01/03 Javascript
浅谈JavaScript for循环 闭包
2016/06/22 Javascript
JQuery实现列表中复选框全选反选功能封装(推荐)
2016/11/24 Javascript
D3.js中强制异步文件读取同步的几种方法
2017/02/06 Javascript
JavaScript hasOwnProperty() 函数实例详解
2017/08/04 Javascript
jQuery 防止相同的事件快速重复触发方法
2018/02/08 jQuery
Vue $emit $refs子父组件间方法的调用实例
2018/09/12 Javascript
原生JS运动实现轮播图
2021/01/02 Javascript
JavaScript中展开运算符及应用的实例代码
2021/01/14 Javascript
vue监听键盘事件的相关总结
2021/01/29 Vue.js
windows下安装Python的XlsxWriter模块方法
2018/05/03 Python
python实现遍历文件夹修改文件后缀
2018/08/28 Python
解决Mac下首次安装pycharm无project interpreter的问题
2018/10/29 Python
python之线程通过信号pyqtSignal刷新ui的方法
2019/01/11 Python
python实现同一局域网下传输图片
2020/03/20 Python
解决pycharm下pyuic工具使用的问题
2020/04/08 Python
django 装饰器 检测登录状态操作
2020/07/02 Python
python如何实现递归转非递归
2021/02/25 Python
澳大利亚礼品卡商店:Gift Card Store
2019/06/24 全球购物
override和overload的区别
2016/03/09 面试题
采购经理岗位职责
2014/02/16 职场文书
《莫高窟》教学反思
2014/02/25 职场文书
会计电算化应届生自荐信
2014/02/25 职场文书
市级三好学生事迹材料
2014/08/27 职场文书
面试通知短信
2015/04/20 职场文书
2015年社区居委会工作总结
2015/05/18 职场文书
《山中访友》教学反思
2016/02/24 职场文书