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 相关文章推荐
window.open的功能全解析
Oct 10 Javascript
jsonp原理及使用
Oct 28 Javascript
阻止事件(取消浏览器对事件的默认行为并阻止其传播)
Nov 03 Javascript
javascript中checkbox使用方法简单实例演示
Nov 17 Javascript
sea.js常用的api简易文档
Nov 15 Javascript
详解Vue 实例中的生命周期钩子
Mar 21 Javascript
js canvas实现红包照片效果
Aug 21 Javascript
vue仿element实现分页器效果
Sep 13 Javascript
js+html实现周岁年龄计算器
Jun 25 Javascript
小程序分页实践之编写可复用分页组件
Jul 18 Javascript
Vue和React有哪些区别
Sep 12 Javascript
JS前端监控采集用户行为的N种姿势
Jul 23 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
使用swoole扩展php websocket示例
2014/02/13 PHP
PHP实现获取某个月份周次信息的方法
2015/08/11 PHP
PHP读取大文件的多种方法介绍
2016/04/04 PHP
php 人员权限管理(RBAC)实例(推荐)
2017/05/24 PHP
详细对比php中类继承和接口继承
2018/10/11 PHP
javascript multibox 全选
2009/03/22 Javascript
js带按钮的提示框可供选择示例代码
2013/09/17 Javascript
JavaScript实现信用卡校验方法
2015/04/07 Javascript
JavaScript手机振动API
2016/06/11 Javascript
AngularJS基础 ng-show 指令简单示例
2016/08/03 Javascript
自定义require函数让浏览器按需加载Js文件
2016/11/24 Javascript
Vue.js组件tree实现无限级树形菜单
2016/12/02 Javascript
jquery表单插件form使用方法详解
2017/01/20 Javascript
AngularJS学习第一篇 AngularJS基础知识
2017/02/13 Javascript
详解如何用webpack打包一个网站应用项目
2017/07/12 Javascript
详解Node全局变量global模块
2017/09/28 Javascript
react实现一个优雅的图片占位模块组件详解
2017/10/30 Javascript
关于 angularJS的一些用法
2017/11/29 Javascript
webpack配置导致字体图标无法显示的解决方法
2018/03/06 Javascript
jQuery+ajax读取json数据并按照价格排序示例
2018/03/28 jQuery
解决Vue 项目打包后favicon无法正常显示的问题
2018/09/01 Javascript
vue的.vue文件是怎么run起来的(vue-loader)
2018/12/10 Javascript
在Vue 中实现循环渲染多个相同echarts图表
2020/07/20 Javascript
Python语言编写电脑时间自动同步小工具
2013/03/08 Python
在Python的Flask框架中使用日期和时间的教程
2015/04/21 Python
pycharm执行python时,填写参数的方法
2018/10/29 Python
python图形开发GUI库wxpython使用方法详解
2020/02/14 Python
python实现从ftp服务器下载文件
2020/03/03 Python
StubHub墨西哥:购买和出售您的门票
2016/09/17 全球购物
星空联盟C# .net笔试题
2014/12/05 面试题
中式结婚主持词
2014/03/14 职场文书
公司股东出资证明书
2014/11/01 职场文书
法务专员岗位职责
2015/02/14 职场文书
建筑安全员岗位职责
2015/02/15 职场文书
某某店铺的开业庆典主持词范本
2019/11/25 职场文书
详解RedisTemplate下Redis分布式锁引发的系列问题
2021/04/27 Redis