浅谈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应用于login页面的问题及解决
Oct 17 Javascript
javascript学习笔记(十六) 系统对话框(alert、confirm、prompt)
Jun 20 Javascript
javascript获取下拉列表框当中的文本值示例代码
Jul 31 Javascript
两种方法实现在HTML页面加载完毕后运行某个js
Jun 16 Javascript
Vue.js快速入门实例教程
Oct 15 Javascript
JQuery Dialog对话框 不能通过Esc关闭的原因分析及解决办法
Jan 18 Javascript
jQuery插件Validation表单验证详解
May 26 jQuery
浅谈vue父子组件怎么传值
Jul 21 Javascript
Node.js JSON模块用法实例分析
Jan 04 Javascript
微信小程序性能优化之checkSession的使用
Mar 06 Javascript
JS前端知识点总结之内置对象,日期对象和定时器相关操作
Jul 05 Javascript
js实现盒子拖拽动画效果
Aug 09 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
30个php操作redis常用方法代码例子
2014/07/05 PHP
php使用pdo连接并查询sql数据库的方法
2014/12/24 PHP
PHP中empty,isset,is_null用法和区别
2017/02/19 PHP
PHP实现随机数字、字母的验证码功能
2018/08/01 PHP
Prototype使用指南之selector.js说明
2008/10/26 Javascript
jQuery Deferred和Promise创建响应式应用程序详细介绍
2013/03/05 Javascript
jQuery获取浏览器中的分辨率实现代码
2013/04/23 Javascript
jQuery插件分享之分页插件jqPagination
2014/06/06 Javascript
JavaScript中解析JSON数据的三种方法
2015/07/03 Javascript
js实现文字垂直滚动和鼠标悬停效果
2015/12/31 Javascript
学习使用jquery iScroll.js移动端滚动条插件
2020/03/24 Javascript
纯JS代码实现一键分享功能
2016/04/20 Javascript
原生js实现中奖信息无间隙滚动效果
2017/01/18 Javascript
vue项目中公用footer组件底部位置的适配问题
2018/05/10 Javascript
JQuery扩展对象方法操作示例
2018/08/21 jQuery
Vue框架下引入ActiveX控件的问题解决
2019/03/25 Javascript
vue keep-alive列表页缓存 详情页返回上一页不刷新,定位到之前位置
2019/11/26 Javascript
JavaScript实现省市区三级联动
2020/02/13 Javascript
ES6 class类链式继承,实例化及react super(props)原理详解
2020/02/15 Javascript
原生js实现密码强度验证功能
2020/03/18 Javascript
Linux下用Python脚本监控目录变化代码分享
2015/05/21 Python
深入解析Python中的list列表及其切片和迭代操作
2016/03/13 Python
python读取excel表格生成erlang数据
2017/08/26 Python
解决pip install的时候报错timed out的问题
2018/06/12 Python
pytorch中tensor.expand()和tensor.expand_as()函数详解
2019/12/27 Python
使用pth文件添加Python环境变量方式
2020/05/26 Python
Python Sqlalchemy如何实现select for update
2020/10/12 Python
html5 自定义播放器核心代码
2013/12/20 HTML / CSS
迟到检讨书900字
2014/01/14 职场文书
报关报检委托书
2014/04/08 职场文书
医院领导班子四风对照检查材料
2014/09/27 职场文书
致青春观后感
2015/06/09 职场文书
我的法兰西岁月观后感
2015/06/09 职场文书
2016入党积极分子心得体会
2016/01/06 职场文书
2016年圣诞节活动总结范文
2016/04/01 职场文书
Python趣味挑战之教你用pygame画进度条
2021/05/31 Python