浅谈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 相关文章推荐
jq实现酷炫的鼠标经过图片翻滚效果
Mar 12 Javascript
javascript获取浏览器类型和版本的方法(js获取浏览器版本)
Mar 13 Javascript
javasctipt如何显示几分钟前、几天前等
Apr 30 Javascript
浅谈jquery设置和获得checkbox选中的问题
Aug 19 Javascript
AngularJS通过ng-route实现基本的路由功能实例详解
Dec 13 Javascript
jQuery实现弹出窗口弹出div层的实例代码
Jan 09 Javascript
基于JavaScript实现瀑布流效果
Mar 29 Javascript
Bootstrap datepicker日期选择器插件使用详解
Jul 26 Javascript
vue2.x集成百度UEditor富文本编辑器的方法
Sep 21 Javascript
javascript判断一个变量是数组还是对象
Apr 10 Javascript
微信小程序云开发之新手环境配置
May 16 Javascript
在JavaScript中使用严格模式(Strict Mode)
Jun 13 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 空格,换行,跳格使用说明
2009/12/18 PHP
PHP中遇到BOM、编码导致json_decode函数无法解析问题
2014/07/02 PHP
PHP函数extension_loaded()用法实例
2015/01/19 PHP
alixixi runcode.asp的代码不错的应用
2007/08/08 Javascript
JQuery 学习笔记 选择器之六
2009/07/23 Javascript
js实现表格字段排序
2014/02/19 Javascript
JQuery实现table行折叠效果以JSON做数据源
2014/05/26 Javascript
jQuery选择器之基本选择器与层次选择器
2015/03/03 Javascript
express文件上传中间件Multer详解
2016/10/24 Javascript
jQuery Ajax请求后台数据并在前台接收
2016/12/10 Javascript
详解jQuery简单的表单应用
2016/12/16 Javascript
requirejs按需加载angularjs文件实例
2017/06/08 Javascript
Vue.js进行查询操作的实例详解
2017/08/25 Javascript
JS禁止浏览器右键查看元素或按F12审查元素自动关闭页面示例代码
2017/09/07 Javascript
Mac中安装nvm的教程分享
2017/12/11 Javascript
vue源码入口文件分析(推荐)
2018/01/30 Javascript
AngularJS 将再发布一个重要版本 然后进入长期支持阶段
2018/01/31 Javascript
详解Node使用Puppeteer完成一次复杂的爬虫
2018/04/18 Javascript
jquery拖拽自动排序插件使用方法详解
2020/07/20 jQuery
150行代码带你实现微信小程序中的数据侦听
2019/05/17 Javascript
基于JavaScript或jQuery实现网站夜间/高亮模式
2020/05/30 jQuery
Vue包大小优化的实现(从1.72M到94K)
2021/02/18 Vue.js
[01:14:10]2014 DOTA2国际邀请赛中国区预选赛 SPD-GAMING VS Orenda
2014/05/22 DOTA
python去除所有html标签的方法
2015/05/05 Python
详解python中的线程
2018/02/10 Python
python爬虫框架scrapy实现模拟登录操作示例
2018/08/02 Python
[原创]Python入门教程2. 字符串基本操作【运算、格式化输出、常用函数】
2018/10/29 Python
基于腾讯云服务器部署微信小程序后台服务(Python+Django)
2019/05/08 Python
Tensorflow实现部分参数梯度更新操作
2020/01/23 Python
Django-Scrapy生成后端json接口的方法示例
2020/10/06 Python
Melissa香港官网:MDreams
2016/07/01 全球购物
Jogun Shop中文官网:韩国知名时尚男装网站
2016/10/12 全球购物
美国正版电视节目和电影在线观看:Hulu
2018/05/24 全球购物
食堂标语大全
2014/06/11 职场文书
综合素质评价思想道德自我评价
2015/03/09 职场文书
python 实现定时任务的四种方式
2021/04/01 Python