浅谈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 相关文章推荐
Extjs中常用表单介绍与应用
Jun 07 Javascript
用Jquery重写windows.alert方法实现思路
Apr 03 Javascript
jquery中常用的函数和属性详细解析
Mar 07 Javascript
JavaScript动态创建link标签到head里的方法
Dec 22 Javascript
js中对函数设置默认参数值的3种方法
Oct 23 Javascript
jQuery增加、删除及修改select option的方法
Aug 19 Javascript
AngularJs IE Compatibility 兼容老版本IE
Sep 01 Javascript
基于$.ajax()方法从服务器获取json数据的几种方式总结
Jan 31 Javascript
vue项目中axios使用详解
Feb 07 Javascript
vue的style绑定background-image的方式和其他变量数据的区别详解
Sep 03 Javascript
微信小程序实现签字功能
Dec 23 Javascript
微信小程序vant弹窗组件的实现方式
Feb 21 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怎样调用MSSQL的存储过程
2006/10/09 PHP
E路文章系统PHP
2006/12/11 PHP
用PHP控制用户的浏览器--ob*函数的使用说明
2007/03/16 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十二)
2014/06/25 PHP
调用WordPress函数统计文章访问量及PHP原生计数器的实现
2016/03/21 PHP
浅谈PHP中关于foreach使用引用变量的坑
2016/11/14 PHP
PHP正则验证字符串是否为数字的两种方法并附常用正则
2019/02/27 PHP
PHP中的self关键字详解
2019/06/23 PHP
简单通用的JS滑动门代码
2008/12/19 Javascript
js动态创建标签示例代码
2014/06/09 Javascript
图片放大镜jquery.jqzoom.js使用实例附放大镜图标
2014/06/19 Javascript
JavaScript仿静态分页实现方法
2015/08/04 Javascript
jQuery判断浏览器并动态调整select宽度的方法
2016/03/02 Javascript
AngularJs表单验证实例详解
2016/05/30 Javascript
AngularJS入门教程之路由与多视图详解
2016/08/19 Javascript
AngularJs基于角色的前端访问控制的实现
2016/11/07 Javascript
jQuery实现手机上输入后隐藏键盘功能
2017/01/04 Javascript
Bootstrap框架安装使用详解
2017/01/21 Javascript
Vue2.5通过json文件读取数据的方法
2018/02/27 Javascript
微信小程序日历/日期选择插件使用方法详解
2018/12/28 Javascript
vue-cli点击实现全屏功能
2020/03/07 Javascript
js实现右键弹出自定义菜单
2020/09/08 Javascript
python机器学习之神经网络(一)
2017/12/20 Python
python实现数据库跨服务器迁移
2018/04/12 Python
python中的常量和变量代码详解
2018/07/25 Python
css3气泡 css3关键帧动画创建的动态通知气泡
2013/02/26 HTML / CSS
乌克兰网上服装店:Bolf.ua
2018/10/30 全球购物
美国最大婚纱连锁店运营商:David’s Bridal
2019/03/12 全球购物
Capitol Lighting的1800lighting.com:住宅和商业照明
2019/04/10 全球购物
如何减少垃圾回收让内存更加有效使用
2013/10/18 面试题
物流经理自我评价
2013/09/23 职场文书
新闻编辑自荐信
2013/11/03 职场文书
送餐员岗位职责范本
2014/02/21 职场文书
医疗纠纷协议书
2014/04/16 职场文书
专题组织生活会方案
2014/06/15 职场文书
大学生见习报告范文
2014/11/03 职场文书