Bootstrap滚动监听(Scrollspy)插件详解


Posted in Javascript onApril 26, 2016

滚动监听(Scrollspy)插件,即自动更新导航插件,会根据滚动条的位置自动更新对应的导航目标。其基本的实现是随着您的滚动,基于滚动条的位置向导航栏添加 .active class。

如果您想要单独引用该插件的功能,那么您需要引用 scrollspy.js。或者,正如 Bootstrap 插件概览 一章中所提到,您可以引用 bootstrap.js 或压缩版的 bootstrap.min.js。

一、用法
您可以向顶部导航添加滚动监听行为:

1、通过 data 属性:向您想要监听的元素(通常是 body)添加 data-spy="scroll"。然后添加带有 Bootstrap .nav 组件的父元素的 ID 或 class 的属性 data-target。为了它能正常工作,您必须确保页面主体中有匹配您所要监听链接的 ID 的元素存在。

<body data-spy="scroll" data-target=".navbar-example">
 ...
 <div class="navbar-example">
  <ul class="nav nav-tabs">
   ...
  </ul>
 </div>
 ...
</body>

2、通过 JavaScript:您可以通过 JavaScript 调用滚动监听,选取要监听的元素,然后调用 .scrollspy() 函数:
$('body').scrollspy({ target: '.navbar-example' })
二、滚动监听
滚动监听插件是用来根据滚动条所处在的位置自动更新导航项目, 显示导航项目高亮显示。

//基本实例
<nav id="nav" class="navbar navbar-default">
  <a href="#" class="navbar-brand">Web 开发</a>
  <ul class="nav navbar-nav">
    <li>
      <a href="#html5">HTML5</a>
    </li>
    <li>
      <a href="#bootstrap">Bootstrap</a>
    </li>
    <li class="dropdown">
      <a href="#" data-toggle="dropdown">JavaScript <span class="caret"></span></a>
      <ul class="dropdown-menu">
        <li>
          <a href="#jquery">jQuery</a>
        </li>
        <li>
          <a href="#yui">Yui</a>
        </li>
        <li>
          <a href="#extjs">Extjs</a>
        </li>
      </ul>
    </li>
  </ul>
</nav>

