实现原理

  主要用到几个知识点:

原理:
1,浏览器向下滚动时,当document的scrollTop大于浮动层离窗口顶部的距离时,就让浮动层的position属性设为fixed定位,脱离文档流
2,浏览器向上滚动时,当document的scrollTop小于浮动层离窗口顶部的距离时,就让浮动层的position属性设为static定位,回归文档流

代码实现

先看看html和css代码,很简单

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>float_nav</title>
<link rel="stylesheet" href="http://code.jquery.com/mobile/1.0a3/jquery.mobile-1.0a3.min.css"/>
<script type="text/javascript" src="http://code.jquery.com/jquery-1.5.min.js"></script>
<script type="text/javascript" src="http://code.jquery.com/mobile/1.0a3/jquery.mobile-1.0a3.min.js"></script>
</head> <body>
<div data-role="page">
<div data-role="header">
<h1>HEADER</h1>
</div> <div data-role="navbar" id="nav">
<ul>
<li><a href="#">Section 1</a></li>
<li><a href="#">Section 2</a></li>
<li><a href="#">Section 3</a></li>
<li><a href="#">Section 4</a></li>
<li><a href="#">Section 5</a></li>
</ul>
</div> <div data-role="content">
<br /><br /><br /><br /><br /><br />
<br /><br /><br /><br /><br /><br />
<br /><br /><br /><br /><br /><br />
<br /><br /><br /><br /><br /><br />
<br /><br /><br /><br /><br /><br />
<br /><br /><br /><br /><br /><br />
<br /><br /><br /><br /><br /><br />
<br /><br /><br /><br /><br /><br />
<br /><br /><br /><br /><br /><br />
<br /><br /><br /><br /><br /><br />
<br /><br /><br /><br /><br /><br />
</div>
</div>
</body>
</html>

下面是js代码

1,先写一个获取元素距离顶部距离的函数       原理很简单,通过递归检查是否存在父元素,累加起来得到距离值

function getTop(e){
var offset = e.offsetTop;
if(e.offsetParent != null) offset += getTop(e.offsetParent);
return offset;
}
})();

2,我们接着写js代码

//先把浮动层对象存在一个变量中,方便后面调用
var obj = document.getElementById("nav");//b为漂浮层的id
//获取浮动层元素离窗口顶部的距离
var top = getTop(obj);

3,接下来最重要的,给窗口绑定滚动事件

window.onscroll = function(){
//获取窗口的scrollTop
var bodyScrollTop = document.documentElement.scrollTop || document.body.scrollTop;
if (bodyScrollTop > top){
  /*当窗口的滚动高度大于浮动层距离窗口顶部的距离时,也就是原理中说的第一种情况
  *我们把这个浮动层position值设为fixed,top值设为0px,让它定位在窗口顶部*/
  obj.style.position = "fixed";
  obj.style.top = "0px";
  obj.style.width="100%";
} else {
  /*当窗口的滚动高度小于浮动层距离窗口顶部的距离时,也就是原理中说的第一种情况
  *我们把这个浮动层position值设为static或为空,让它回归文档流
  *让它回到原来的位置上去*/
  obj.style.position = "static";
}
}

有的人的使用的是IE6浏览器,IE6不支持fixed.fixed是定位在窗口顶部,是相对于窗口,如果我们让元素通过position:absolute相对于body定位,top设为body的scrollTop值,也就可以在IE6中模拟fixed了

4,兼容IE6..首先在前面加上判断浏览器是否是IE6的语句

//判断浏览器是否是IE6
var isIE6 = /msie 6/i.test(navigator.userAgent);

再来改动下窗口滚动事件绑定的函数的两句

