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给dropdownlist添加选项的小例子
Mar 04 Javascript
JS删除数组元素的函数介绍
Mar 27 Javascript
javascript实现避免页面按钮重复提交
Jan 08 Javascript
JavaScript闭包详解
Feb 02 Javascript
比例尺、缩略图、平移缩放之百度地图添加控件方法
Aug 03 Javascript
js实现的页面加载完毕之前loading提示效果完整示例【附demo源码下载】
Aug 02 Javascript
javascript兼容性(实例讲解)
Aug 15 Javascript
Vue通过URL传参如何控制全局console.log的开关详解
Dec 07 Javascript
jquery自定义显示消息数量
Dec 19 jQuery
vue-cli3 项目优化之通过 node 自动生成组件模板 generate View、Component
Apr 30 Javascript
在JavaScript中使用严格模式(Strict Mode)
Jun 13 Javascript
JavaScript 中for/of,for/in 的详细介绍
Nov 17 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中mt_rand()随机数的安全
2017/10/12 PHP
php框架CodeIgniter使用redis的方法分析
2018/04/13 PHP
laravel Model 执行事务的实现
2019/10/10 PHP
新手常遇到的一些jquery问题整理
2010/08/16 Javascript
Extjs优化(一)删除冗余代码提高运行速度
2013/04/15 Javascript
Jquery方式获取iframe页面中的 Dom元素
2014/05/07 Javascript
js判断变量初始化的三种形式及推荐用的形式
2014/07/22 Javascript
Jquery实现兼容各大浏览器的Enter回车切换输入焦点的方法
2014/09/01 Javascript
jQuery中的一些小技巧
2017/01/18 Javascript
AngularJS的ng-repeat指令与scope继承关系实例详解
2017/01/21 Javascript
微信小程序 点击控件后选中其它反选实例详解
2017/02/21 Javascript
vuejs响应用户事件(如点击事件)
2017/03/14 Javascript
Javarscript中模块(module)、加载(load)与捆绑(bundle)详解
2017/05/28 Javascript
解决element-ui中下拉菜单子选项click事件不触发的问题
2018/08/22 Javascript
解决angular2 获取到的数据无法实时更新的问题
2018/08/31 Javascript
vue 子组件watch监听不到prop的解决
2020/08/09 Javascript
JavaScript实现10秒后再次获取验证码
2020/12/02 Javascript
[04:13]2018国际邀请赛典藏宝瓶Ⅱ饰品一览
2018/07/21 DOTA
Python 时间操作例子和时间格式化参数小结
2014/04/24 Python
Python3基础之基本运算符概述
2014/08/13 Python
浅谈python数据类型及类型转换
2017/12/18 Python
Python实现学校管理系统
2018/01/11 Python
Python3实现获取图片文字里中文的方法分析
2018/12/13 Python
python实现飞船大战
2020/04/24 Python
python使用Thread的setDaemon启动后台线程教程
2020/04/25 Python
多视角3D逼真HTML5水波动画
2016/03/03 HTML / CSS
科颜氏印度官网:Kiehl’s印度
2021/02/20 全球购物
Oracle快照(snapshot)
2015/03/13 面试题
应届大学毕业生找工作的求职信范文
2013/11/29 职场文书
宗教学大学生职业生涯规划范文
2014/02/08 职场文书
后勤部经理岗位职责
2014/02/23 职场文书
教师演讲稿大全
2014/05/16 职场文书
机关职员工作检讨书
2014/10/23 职场文书
幼儿园综治宣传月活动总结
2015/05/07 职场文书
用Python提取PDF表格的方法
2021/04/11 Python
浅谈MySql update会锁定哪些范围的数据
2022/06/25 MySQL