全面解析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打开图片另存为对话框实现代码
Dec 26 Javascript
window.requestAnimationFrame是什么意思,怎么用
Jan 13 Javascript
node.js中的fs.chown方法使用说明
Dec 16 Javascript
原生js实现淘宝购物车功能
Jun 23 Javascript
巧用canvas
Jan 21 Javascript
浅谈JavaScript find 方法不支持IE的问题
Sep 28 Javascript
vue在手机中通过本机IP地址访问webApp的方法
Aug 15 Javascript
jQuery实现为动态添加的元素绑定事件实例分析
Sep 07 jQuery
Javascript操作select控件代码实例
Feb 14 Javascript
JavaScript中的this妙用实例分析
May 09 Javascript
Jquery使用each函数实现遍历及数组处理
Jul 14 jQuery
JavaScript JSON使用原理及注意事项
Jul 30 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
php通过ajax实现双击table修改内容
2014/04/28 PHP
thinkphp框架实现数据添加和显示功能
2016/06/29 PHP
老生常谈php 正则中的i,m,s,x,e分别表示什么
2017/03/02 PHP
PHP实现的简单操作SQLite数据库类与用法示例
2017/06/19 PHP
php mysql PDO 查询操作的实例详解
2017/09/23 PHP
(JS实现)MapBar中坐标的加密和解密的脚本
2007/05/16 Javascript
javascript中的delete使用详解
2013/04/11 Javascript
当鼠标移动到图片上时跟随鼠标显示放大的图片效果
2013/06/06 Javascript
Javascript MVC框架Backbone.js详解
2014/09/18 Javascript
animate 实现滑动切换效果【实例代码】
2016/05/05 Javascript
jquery实现文本框的禁用和启用
2016/12/07 Javascript
livereload工具实现前端可视化开发【推荐】
2016/12/23 Javascript
Nodejs搭建wss服务器教程
2017/05/24 NodeJs
BootStrap Table 后台数据绑定、特殊列处理、排序功能
2017/05/27 Javascript
使用JavaScript根据图片获取条形码的方法
2017/07/04 Javascript
react.js 父子组件数据绑定实时通讯的示例代码
2017/09/25 Javascript
详解webpack+express多页站点开发
2017/12/22 Javascript
深入探讨JavaScript的最基本部分之执行上下文
2019/02/12 Javascript
JavaScript如何实现元素全排列实例代码
2019/05/14 Javascript
vue 通过base64实现图片下载功能
2020/12/19 Vue.js
python使用xpath中遇到:到底是什么?
2018/01/04 Python
教你利用Python玩转histogram直方图的五种方法
2018/07/30 Python
Python判断一个list中是否包含另一个list全部元素的方法分析
2018/12/24 Python
Python中遍历列表的方法总结
2019/06/27 Python
Python Numpy 自然数填充数组的实现
2019/11/28 Python
python音频处理的示例详解
2020/12/23 Python
FORZIERI澳大利亚站:全球顶级奢华配饰精品店
2016/12/31 全球购物
师生聚会感言
2014/01/26 职场文书
面试后感谢信怎么写
2014/02/01 职场文书
旅游市场营销方案
2014/03/09 职场文书
手术室护士长竞聘书
2014/03/31 职场文书
实习指导老师评语
2014/04/26 职场文书
工厂见习报告范文
2014/10/31 职场文书
综合素质评价自我评价
2015/03/06 职场文书
高中班主任工作总结(范文)
2019/08/20 职场文书
VUE中的v-if与v-show区别介绍
2022/03/13 Vue.js