全面解析Bootstrap中scrollspy(滚动监听)的使用方法


Posted in Javascript onJune 06, 2016

bootstrap源码分析之scrollspy(滚动侦听)

源码文件:
Scrollspy.js

实现功能
1、当滚动区域内设置的hashkey距离顶点到有效位置时,就关联设置其导航上的指定项
2、导航必须是 .nav > li > a 结构,并且a上href或data-target要绑定hashkey
3、菜单上必须有.nav样式
4、滚动区域的data-target与导航父级Id(一定是父级)要一致

<div id="selector" class="navbar navbar-default">
 <ul class="nav navbar-nav">
 <li><a href="#one">one</a> </li>
 <li><a href="#two">two</a> </li>
 <li><a href="#three">three</a> </li>
 </ul>
</div>
<div data-spy="scroll" data-target="#selector" style="height:100px; overflow:hidden;overflow-y: auto;" >
 <h4 id="one" >ibe</h4><p>One的具体内容<br/>One的具体内容<br/>One的具体内容<br/>One的具体内容<br/>One的具体内容<br/>One的具体内容<br/></p>
 <h4 id="two" >two</h4><p>One的具体内容<br/>One的具体内容<br/>One的具体内容<br/>One的具体内容<br/>One的具体内容<br/>One的具体内容<br/></p>
 <h4 id="three" >three</h4><p>One的具体内容<br/>One的具体内容<br/>One的具体内容<br/>One的具体内容<br/>One的具体内容<br/>One的具体内容<br/></p>
</div>

源码分析:
1、原理:当滚动容器内的hashkey位置距离容器顶部只有 offset设置的值,就会设置导航中对应的href高亮
2、如果滚动区域是body,会将滚动区域元素标记为window(构造函数中判断)
this.$scrollElement = $(element).is(document.body) ? $(window) : $(element)
3、getScrolHeight:获取滚动容器的内容高度(包含被隐藏部分)
this.$scrollElement[0].scrollHeight || Math.max(this.$body[0].scrollHeight, document.documentElement.scrollHeight)
4、refresh:刷新并存储滚动容器内各hashkey的值
  4.1、默认用offset来获取定位值,如果滚动区域不是window则用position来获取

if (!$.isWindow(this.$scrollElement[0])) {
  offsetMethod = 'position'
  offsetBase = this.$scrollElement.scrollTop() //获取基础高度,如果滚动区域内有不参与滚动计算的内容
 }

  4.2、根据导航上的hashkey来遍历获取 滚动区域内的hashkey对应的offset值:

this.$body
 .find(this.selector)
 .map(function () {
 var $el = $(this)
 var href = $el.data('target') || $el.attr('href')
 var $href = /^#./.test(href) && $(href) //获取滚动区域内的hashkey对应的元素

 return ($href
 && $href.length
 && $href.is(':visible')
 && [[$href[offsetMethod]().top + offsetBase, href]]) || null
 })
 .sort(function (a, b) { return a[0] - b[0] })
 .each(function () {
 that.offsets.push(this[0])
 that.targets.push(this[1])
 })

5、process:滚动条事件触发函数,用于计算当前需要高亮那个导航菜单
   5.1、获取滚动容器已滚动距离:
var scrollTop    = this.$scrollElement.scrollTop() + this.options.offset
   5.2、滚动容器可以滚动的最大高度

//最大可以滚动高度=滚动设置距离(offset)+ 滚动容器内容高度 - 滚动容器设置的高度
var maxScroll = this.options.offset + scrollHeight - this.$scrollElement.height()

   5.3、设置滚动元素逻辑:

for (i = offsets.length; i--;) {//遍历所有的offset
 activeTarget != targets[i] //判断当前target是否等于activeTarget
 && scrollTop >= offsets[i] //滚动高度>i元素的offset
 && (offsets[i + 1] === undefined || scrollTop < offsets[i + 1]) //i + 1元素不存在,或者i+1元素不大于滚动高度
 && this.activate(targets[i]) //设置i为当前活动项
 }

6、active:设置指定的导航菜单高亮
7、clear:清除所有高亮菜单

如果大家还想深入学习,可以点击这里进行学习,再为大家附3个精彩的专题:

以上就是本文的全部内容,希望对大家学习javascript程序设计有所帮助。