<div data-offset="0" data-target="#nav" data-spy="scroll" style="height: 200px; overflow: auto; position: relative;padding: 0 10px;">
  <h4 id="html5">HTML5</h4>
  <p>
    标准通用标记语言下的一个应用 HTML 标准自 1999 年 12 月发布的 HTML4.01后,后继的 HTML5 和其它标准被束之高阁,为了推动 Web 标准化运动的发展,一些公司联合起来,成立了一个叫做 Web Hypertext Application Technology Working Group(Web 超文本应用技术工作组 -WHATWG) 的组织。WHATWG 致力于 Web 表单和应用程序,而 W3C(World Wide Web Consortium,万维网联盟) 专注于 XHTML2.0。在 2006 年,

    双方决定进行合作,来创建一个新版本的 HTML。
  </p>
  <h4 id="bootstrap">Bootstrap</h4>
  <p>
    Bootstrap,来自 Twitter,是目前很受欢迎的前端框架。Bootstrap 是基于 HTML、 CSS、 JAVASCRIPT 的, 它简洁灵活, 使得 Web 开发更加快捷。 [1]它由 Twitter的设计师 Mark Otto 和 Jacob Thornton 合作开发,是一个 CSS/HTML 框架。Bootstrap提供了优雅的 HTML 和 CSS 规范,它即是由动态 CSS 语言 Less 写成。Bootstrap 一经推出后颇受欢迎,一直是 GitHub 上的热门开源项目,包括 NASA 的 MSNBC(微软全国广播公司)的 Breaking News 都使用了该项目。[2]国内一些移动开发者较为熟悉的框架,如 WeX5前端开源框架等,也是基于 Bootstrap 源码进行性能优化而来。[3]
  </p>
  <h4 id="jquery">jQuery</h4>
  <p>
    JQuery 是继 prototype 之后又一个优秀的 Javascript 库。 它是轻量级的 js库 ,它兼容 CSS3,还兼容各种浏览器(IE 6.0+, FF 1.5+, Safari 2.0+, Opera 9.0+) ,jQuery2.0 及后续版本将不再支持 IE6/7/8 浏览器。jQuery 使用户能更方便地处理 HTML(标准通用标记语言下的一个应用) 、 events、 实现动画效果, 并且方便地为网站提供 AJAX交互。jQuery 还有一个比较大的优势是,它的文档说明很全,而且各种应用也说得很详细,同时还有许多成熟的插件可供选择。 jQuery 能够使用户的 html 页面保持代码和 html 内容分离, 也就是说, 不用再在 html 里面插入一堆 js 来调用命令了, 只需要定义 id 即可。
  </p>
  <h4 id="yui">Yui</h4>
  <p>
    近几年随着 jQuery、Ext 以及 CSS3 的发展,以 Bootstrap 为代表的前端开发框架如雨后春笋般挤入视野, 可谓应接不暇。 不论是桌面浏览器端还是移动端都涌现出很多优秀的框架,极大丰富了开发素材,也方便了大家的开发。这些框架各有特点,本文对这些框架进行初步的介绍与比较, 希望能够为大家选择框架提供一点帮助, 也为后续详细研究这些框架的抛砖引玉。
  </p>
  <h4 id="extjs">Extjs</h4>
  <p>
    ExtJS 可以用来开发 RIA 也即富客户端的 AJAX 应用,是一个用 javascript写的,主要用于创建前端用户界面,是一个与后台技术无关的前端 ajax 框架。因此,可以把 ExtJS 用在.Net、Java、Php 等各种开发语言开发的应用中。ExtJs 最开始基于 YUI 技术,由开发人员 JackSlocum 开发,通过参考 JavaSwing 等机制来组织可视化组件,无论从 UI 界面上 CSS 样式的应用,到数据解析上的异常处理,都可算是一款不可多得的JavaScript 客户端技术的精品。
  </p>
</div>

这里有两个重要的属性,如下图:

Bootstrap滚动监听(Scrollspy)插件详解

PS:在一个菜单和一个容易的时候,data-target 不设置也可以稳定实现滚动监听高亮。但多个导航时,你不关联其中一个,会导致错误,所以,一般要加上。

如果使用 JavaScript 脚本方式, 可以去掉 data-*, 使用脚本属性定义: offset、 spy和 target。具体方法如下:

//使用脚本方式定义属性

$('#content').scrollspy({
  offset : 0,
  target : '#nav',
});

滚动监听还有一个切换到新条目的事件。

Bootstrap滚动监听(Scrollspy)插件详解

//事件绑定在导航上

$('#nav').on('activate.bs.scrollspy', function() {
    alert('新条目被激活后触发此事件!');
});
滚动监听还有一个更新容器 DOM 的方法。

Bootstrap滚动监听(Scrollspy)插件详解

//HTML 部分

<section class="sec">
  <h4 id="html5">HTML5 <a href="#" onclick="removeSec(this)">删除此项</a></h4>
  <p>
    ...
  </p>
</section>

//删除内容时,刷新一下 DOM,避免导航监听错位

function removeSec(e) {
  $(e).parents('.sec').remove();
  $('#content').scrollspy('refresh');
}

注意:这个方法必须使用 data-*声明式。

以上就是本文的全部内容,希望对大家的学习有所帮助。

