全面解析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 相关文章推荐
cssQuery()的下载与使用方法
Jan 12 Javascript
用javascript实现页面打印的三种方法
Mar 05 Javascript
jQuery的实现原理的模拟代码 -4 重要的扩展函数 extend
Aug 03 Javascript
Javascript中arguments对象详解
Oct 22 Javascript
jquery使用slideDown实现模块缓慢拉出效果的方法
Mar 27 Javascript
JavaScript控制网页平滑滚动到指定元素位置的方法
Apr 17 Javascript
jQuery实现带幻灯的tab滑动切换风格菜单代码
Aug 27 Javascript
javascript输出AscII码扩展集中的字符方法
Dec 26 Javascript
react.js CMS 删除功能的实现方法
Apr 17 Javascript
Vue中父组件向子组件通信的方法
Jul 11 Javascript
angular4强制刷新视图的方法
Oct 09 Javascript
jquery实现进度条状态展示
Mar 26 jQuery
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程序的国际化实现方法(利用gettext)
2011/08/14 PHP
php 操作调试的方法
2012/07/12 PHP
Linux环境下搭建php开发环境的操作步骤
2013/06/17 PHP
php curl中gzip的压缩性能测试实例分析
2016/11/08 PHP
thinkphp关于简单的权限判定方法
2017/04/03 PHP
PHP的PDO预处理语句与存储过程
2019/01/27 PHP
Add a Table to a Word Document
2007/06/15 Javascript
查找Oracle高消耗语句的方法
2014/03/22 Javascript
js文件包含的几种方式介绍
2014/09/28 Javascript
JS实现的数组全排列输出算法
2015/03/19 Javascript
jQuery复制表单元素附源码分享效果演示
2015/09/30 Javascript
微信小程序实战篇之购物车的实现代码示例
2017/11/30 Javascript
vue 使用eventBus实现同级组件的通讯
2018/03/02 Javascript
Bootstrap table中toolbar新增条件查询及refresh参数使用方法
2018/05/18 Javascript
微信运维交互机器人的示例代码
2018/11/12 Javascript
[01:12:27]EG vs Secret 2018国际邀请赛淘汰赛BO3 第二场 8.22
2018/08/23 DOTA
python二叉树遍历的实现方法
2013/11/21 Python
Python 生成 -1~1 之间的随机数矩阵方法
2018/08/04 Python
对python多线程中互斥锁Threading.Lock的简单应用详解
2019/01/11 Python
从python读取sql的实例方法
2020/07/21 Python
Python rabbitMQ如何实现生产消费者模式
2020/08/24 Python
python 基于pygame实现俄罗斯方块
2021/03/02 Python
HTML5 FormData 方法介绍以及实现文件上传示例
2017/09/12 HTML / CSS
上海某公司.net方向笔试题
2014/09/14 面试题
应届行政管理专业个人自我评价
2013/12/28 职场文书
农业开发项目建议书
2014/05/16 职场文书
质量承诺书格式
2014/05/20 职场文书
人力资源职位说明书
2014/07/29 职场文书
学习实践科学发展观心得体会
2014/09/10 职场文书
判缓刑人员个人思想汇报
2014/10/10 职场文书
大学毕业生自我评价
2015/03/02 职场文书
预备党员表决心的话
2015/09/22 职场文书
Mysql关于数据库是否应该使用外键约束详解说明
2021/10/24 MySQL
PostgreSQL 插入INSERT、删除DELETE、更新UPDATE、事务transaction
2022/04/12 PostgreSQL
Java设计模式中的命令模式
2022/04/28 Java/Android
MySQL数据库实验之 触发器和存储过程
2022/06/21 MySQL