Javascript 相关文章推荐
解决iframe的frameborder在chrome/ff/ie下的差异
Aug 12 Javascript
javascript 进阶篇1 正则表达式,cookie管理,userData
Mar 14 Javascript
Angular中的Promise对象($q介绍)
Mar 03 Javascript
jQuery实现图片轮播特效代码分享
Sep 15 Javascript
jQuery增加和删除表格项目及实现表格项目排序的方法
May 30 Javascript
微信小程序 window_x64环境搭建
Sep 30 Javascript
前端编码规范(3)JavaScript 开发规范
Jan 21 Javascript
解决JavaScript中0.1+0.2不等于0.3问题
Oct 23 Javascript
JavaScript实现选项卡效果的分析及步骤
Apr 16 Javascript
uniapp实现横向滚动选择日期
Oct 21 Javascript
如何管理Vue中的缓存页面
Feb 06 Vue.js
vue整合百度地图显示指定地点信息
Apr 06 Vue.js
JavaScript 数组中最大最小值
Jun 05 #Javascript
使用three.js 画渐变的直线
Jun 05 #Javascript
jquery判断input值不为空的方法
Jun 05 #Javascript
jQuery四种选择器使用及示例
Jun 05 #Javascript
JavaScript和jquery获取父级元素、子级元素、兄弟元素的方法
Jun 05 #Javascript
分享javascript实现的冒泡排序代码并优化
Jun 05 #Javascript
EasyUI布局 高度自适应
Jun 04 #Javascript
You might like
一个MYSQL操作类
2006/11/16 PHP
php ci框架中加载css和js文件失败的解决方法
2014/03/03 PHP
javascript实现文字图片上下滚动的具体实例
2013/06/28 Javascript
javascript 获取浏览器版本
2015/01/21 Javascript
为JS扩展Array.prototype.indexOf引发的问题及解决办法
2015/01/21 Javascript
jQuery实现Flash效果上下翻动的中英文导航菜单代码
2015/09/22 Javascript
jquery表格datatables实例解析 直接加载和延迟加载
2016/08/12 Javascript
JavaScript里 ==与===区别详解
2016/08/16 Javascript
详解XMLHttpRequest(二)响应属性、二进制数据、监测上传下载进度
2016/09/14 Javascript
使用Ajax生成的Excel文件并下载的实例
2016/11/21 Javascript
详解vue-router 2.0 常用基础知识点之router.push()
2017/05/10 Javascript
nodemon实现Typescript项目热更新的示例代码
2019/11/19 Javascript
ES6 proxy和reflect的使用方法与应用实例分析
2020/02/15 Javascript
[01:25]2014DOTA2国际邀请赛 zhou分析LGD比赛情况
2014/07/14 DOTA
python 将字符串转换成字典dict
2013/03/24 Python
Python标准库os.path包、glob包使用实例
2014/11/25 Python
Python代码块批量添加Tab缩进的方法
2018/06/25 Python
用Python解决x的n次方问题
2019/02/08 Python
详解python的argpare和click模块小结
2019/03/31 Python
教你如何编写、保存与运行Python程序的方法
2019/07/12 Python
使用tensorflow DataSet实现高效加载变长文本输入
2020/01/20 Python
python3 使用traceback定位异常实例
2020/03/09 Python
什么造成了Java里面的异常
2016/04/24 面试题
汽车销售求职自荐信
2013/10/01 职场文书
就业推荐表自我鉴定
2014/03/21 职场文书
公务员诚信承诺书
2014/05/26 职场文书
省级优秀毕业生主要事迹
2014/05/29 职场文书
2015年党员承诺书
2015/01/21 职场文书
护士实习自荐信
2015/03/06 职场文书
师范生教育见习总结
2015/06/23 职场文书
环保建议书作文300字
2015/09/14 职场文书
解决mysql模糊查询索引失效问题的几种方法
2021/06/18 MySQL
Golang 语言控制并发 Goroutine的方法
2021/06/30 Golang
Vue3.0中Ref与Reactive的区别示例详析
2021/07/07 Vue.js
python和C/C++混合编程之使用ctypes调用 C/C++的dll
2022/04/29 Python
Beekeeper Studio开源数据库管理工具比Navicat更炫酷
2022/06/21 数据库