浅谈bootstrap源码分析之scrollspy(滚动侦听)


Posted in Javascript onJune 06, 2016

源码文件:

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:清除所有高亮菜单

以上这篇浅谈bootstrap源码分析之scrollspy(滚动侦听)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JQUERY 浏览器判断实现函数
Aug 20 Javascript
JS无限树状列表实现代码
Jan 11 Javascript
编写可维护面向对象的JavaScript代码[翻译]
Feb 12 Javascript
重载toString实现JS HashMap分析
Mar 13 Javascript
从jquery的过滤器.filter()方法想到的
Sep 29 Javascript
jQuery实现悬浮在右上角的网页客服效果代码
Oct 24 Javascript
JavaScript如何动态创建table表格
Aug 02 Javascript
JS实现css hover操作的方法示例
Apr 07 Javascript
Vue.js实现图片的随意拖动方法
Mar 08 Javascript
详解create-react-app 2.0版本如何启用装饰器语法
Oct 23 Javascript
three.js搭建室内场景教程
Dec 30 Javascript
Vue render函数实战之实现tabs选项卡组件
Apr 22 Javascript
jquery插件方式实现table查询功能的简单实例
Jun 06 #Javascript
全面解析Bootstrap中tab(选项卡)的使用方法
Jun 06 #Javascript
全面解析Bootstrap中scrollspy(滚动监听)的使用方法
Jun 06 #Javascript
JavaScript 数组中最大最小值
Jun 05 #Javascript
使用three.js 画渐变的直线
Jun 05 #Javascript
jquery判断input值不为空的方法
Jun 05 #Javascript
jQuery四种选择器使用及示例
Jun 05 #Javascript
You might like
修改php.ini实现Mysql导入数据库文件最大限制的修改方法
2007/12/11 PHP
PHPstorm快捷键(分享)
2017/07/17 PHP
jQuery 学习第六课 实现一个Ajax的TreeView
2010/05/17 Javascript
理解Javascript_13_执行模型详解
2010/10/20 Javascript
基于jQuery的仿flash的广告轮播代码
2010/11/04 Javascript
关于用Jquery的height()、width()计算动态插入的IMG标签的宽高的问题
2010/12/08 Javascript
IE6、IE7中获取Button元素的值的bug说明
2011/08/28 Javascript
自己动手制作jquery插件之自动添加删除行功能介绍
2011/10/14 Javascript
非html5实现js版弹球游戏示例代码
2013/09/22 Javascript
利用Keydown事件阻止用户输入实现代码
2014/03/11 Javascript
JS对象与json字符串格式转换实例
2014/10/28 Javascript
解决jquery实现的radio重新选中的问题
2015/07/03 Javascript
JavaScript实现两个select下拉框选项左移右移
2017/03/09 Javascript
Vue.js 2.0 移动端拍照压缩图片预览及上传实例
2017/04/27 Javascript
二维码图片生成器QRCode.js简单介绍
2017/08/18 Javascript
总结js函数相关知识点
2018/02/27 Javascript
浅谈如何使用webpack构建多页面应用
2018/05/30 Javascript
使用vue-router beforEach实现判断用户登录跳转路由筛选功能
2018/06/25 Javascript
浅谈微信小程序之官方UI框架we-ui使用教程
2018/08/20 Javascript
JavaScript封装的常用工具类库bee.js用法详解【经典类库】
2018/09/03 Javascript
apicloud拉起小程序并传递参数的方法示例
2018/11/21 Javascript
微信小程序顶部导航栏可滑动并选中放大
2019/12/05 Javascript
python使用BeautifulSoup分页网页中超链接的方法
2015/04/04 Python
Python实现的Google IP 可用性检测脚本
2015/04/23 Python
python使用opencv进行人脸识别
2017/04/07 Python
python 反编译exe文件为py文件的实例代码
2019/06/27 Python
Python搭建代理IP池实现检测IP的方法
2019/10/27 Python
Python如何基于Tesseract实现识别文字功能
2020/06/05 Python
求职意向书
2014/04/01 职场文书
2015年元旦活动总结
2014/05/09 职场文书
食品质量与安全专业毕业生求职信
2014/08/11 职场文书
医生爱岗敬业演讲稿
2014/08/26 职场文书
2014年劳动部工作总结
2014/12/11 职场文书
《好妈妈胜过好老师》:每个孩子的优秀都是有源头的
2020/01/03 职场文书
浅谈Nginx 中的两种限流方式
2021/03/31 Servers
Matlab求解数组中的最大值及它所在的具体位置
2021/04/16 Python