浅谈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 相关文章推荐
js日历功能对象
Jan 12 Javascript
web基于浏览器的本地存储方法应用
Nov 27 Javascript
基于jquery实现控制经纬度显示地图与卫星
May 20 Javascript
Javascript中this的用法详解
Sep 22 Javascript
基于jquery固定于顶部的导航响应浏览器滚动条事件
Nov 02 Javascript
javascript上下方向键控制表格行选中并高亮显示的方法
Feb 13 Javascript
JavaScript数据结构与算法之栈与队列
Jan 29 Javascript
vue2.0父子组件及非父子组件之间的通信方法
Jan 21 Javascript
基于vue的短信验证码倒计时demo
Sep 13 Javascript
JavaScript 判断对象中是否有某属性的常用方法
Jun 14 Javascript
jQuery.extend 与 jQuery.fn.extend的用法及区别实例分析
Jul 25 jQuery
微信小程序mpvue点击按钮获取button值的方法
May 29 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后台程序与Javascript的两种交互方式
2009/10/25 PHP
php遍历数组的4种方法总结
2014/07/05 PHP
Thinkphp和Bootstrap结合打造个性的分页样式(推荐)
2016/08/01 PHP
PHP解压ZIP文件到指定文件夹的方法
2016/11/17 PHP
PHP+AjaxForm异步带进度条上传文件实例代码
2017/08/14 PHP
Laravel实现ORM带条件搜索分页
2019/10/24 PHP
jQuery技巧总结
2011/01/01 Javascript
javascript制作的网页侧边弹出框思路及实现代码
2014/05/21 Javascript
jquery合并表格中相同文本的相邻单元格
2015/07/17 Javascript
基于JavaScript怎么实现让歌词滚动播放
2015/11/03 Javascript
php基于redis处理session的方法
2016/03/14 Javascript
Jquery ajax请求导出Excel表格的实现代码
2016/06/08 Javascript
js数组去重的hash方法
2016/12/22 Javascript
javascript 通过键名获取键盘的keyCode方法
2017/12/31 Javascript
Puppet的一些技巧
2018/09/17 Javascript
Vue slot用法(小结)
2018/10/22 Javascript
es6数值的扩展方法
2019/03/11 Javascript
微信小程序本地存储实现每日签到、连续签到功能
2019/10/09 Javascript
微信小程序 scroll-view 水平滚动实现过程解析
2019/10/12 Javascript
Vue axios 将传递的json数据转为form data的例子
2019/10/29 Javascript
bootstrap-paginator服务器端分页使用方法详解
2020/02/13 Javascript
微信小程序实现watch监听
2020/06/04 Javascript
Python自定义函数的创建、调用和函数的参数详解
2014/03/11 Python
python进阶教程之函数对象(函数也是对象)
2014/08/30 Python
Python OpenCV 直方图的计算与显示的方法示例
2018/02/08 Python
DRF跨域后端解决之django-cors-headers的使用
2019/01/27 Python
Python 抓取微信公众号账号信息的方法
2019/06/14 Python
Tensorflow全局设置可见GPU编号操作
2020/06/30 Python
Fossil德国官网:化石手表、手袋、珠宝及配件
2019/12/07 全球购物
奥地利票务门户网站:oeticket.com
2019/12/31 全球购物
创建文明学校实施方案
2014/03/11 职场文书
债务纠纷委托书
2014/08/30 职场文书
工作批评与自我批评范文
2014/10/16 职场文书
一般纳税人申请报告
2015/05/18 职场文书
2016年八一建军节活动总结
2016/04/05 职场文书
vue项目如何打包之项目打包优化(让打包的js文件变小)
2022/04/30 Vue.js