全面解析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 相关文章推荐
优化 JavaScript 代码的方法小结
Jul 16 Javascript
javascript中的parseInt和parseFloat区别
Jul 12 Javascript
Javascript中数组方法汇总(推荐)
Apr 01 Javascript
JavaScript将字符串转换为整数的方法
Apr 14 Javascript
javascript实现table选中的行以指定颜色高亮显示的方法
May 13 Javascript
javascript使用输出语句实现网页特效代码
Aug 06 Javascript
JavaScript对象数组排序函数及六个用法
Dec 23 Javascript
jQuery实现圣诞节礼物动画案例解析
Dec 25 Javascript
Angular.js中数组操作的方法教程
Jul 31 Javascript
node使用Mongoose类库实现简单的增删改查
Nov 08 Javascript
解决vue动态路由异步加载import组件,加载不到module的问题
Jul 26 Javascript
详解如何在vue+element-ui的项目中封装dialog组件
Dec 11 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
分享下PHP register_globals 值为on与off的理解
2013/09/26 PHP
ThinkPHP 3.2.3实现页面静态化功能的方法详解
2017/08/03 PHP
优化网页之快速的呈现我们的网页
2007/06/29 Javascript
预加载css或javascript的js代码
2010/04/23 Javascript
详谈 Jquery Ajax异步处理Json数据.
2011/09/09 Javascript
判断javascript的数据类型(示例代码)
2013/12/11 Javascript
nodejs实现HTTPS发起POST请求
2015/04/23 NodeJs
快速学习AngularJs HTTP响应拦截器
2015/12/31 Javascript
jQuery模拟物体自由落体运动(附演示与demo源码下载)
2016/01/21 Javascript
学习使用AngularJS文件上传控件
2016/02/16 Javascript
JavaScript快速切换繁体中文和简体中文的方法及网站支持简繁体切换的绝招
2016/03/07 Javascript
JavaScript获取当前url根目录(路径)
2016/06/17 Javascript
JS 日期与时间戮相互转化的简单实例
2016/06/22 Javascript
JS控制页面跳转时未请求要跳转的地址怎么回事
2016/10/14 Javascript
AngularJS出现$http异步后台无法获取请求参数问题的解决方法
2016/11/03 Javascript
js实现省市级联效果分享
2017/08/10 Javascript
canvas基础绘制-绚丽倒计时的实例
2017/09/17 Javascript
微信小程序中setInterval的使用方法
2017/09/29 Javascript
jquery实现简易验证插件封装
2020/09/13 jQuery
手机浏览器唤起微信分享(JS)
2020/10/11 Javascript
Python中type的构造函数参数含义说明
2015/06/21 Python
python select.select模块通信全过程解析
2017/09/20 Python
用python制作游戏外挂
2018/01/04 Python
Python多重继承的方法解析执行顺序实例分析
2018/05/26 Python
世界上最好的足球商店:Unisport
2019/03/02 全球购物
优秀技术工人先进材料
2014/02/17 职场文书
税务会计岗位职责
2014/02/18 职场文书
政府信息公开实施方案
2014/05/09 职场文书
2014法院四风问题对照检查材料思想汇报
2014/10/04 职场文书
2014年工程师工作总结
2014/11/25 职场文书
开除通知书范本
2015/04/25 职场文书
2015国庆66周年宣传语
2015/07/14 职场文书
JavaScript如何优化逻辑判断代码详解
2021/06/08 Javascript
MySQL面试题讲解之如何设置Hash索引
2021/11/01 MySQL
解决linux下redis数据库overcommit_memory问题
2022/02/24 Redis
Python线程池与GIL全局锁实现抽奖小案例
2022/04/13 Python