浅谈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 相关文章推荐
jcrop基本参数一览
Jul 16 Javascript
js进行表单验证实例分析
Feb 10 Javascript
jQuery的animate函数实现图文切换动画效果
May 03 Javascript
jquery判断复选框是否被选中的方法
Oct 16 Javascript
jQuery图片左右滚动代码 有左右按钮实例
Jun 20 Javascript
JavaScript页面实时显示当前时间实例代码
Oct 23 Javascript
AngularJS中的拦截器实例详解
Apr 07 Javascript
React中ES5与ES6写法的区别总结
Apr 21 Javascript
Bootstrap弹出框(Popover)被挤压的问题小结
Jul 11 Javascript
js基于FileSaver.js 浏览器导出Excel文件的示例
Aug 15 Javascript
Vue.js 2.x之组件的定义和注册图文详解
Jun 19 Javascript
封装Vue Element的table表格组件的示例详解
Aug 19 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写入WRITE编码为UTF8的文件的实现代码
2008/07/07 PHP
PHP fgetcsv 定义和用法(附windows与linux下兼容问题)
2012/05/29 PHP
smarty高级特性之对象的使用方法
2015/12/25 PHP
JavaScript 检测浏览器和操作系统的脚本
2008/12/26 Javascript
javascript 隔行换色函数代码
2010/10/24 Javascript
NodeJs中的非阻塞方法介绍
2012/06/05 NodeJs
js创建子窗口并且回传值示例代码
2013/07/02 Javascript
JS判断表单输入是否为空(示例代码)
2013/12/23 Javascript
JavaScript四种调用模式和this示例介绍
2014/01/02 Javascript
原生JavaScript实现异步多文件上传
2015/12/02 Javascript
JS实用技巧小结(屏蔽错误、div滚动条设置、背景图片位置等)
2016/06/16 Javascript
vue.js将unix时间戳转换为自定义时间格式
2017/01/03 Javascript
Javascript实现信息滚动效果
2017/05/18 Javascript
Angular.js实现动态加载组件详解
2017/05/28 Javascript
详解Vue学习笔记进阶篇之列表过渡及其他
2017/07/17 Javascript
在Swiper内如何制作CSS3动画效果示例代码
2017/12/07 Javascript
详解react-native WebView 返回处理(非回调方法可解决)
2018/02/27 Javascript
vue页面离开后执行函数的实例
2018/03/13 Javascript
vue 标签属性数据绑定和拼接的实现方法
2018/05/17 Javascript
Node快速切换版本、版本回退(降级)、版本更新(升级)
2021/01/07 Javascript
Python实现文件按照日期命名的方法
2015/07/09 Python
Python自动登录126邮箱的方法
2015/07/10 Python
详解Python中的__getitem__方法与slice对象的切片操作
2016/06/27 Python
树莓派实现移动拍照
2019/06/22 Python
浅谈Python中os模块及shutil模块的常规操作
2020/04/03 Python
Python利用Faiss库实现ANN近邻搜索的方法详解
2020/08/03 Python
python 实现压缩和解压缩的示例
2020/09/22 Python
vue项目实现分页效果
2021/03/24 Vue.js
最新茶叶店创业计划书
2014/01/14 职场文书
音乐专业自荐信
2014/02/07 职场文书
装修活动策划方案
2014/08/27 职场文书
县委常委班子对照检查材料思想汇报
2014/09/28 职场文书
乡镇计划生育工作汇报
2014/10/28 职场文书
合同权益转让协议书模板
2014/11/18 职场文书
无违反计划生育证明格式
2015/06/24 职场文书
PostgreSQL数据库去除重复数据和运算符的基本查询操作
2022/04/12 PostgreSQL