浅谈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 相关文章推荐
Prototype最新版(1.5 rc2)使用指南(1)
Jan 10 Javascript
很全的显示阴历(农历)日期的js代码
Jan 01 Javascript
jQuery 使用手册(二)
Sep 23 Javascript
让innerText在firefox火狐和IE浏览器都能用的写法
May 14 Javascript
javaScript arguments 对象使用介绍
Oct 18 Javascript
深入学习JavaScript中的Rest参数和参数默认值
Jul 28 Javascript
理解和运用JavaScript的闭包机制
Aug 13 Javascript
input 标签实现输入框带提示文字效果(两种方法)
Oct 09 Javascript
jQuery实现菜单的显示和隐藏功能示例
Jul 24 jQuery
你应该了解的JavaScript Array.map()五种用途小结
Nov 14 Javascript
微信小程序中遇到的iOS兼容性问题小结
Nov 14 Javascript
vue打包npm run build时候界面报错的解决
Aug 13 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
动态样式类封装JS代码
2009/09/02 Javascript
基于jquery的合并table相同单元格的插件(精简版)
2011/04/05 Javascript
11个用于提高排版水平的基于jquery的文字效果插件
2012/09/14 Javascript
jQery使网页在显示器上居中显示适用于任何分辨率
2014/06/09 Javascript
javascript关于继承的用法汇总
2014/12/20 Javascript
jquery实现鼠标滑过小图时显示大图的方法
2015/01/14 Javascript
JavaScript 变量、作用域及内存
2015/04/08 Javascript
深入理解javascript中concat方法
2016/12/12 Javascript
AngularJS上传文件的示例代码
2018/11/10 Javascript
axios实现文件上传并获取进度
2020/03/25 Javascript
jQuery冲突问题解决方法
2021/01/19 jQuery
[02:25]DOTA2英雄基础教程 虚空假面
2014/01/02 DOTA
[01:26]神话结束了,却也刚刚开始——DOTA2新英雄玛尔斯驾临战场
2019/03/10 DOTA
Python MD5文件生成码
2009/01/12 Python
尝试使用Python多线程抓取代理服务器IP地址的示例
2015/11/09 Python
Python使用BeautifulSoup库解析HTML基本使用教程
2016/03/31 Python
python如何定义带参数的装饰器
2018/03/20 Python
Python Unittest根据不同测试环境跳过用例的方法
2018/12/16 Python
python实现excel公式格式化的示例代码
2020/12/23 Python
matplotlib交互式数据光标mpldatacursor的实现
2021/02/03 Python
简单介绍HTML5中的文件导入
2015/05/08 HTML / CSS
HTML5中原生的右键菜单创建方法
2016/06/28 HTML / CSS
优秀求职信范文分享
2013/12/19 职场文书
教师演讲稿范文
2014/01/08 职场文书
医校毕业生自我鉴定
2014/01/25 职场文书
写给女朋友的检讨书
2014/01/28 职场文书
经贸韩语专业大学生职业规划
2014/02/14 职场文书
干部考核评语
2014/04/29 职场文书
单位工作证明范文
2014/09/14 职场文书
2015年护士医德医风自我评价
2015/03/03 职场文书
物流业务员岗位职责
2015/04/03 职场文书
运动会5000米加油稿
2015/07/21 职场文书
生活小常识广播稿
2015/08/19 职场文书
美德少年事迹材料(2016推荐版)
2016/02/25 职场文书
2016年助残日旅游活动总结
2016/04/01 职场文书
Win10开机修复磁盘错误怎么跳过?Win10关闭开机磁盘检查的方法
2022/09/23 数码科技