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 相关文章推荐
JQuery伸缩导航练习示例
Nov 13 Javascript
深入理解JavaScript高级之词法作用域和作用域链
Dec 10 Javascript
javaScript如何生成xmlhttp
Dec 16 Javascript
js验证IP及子网掩码的合法性有效性示例
Apr 30 Javascript
解决Jquery向页面append新元素之后事件的绑定问题
Mar 16 Javascript
谈谈js中的prototype及prototype属性解释和常用方法
Nov 25 Javascript
JavaScript省市区三级联动菜单效果
Sep 21 Javascript
详解微信小程序开发—你期待的分享功能来了,微信小程序序新增5大功能
Dec 23 Javascript
小发现之浅谈location.search与location.hash的问题
Jun 23 Javascript
javascript基于牛顿迭代法实现求浮点数的平方根【递归原理】
Sep 28 Javascript
微信小程序实现留言板
Oct 31 Javascript
小程序:授权、登录、session_key、unionId的详解
May 15 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
曾在DC漫画界反派角色扮演的演员,谁才是你心目中的小丑之王?
2020/04/09 欧美动漫
可定制的PHP缩略图生成程式(需要GD库支持)
2007/03/06 PHP
Cakephp 执行主要流程
2010/03/24 PHP
Yii使用技巧大汇总
2015/12/29 PHP
php 调用百度sms来发送短信的实现示例
2018/11/02 PHP
浅谈PHP无限极分类原理
2019/03/14 PHP
Thinkphp5.0 框架Model模型简单用法分析
2019/10/11 PHP
javascript 写的一个简单的timer
2009/07/30 Javascript
javascript来定义类的规范小结
2010/11/19 Javascript
用javascript作一个通用向导说明
2011/08/30 Javascript
offsetHeight在OnLoad中获取为0的现象
2013/07/22 Javascript
Javascript alert消息换行的方法
2013/08/07 Javascript
JQUERY dialog的用法详细解析
2013/12/19 Javascript
javascript中一些util方法汇总
2015/06/10 Javascript
javascript同步服务器时间和同步倒计时小技巧
2015/09/24 Javascript
基于BootStrap Metronic开发框架经验小结【六】对话框及提示框的处理和优化
2016/05/12 Javascript
JavaScript自学笔记(必看篇)
2016/06/23 Javascript
浅谈javascript:两种注释,声明变量,定义函数
2016/10/05 Javascript
vue 2.0 购物车小球抛物线的示例代码
2018/02/01 Javascript
一文读懂ES7中的javascript修饰器
2019/05/06 Javascript
在微信小程序中渲染HTML内容3种解决方案及分析与问题解决
2020/01/12 Javascript
js+cavans实现图片滑块验证
2020/09/29 Javascript
Javascript新手入门之字符串拼接与变量的应用
2020/12/03 Javascript
[02:49]DOTA2完美大师赛首日观众采访
2017/11/23 DOTA
在Python程序和Flask框架中使用SQLAlchemy的教程
2016/06/06 Python
python 第三方库的安装及pip的使用详解
2017/05/11 Python
python3处理含有中文的url方法
2018/05/10 Python
Kali Linux安装ipython2 和 ipython3的方法
2019/07/11 Python
使用python os模块复制文件到指定文件夹的方法
2019/08/22 Python
Python内置方法实现字符串的秘钥加解密(推荐)
2019/12/09 Python
python爬虫实现爬取同一个网站的多页数据的实例讲解
2021/01/18 Python
如何让Java程序执行效率更高
2014/06/25 面试题
违纪检讨书2000字
2014/02/08 职场文书
幼儿园优秀班主任事迹材料
2014/05/14 职场文书
大学生第一学年自我鉴定
2014/09/12 职场文书
初中中等生评语
2014/12/29 职场文书