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代码
Apr 22 Javascript
jQuery 获取对象 根据属性、内容匹配, 还有表单元素匹配
May 31 Javascript
js如何获取兄弟、父类等节点
Jan 06 Javascript
jquery中对于批量deferred的处理方法
Jan 22 Javascript
JavaScript简介
Feb 15 Javascript
详解vue 数组和对象渲染问题
Sep 21 Javascript
在VUE中实现文件下载并判断状态的方法
Nov 08 Javascript
vue实现短信验证码输入框
Apr 17 Javascript
Vue 自适应高度表格的实现方法
May 13 Javascript
实例讲解React 组件
Jul 07 Javascript
vue setInterval 定时器失效的解决方式
Jul 30 Javascript
Vue+scss白天和夜间模式切换功能的实现方法
Jan 05 Vue.js
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
Yii实现单用户博客系统文章详情页插入评论表单的方法
2015/12/28 PHP
php计算多个集合的笛卡尔积实例详解
2017/02/16 PHP
基于laravel缓冲cache的用法详解
2019/10/23 PHP
json简单介绍
2008/06/10 Javascript
判断目标是否是window,document,和拥有tagName的Element的代码
2010/05/31 Javascript
jQuery 源码分析笔记(2) 变量列表
2011/05/28 Javascript
JQuery实现展开关闭层的方法
2015/02/17 Javascript
Javascript中的call()方法介绍
2015/03/15 Javascript
js实现简洁的TAB滑动门效果代码
2015/09/06 Javascript
JS实现的在线调色板实例(附demo源码下载)
2016/03/01 Javascript
动态JavaScript所造成一些你不知道的危害
2016/09/25 Javascript
微信小程序(应用号)开发新闻客户端实例
2016/10/24 Javascript
p5.js 毕达哥拉斯树的实现代码
2018/03/23 Javascript
vue3.0 CLI - 2.3 - 组件 home.vue 中学习指令和绑定
2018/09/14 Javascript
Vue插件之滑动验证码
2019/09/21 Javascript
vue路由守卫,限制前端页面访问权限的例子
2019/11/11 Javascript
微信小程序实现点击导航条切换页面
2020/11/19 Javascript
Python实现 多进程导入CSV数据到 MySQL
2017/02/26 Python
django 修改server端口号的方法
2018/05/14 Python
Python设计模式之命令模式原理与用法实例分析
2019/01/11 Python
Django Sitemap 站点地图的实现方法
2019/04/29 Python
python实现在函数中修改变量值的方法
2019/07/16 Python
django中使用Celery 布式任务队列过程详解
2019/07/29 Python
tensorflow安装成功import tensorflow 出现问题
2020/04/16 Python
解决keras加入lambda层时shape的问题
2020/06/11 Python
基于django2.2连oracle11g解决版本冲突的问题
2020/07/02 Python
阿迪达斯墨西哥官方网站:adidas墨西哥
2017/11/03 全球购物
Fnac西班牙官网:法国文化和电子产品零售商
2021/03/14 全球购物
教师节促销活动方案
2014/02/14 职场文书
党员创先争优承诺书
2014/03/26 职场文书
专项法律服务方案
2014/06/11 职场文书
警察群众路线整改措施
2014/09/26 职场文书
英文感谢信范文
2015/01/21 职场文书
欢迎词范文
2015/01/27 职场文书
我是特种兵观后感
2015/06/11 职场文书
致男子1500米运动员的广播稿
2019/11/08 职场文书