全面解析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 相关文章推荐
js 剪切板应用clipboardData详细解析
Dec 17 Javascript
Jquery组件easyUi实现表单验证示例
Aug 23 Javascript
Bootstrap源码解读下拉菜单(4)
Dec 23 Javascript
详解Vue-基本标签和自定义控件
Mar 24 Javascript
javascript 中null和undefined区分和比较
Apr 19 Javascript
关于jQuery里prev()的简单操作代码
Oct 27 jQuery
原生js实现拖拽功能基本思路详解
Apr 18 Javascript
vue微信分享出来的链接点开是首页问题的解决方法
Nov 28 Javascript
vue工程全局设置ajax的等待动效的方法
Feb 22 Javascript
微信小程序环境下将文件上传到OSS的方法步骤
May 31 Javascript
如何对react hooks进行单元测试的方法
Aug 14 Javascript
webpack4 optimization使用总结
Nov 10 Javascript
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
Zend Framework基于Command命令行建立ZF项目的方法
2017/02/18 PHP
IE无法设置短域名下Cookie
2010/09/23 Javascript
JQuery入门——用映射方式绑定不同事件应用示例
2013/02/05 Javascript
js HTML5多图片上传及预览实例解析(不含前端的文件分割)
2016/08/26 Javascript
js中数组的常用方法小结
2016/12/30 Javascript
微信小程序组件 contact-button(客服会话按钮)详解及实例代码
2017/01/10 Javascript
原生js实现回复评论功能
2017/01/18 Javascript
springMVC + easyui + $.ajaxFileUpload实现文件上传注意事项
2017/04/23 Javascript
详解angularJS自定义指令间的相互交互
2017/07/05 Javascript
js实现rem自动匹配计算font-size的示例
2017/11/18 Javascript
JsChart组件使用详解
2018/03/04 Javascript
浅谈让你的代码更简短,更整洁,更易读的ES6小技巧
2018/10/25 Javascript
Javascript中绑定click事件的四种方式介绍
2018/10/26 Javascript
微信小程序判断用户是否需要再次授权获取个人信息
2019/07/18 Javascript
使用vue打包进行云服务器上传的问题
2020/03/02 Javascript
[51:17]Mski vs VGJ.S Supermajor小组赛C组 BO3 第三场 6.3
2018/06/04 DOTA
使用graphics.py实现2048小游戏
2015/03/10 Python
自己编程中遇到的Python错误和解决方法汇总整理
2015/06/03 Python
Python字符串拼接、截取及替换方法总结分析
2016/04/13 Python
Python语言描述KNN算法与Kd树
2017/12/13 Python
Python实现的当前时间多加一天、一小时、一分钟操作示例
2018/05/21 Python
Python3常用内置方法代码实例
2019/11/18 Python
python进程池实现的多进程文件夹copy器完整示例
2019/11/27 Python
Python批量启动多线程代码实例
2020/02/18 Python
python numpy库np.percentile用法说明
2020/06/08 Python
利用Python优雅的登录校园网
2020/10/21 Python
Django数据统计功能count()的使用
2020/11/30 Python
python基于openpyxl生成excel文件
2020/12/23 Python
用CSS3实现无限循环的无缝滚动的示例代码
2017/11/01 HTML / CSS
基于HTML5 的人脸识别活体认证的实现方法
2016/06/22 HTML / CSS
adidas旗下高尔夫装备供应商:TaylorMade Golf(泰勒梅高尔夫)
2016/08/28 全球购物
德国亚马逊官方网站:Amazon.de
2020/11/15 全球购物
护士自我评价
2014/02/01 职场文书
创业女性典型材料
2014/05/02 职场文书
公司备用金管理制度
2015/08/04 职场文书
从np.random.normal()到正态分布的拟合操作
2021/06/02 Python