浅谈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 相关文章推荐
JavaScript中的变量作用域介绍
Dec 31 Javascript
基于javascript实现漂亮的页面过渡动画效果附源码下载
Oct 26 Javascript
跟我学习javascript创建对象(类)的8种方法
Nov 20 Javascript
浅谈jQuery双事件多重加载的问题
Oct 05 Javascript
JS添加或修改控件的样式(Class)实现方法
Oct 15 Javascript
Bootstrap源码解读下拉菜单(4)
Dec 23 Javascript
BootStrap 图片样式、辅助类样式和CSS组件的实例详解
Jan 20 Javascript
基于JavaScript实现类名的添加与移除
Apr 23 Javascript
理解 javascript 中的函数表达式与函数声明
Jul 07 Javascript
浅谈原型对象的常用开发模式
Jul 22 Javascript
浅谈webpack4.x 入门(一篇足矣)
Sep 05 Javascript
原生js实现五子棋游戏
May 28 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 执行系统外部命令 system() exec() passthru()
2009/08/11 PHP
ini_set的用法介绍
2014/01/07 PHP
简单谈谈PHP vs Node.js
2015/07/17 PHP
[原创]php token使用与验证示例【测试可用】
2017/08/30 PHP
Yii2.0框架模型多表关联查询示例
2019/07/18 PHP
php设计模式之策略模式实例分析【星际争霸游戏案例】
2020/03/26 PHP
Laravel框架使用技巧之使用url()全局函数返回前一个页面的地址方法详解
2020/04/06 PHP
php模拟实现斗地主发牌
2020/04/22 PHP
php解析非标准json、非规范json的方式实例
2020/12/10 PHP
js 创建书签小工具之理论
2011/02/25 Javascript
从零学jquery之如何使用回调函数
2014/05/16 Javascript
JS根据key值获取URL中的参数值及把URL的参数转换成json对象
2015/08/26 Javascript
浅谈JavaScript中的分支结构
2016/07/01 Javascript
Javascript动画效果(1)
2016/10/11 Javascript
JavaScript中动态向表格添加数据
2017/01/24 Javascript
浅析JS中常用类型转换及运算符表达式
2017/07/23 Javascript
微信小程序swiper实现滑动放大缩小效果
2018/11/15 Javascript
[09:34]2018DOTA2国际邀请赛寻真——永不放弃的iG
2018/08/14 DOTA
Python MySQLdb模块连接操作mysql数据库实例
2015/04/08 Python
pytorch动态网络以及权重共享实例
2020/01/06 Python
python中delattr删除对象方法的代码分析
2020/12/15 Python
用CSS3绘制三角形的简单方法
2015/07/17 HTML / CSS
html5弹跳球示例代码
2013/07/23 HTML / CSS
Whistles官网:英国女装品牌
2020/08/14 全球购物
美国相机和电子产品零售商:Beach Camera
2020/11/26 全球购物
介绍一下OSI七层模型
2012/07/03 面试题
什么是属性访问器
2015/10/26 面试题
大学生学习党课思想汇报
2014/01/03 职场文书
高中自我评价范文
2014/01/27 职场文书
《蒲公英》教学反思
2014/02/28 职场文书
目标责任书范本
2014/04/16 职场文书
学校消防安全责任书
2014/07/23 职场文书
副校长个人对照检查材料思想汇报
2014/10/04 职场文书
企业内部管理控制:采购授权审批制度范本
2020/01/19 职场文书
小程序wx.getUserProfile接口的具体使用
2021/06/02 Javascript
Python中可变和不可变对象的深入讲解
2021/08/02 Python