//......
if (bodyScrollTop > top){
//如果是IE6,就设置position为absolute,否则设为fixed
obj.style.position = (isIE6) ? "absolute" : "fixed";
//如果是IE6,就设置top值为bodyScrollTop,否则top为0
obj.style.top = (isIE6) ? bodyScrollTop + "px" : "0px";
} else {
//......

js完整代码如下:(将js代码放在body里面的最底下)

<script type="text/javascript">
(function(){
var obj = document.getElementById("nav");
var top = getTop(obj);
var isIE6 = /msie 6/i.test(navigator.userAgent);
window.onscroll = function(){
var bodyScrollTop = document.documentElement.scrollTop || document.body.scrollTop;
if (bodyScrollTop > top){
obj.style.position = (isIE6) ? "absolute" : "fixed";
obj.style.top = (isIE6) ? bodyScrollTop + "px" : "0px";
obj.style.width="100%";
} else {
obj.style.position = "static";
}
};
function getTop(e){
var offset = e.offsetTop;
if(e.offsetParent != null) offset += getTop(e.offsetParent);
return offset;
}
})();
</script>

JQuery Mobile+JS实现智能浮动定位导航条的更多相关文章

  1. Javascript:浮动的导航条

    代码主体及说明 Javascript部分: /** * @函数名:flexScroll * @功能:滚动超出一定高度,指定元素悬浮 * @两个参数:target_id:目标元素id;topEle:限定 ...

  2. JQuery和原生JavaScript实现网页定位导航特效

    慕课网的一个小课程,练习了一遍,不足之处,欢迎指正(照片在本地,大家可以着重看代码哈): <!DOCTYPE html> <html lang="en"> ...

  3. jquery.smint.js 页面菜单浮动之谷歌浏览器异常

    jquery.smint.js 做公司项目时,谷歌测试,页面向下拉,刷新后,导航栏菜单与顶部距离发生变动,并不在设置的relative元素top下固定像素 我的relative元素的高为80,然后在j ...

  4. js页面滚动时层智能浮动定位实现

    直接上代码 $.fn.smartFloat = function (className) { var position = function (element) { var top = element ...

  5. 使用 jQuery 实现当前页面高亮显示的通栏导航条

    index.html <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> ...

  6. jquery实现可以中英切换的导航条

    html <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <ti ...

  7. jquery控制滚动条改变上面固定(fixed)导航条或者搜索框的属性

    <script type="text/javascript"> $(document).ready(function(){ $(window).scroll( func ...

  8. easy Html5 - Jquery Mobile之ToolBars(Header and Footer)

    jquery 在web js框架上的风暴还在继续却也随着移动终端走向了mobile:那么jquery mobile到底包括些什么呢 简介工具栏是在移动网站和应用中的头部,尾部或者内容中的工具条:Jqu ...

  9. 【jQuery基础学习】10 简单了解jQuery Mobile及jQuery各个级别版本的变化

    关于 jQuery Mobile jQuery Mobile是为了填补jQuery在移动设备应用上的一个新项目.它应用了HTML5和CSS3. 主要特性 基于jQuery构建. 采用与jQuery一致 ...

随机推荐

  1. C#/Net代码精简优化技巧

    (一) 在我们写代码的时候可以使用一些小的技巧来使代码变得更加简洁,易于维护和高效.下面介绍几种在C#/Net中非常有用的一些编程技巧. 1 空操作符(??) 在程序中经常会遇到对字符串或是对象判断n ...

  2. C#异步,多线程下的HttpContext丢失问题

    1.思路概述 首先让我把大概的一个思路先说一遍吧. 我在一个页面中要同时调用两个接口,而我要给这些接口一些参数:就是我通过HttpContext.Current.Request.QueryString ...

  3. gRPC 的 RoadMap 20151022 更新

    gRPC是一个高性能.通用的开源RPC框架,其由Google主要面向移动应用开发并基于HTTP/2协议标准而设计,基于ProtoBuf(Protocol Buffers)序列化协议开发,且支持众多开发 ...

  4. 微信开发e.target.dataset取值undefined

    替换为: e.currentTarget.dataset.current

  5. Android下用程序的方法为ListView设置分割线Divider样式

    使用XML的时候可以使用android:divider属性为ListView设置分割线的样式(颜色或者资源文件),而在Java代码中默认提供的方法 listView.setDivider() 却只支持 ...

  6. Apache安装完后加入系统服务的相关操作详解

    Apache源码安装完毕后, 1.下面的脚本运行后就可以直接使用service apachexxx stop/start 来控制apache的启动与停止了! cp /usr/local/apache/ ...

  7. 新浪微博开放平台账号申请(基于dcloud开发)

    注意事项: 1.新浪微博不仅需要appkey和appsecret,而且还需要回调的url,这个链接是可以随便写的,但是需要和在开放平台申请的一致. 2. Android签名包信息部分 (1.)首先安卓 ...

  8. K先生

    每天多一点点的努力,不为别的,只为了日后能够多一些选择,选择云卷云舒的小日子,选择自己说了算的生活,选择自己喜欢的人. 加油,记K先生之名!

  9. 如何去掉iview里面的input,button等一系列标签自带的蓝色边框

    只需要将这些标签加一个:focus{outline:0}即可解决这个问题

  10. html基础-表格-列表(4)

    今天准备为大家准备了表格和列表. 一.文章有各种数据的表格这个网页也不例外. (1).标签意思 <table>----------------------表格开始 <caption& ...