全面解析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调用浏览器打印模块实现点击按钮触发自定义函数
Mar 21 Javascript
js调出上下文菜单的实例
Dec 17 Javascript
BootstrapTable与KnockoutJS相结合实现增删改查功能【一】
May 10 Javascript
JS实现的自定义显示加载等待图片插件(loading.gif)
Jun 17 Javascript
node.js版本管理工具n无效的原理和解决方法
Nov 24 Javascript
微信小程序 生命周期函数详解
May 24 Javascript
详解如何让Express支持async/await
Oct 09 Javascript
使用clipboard.js实现复制功能的示例代码
Oct 16 Javascript
微信小程序自动客服功能
Nov 02 Javascript
Vue2 模板template的四种写法总结
Feb 23 Javascript
详解Angularjs 自定义指令中的数据绑定
Jul 19 Javascript
快速解决Vue、element-ui的resetFields()方法重置表单无效的问题
Aug 12 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下通过file_get_contents的代理使用方法
2011/02/16 PHP
sphinx增量索引的一个问题
2011/06/14 PHP
php文件怎么打开 如何执行php文件
2011/12/21 PHP
php+html5使用FormData对象提交表单及上传图片的方法
2015/02/11 PHP
PHP面向对象之里氏替换原则简单示例
2018/04/08 PHP
Yii2框架redis基本应用示例
2018/07/13 PHP
addRule在firefox下的兼容写法
2006/11/30 Javascript
JS类定义原型方法的两种实现的区别评论很多
2007/09/12 Javascript
ImageZoom 图片放大镜效果(多功能扩展篇)
2010/04/14 Javascript
Javascript 多浏览器兼容总结(实战经验)
2013/10/30 Javascript
JavaScript设计模式经典之工厂模式
2016/02/24 Javascript
原生js实现可拖拽效果
2017/02/28 Javascript
详解用node.js实现简单的反向代理
2017/06/26 Javascript
javascript 中select框触发事件过程的分析
2017/08/01 Javascript
在 Angular中 使用 Lodash 的方法
2018/02/11 Javascript
深入浅析js原型链和vue构造函数
2018/10/25 Javascript
详解vue 2.6 中 slot 的新用法
2019/07/09 Javascript
javascript设计模式 ? 桥接模式原理与应用实例分析
2020/04/13 Javascript
JS实现购物车基本功能
2020/11/08 Javascript
Python实现将Excel转换成xml的方法示例
2018/08/25 Python
python 对key为时间的dict排序方法
2018/10/17 Python
详解python持久化文件读写
2019/04/06 Python
pandas中的series数据类型详解
2019/07/06 Python
Django实现跨域的2种方法
2019/07/31 Python
python中如何实现将数据分成训练集与测试集的方法
2019/09/13 Python
Python 文件数据读写的具体实现
2020/01/24 Python
Python字符串hashlib加密模块使用案例
2020/03/10 Python
什么是Python中的匿名函数
2020/06/02 Python
Python json格式化打印实现过程解析
2020/07/21 Python
python logging模块的使用
2020/09/07 Python
详解如何在css3打包后自动追加前缀插件:autoprefixer
2018/12/18 HTML / CSS
Love, Bonito国际官网:新加坡女装品牌
2021/03/13 全球购物
2014年重阳节老干部座谈会局领导发言稿
2014/09/25 职场文书
见习报告怎么写
2014/10/31 职场文书
2014年评职称工作总结
2014/11/20 职场文书
python开发制作好看的时钟效果
2022/05/02 Python