Javascript 相关文章推荐
javascript据option的value值快速设定初始的selected选项
Aug 13 Javascript
js性能优化 如何更快速加载你的JavaScript页面
Mar 17 Javascript
Javascript玩转继承(三)
May 08 Javascript
JavaScript类的写法
Sep 17 Javascript
微信小程序(应用号)简单实例应用及实例详解
Sep 26 Javascript
js多个物体运动功能实例分析
Dec 20 Javascript
bootstrap confirmation按钮提示组件使用详解
Aug 22 Javascript
JS使用正则表达式找出最长连续子串长度
Oct 26 Javascript
详解Vue组件插槽的使用以及调用组件内的方法
Nov 13 Javascript
React+Antd+Redux实现待办事件的方法
Mar 14 Javascript
vue路由守卫,限制前端页面访问权限的例子
Nov 11 Javascript
Vue-router中hash模式与history模式的区别详解
Dec 15 Vue.js
JS组件Bootstrap实现下拉菜单效果代码
Apr 26 #Javascript
基于Jquery插件实现跨域异步上传文件功能
Apr 26 #Javascript
Bootstrap每天必学之模态框(Modal)插件
Apr 26 #Javascript
深入理解JS中的substr和substring
Apr 26 #Javascript
js获取页面及个元素高度、宽度的代码
Apr 26 #Javascript
jQuery javascript获得网页的高度与宽度的实现代码
Apr 26 #Javascript
JQuery给select添加/删除节点的实现代码
Apr 26 #Javascript
You might like
php递归实现无限分类生成下拉列表的函数
2010/08/08 PHP
PHP发送AT指令实例代码
2016/05/26 PHP
php curl上传、下载、https登陆实现代码
2017/07/23 PHP
使用Git实现Laravel项目的自动化部署
2019/11/24 PHP
HR vs CL BO3 第一场 2.13
2021/03/10 DOTA
通过Tabs方法基于easyUI+bootstrap制作工作站
2016/03/28 Javascript
js实现自动轮换选项卡
2017/01/13 Javascript
Vue.js 2.0窥探之Virtual DOM到底是什么?
2017/02/10 Javascript
Node层模拟实现multipart表单的文件上传示例
2018/01/02 Javascript
vue scroller返回页面记住滚动位置的实例代码
2018/01/29 Javascript
微信小程序实现动态获取元素宽高的方法分析
2018/12/10 Javascript
vue 项目接口管理的实现
2019/01/17 Javascript
微信小程序实现类似微信点击语音播放效果
2020/03/30 Javascript
JS中的算法与数据结构之队列(Queue)实例详解
2019/08/20 Javascript
layui当点击文本框时弹出选择框,显示选择内容的例子
2019/09/02 Javascript
jQuery中getJSON跨域原理的深入讲解
2020/09/02 jQuery
Vue单页面应用中实现Markdown渲染
2021/02/14 Vue.js
vue3.0封装轮播图组件的步骤
2021/03/04 Vue.js
Python中使用md5sum检查目录中相同文件代码分享
2015/02/02 Python
Python利用ansible分发处理任务
2015/08/04 Python
Python数据分析之获取双色球历史信息的方法示例
2018/02/03 Python
python读csv文件时指定行为表头或无表头的方法
2019/06/26 Python
深入学习python多线程与GIL
2019/08/26 Python
Python实现读取并写入Excel文件过程解析
2020/05/27 Python
如何基于matlab相机标定导出xml文件
2020/11/02 Python
Python3中小括号()、中括号[]、花括号{}的区别详解
2020/11/15 Python
python中函数返回多个结果的实例方法
2020/12/16 Python
纯CSS3实现3D旋转书本效果
2016/03/21 HTML / CSS
详解CSS3+JS完美实现放大镜模式
2020/12/03 HTML / CSS
绢花、人造花和人造花卉:BLOOM
2019/08/07 全球购物
DOM和JQuery对象有什么区别
2016/11/11 面试题
高中军训感想300字
2014/03/04 职场文书
525心理活动总结
2014/07/04 职场文书
小学生志愿者活动方案
2014/08/23 职场文书
2014年全国法制宣传日宣传活动方案
2014/11/02 职场文书
一文搞懂PHP中的抽象类和接口
2022/05/25 PHP