Bootstrap每天必学之滚动监听


Posted in Javascript onMarch 16, 2016

本文为大家介绍Bootstrap滚动监听,供大家学习,具体内容如下

1. Scrollspy currently requires the use of a Bootstrap nav component for proper highlighting of active links.

---- 使用滚动监听的话,导航栏必须采用 class="nav"的nav组件才可以:

下面是源代码中的一段,标红的部分可以证明这一点:

使用ScrollSpy的时候,需要采用<ul class="nav">标签,并且在<li>下必须有<a>标签。

注:另外我们需要把<ul class="nav">标签放到另一个容器内(如div),并给父容器添加一个id属性(这一点在第4节有介绍)

function ScrollSpy(element, options) {
 this.$body   = $(document.body)
 this.$scrollElement = $(element).is(document.body) ? $(window) : $(element)
 this.options  = $.extend({}, ScrollSpy.DEFAULTS, options)
 this.selector  = (this.options.target || '') + ' .nav li > a'
 this.offsets  = []
 this.targets  = []
 this.activeTarget = null
 this.scrollHeight = 0

 this.$scrollElement.on('scroll.bs.scrollspy', $.proxy(this.process, this))
 this.refresh()
 this.process()
 }

2. Navbar links must have resolvable id targets. For example, a <a href="#home">home</a> must correspond to something in the DOM like <div id="home"></div>.

--- 简单的说,就是<li>下的<a>标签必须有一个href="#id"属性,并且在滚动的内容里面,必须有对应的<a id="id"></a>这样的标签;当内容滚动到<a id="id">标签时,对应的<li>的<a href="#id">就会自动被选中。

--其实这一点做过Web开发的朋友都知道,在之前的HTML版本中,锚标记 通常采用<a name="tag">这样的方式,但HTML5中的锚标记已经抛弃了name属性,而是采用id属性

ScrollSpy.prototype.activate = function (target) {
 this.activeTarget = target

 this.clear()

 var selector = this.selector +
  '[data-target="' + target + '"],' +
  this.selector + '[href="' + target + '"]'

 var active = $(selector)
  .parents('li')
  .addClass('active')

 if (active.parent('.dropdown-menu').length) {
  active = active
  .closest('li.dropdown')
  .addClass('active')
 }

 active.trigger('activate.bs.scrollspy')
 }

3. No matter the implementation method, scrollspy requires the use of position: relative; on the element you're spying on. In most cases this is the <body>. When scrollspying on elements other than the <body>, be sure to have a height set and overflow-y: scroll; applied.

--- 如果监听Body的滚动,那么你必须给body添加position:relative样式

--- 如果监听的不是Body,而是其他得元素[貌似这种方式常见],那么你需要添加三个样式:position:relative;height:500px;overflow-y:scroll;

ScrollSpy.prototype.refresh = function () {
 var that   = this
 var offsetMethod = 'offset'
 var offsetBase = 0

 this.offsets  = []
 this.targets  = []
 this.scrollHeight = this.getScrollHeight()

 if (!$.isWindow(this.$scrollElement[0])) {
  offsetMethod = 'position'
  offsetBase = this.$scrollElement.scrollTop()
 }

4. To easily add scrollspy behavior to your topbar navigation, add data-spy="scroll" to the element you want to spy on (most typically this would be the <body>). Then add the data-target attribute with the ID or class of the parent element of any Bootstrap .navcomponent.

--- 你需要给滚动内容的标签添加 data-spy="scroll"属性和data-target属性

data-spy 属性指明了被监听的元素,data-target属性指明滚动时需要控制的nav高亮显示

再看一次下面的初始化源代码,标红的位置,this.options.target的值,就等于滚动内容元素的data-target的值,看到这里,你或许已经想到,在定义.nav组件的时候,我们需要把.nav放在另一个容器内(比如div),且该容器需要有一个id属性(与这里data-target需要设置的值相同)。

function ScrollSpy(element, options) {
 this.$body   = $(document.body)
 this.$scrollElement = $(element).is(document.body) ? $(window) : $(element)
 this.options  = $.extend({}, ScrollSpy.DEFAULTS, options)
 this.selector  = (this.options.target || '') + ' .nav li > a'
 this.offsets  = []
 this.targets  = []
 this.activeTarget = null
 this.scrollHeight = 0

 this.$scrollElement.on('scroll.bs.scrollspy', $.proxy(this.process, this))
 this.refresh()
 this.process()
 }

5. After adding position: relative; in your CSS, call the scrollspy via JavaScript:

$('yourTag').scrollspy({ target: 'nav-parent-div-id' })
-- yourTag 就是要承载滚动内容的元素的ID,nav-parent-div-id 就是.nav元素的父元素的id(也就是data-target的值)

乱七八糟写了一堆,下面总结一个简单的几个步骤:

1. 添加标签<div id="scrollSpyID">

2. 在标签内添加.nav组件,并给li->a添加href="#tag"属性

3. 添加<div id="content" data-spy="scroll" data-target="#scrollSpyID">;

4. 添加样式#content{height:500px;overflow-y:scroll;opsition:relative;}

5. 添加脚本$('#content').scrollspy({target:'scrollSpyID'});

最后来个小栗子:

<style type="text/css">
  #body {
   position: relative;
   height: 500px;
   overflow-y: scroll;
  }
 </style>
<div id="sc">
  <ul class="nav nav-pills">
   <li class="active">
    <a href="#A">第一段</a>
   </li>
   <li>
    <a href="#B">第二段</a>
   </li>
   <li>
    <a href="#C">第三段</a>
   </li>
  </ul>

 </div>
<div id="body" class="container-fluid" data-spy="scroll" data-target="#sc">

<a id="A">第一段</a><br />



<!-- 这里要有很多内容,至少要保证可以滚动 -->


<a id="A">第二段</a><br />



<!-- 这里要有很多内容,至少要保证可以滚动 -->


<a id="A">第三段</a><br />



<!-- 这里要有很多内容,至少要保证可以滚动 -->

</div>
$(function () {
 $('#body').scrollspy({ target: '#sc' });
});

如果大家还想深入学习,可以点击这里进行学习,再为大家附两个精彩的专题:Bootstrap学习教程 Bootstrap实战教程

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

Javascript 相关文章推荐
几个比较经典常用的jQuery小技巧
Mar 01 Javascript
JavaScript初学者需要了解10个小技巧
Aug 25 Javascript
JQuery实现当鼠标停留在某区域3秒后自动执行
Sep 09 Javascript
js实现iframe自动自适应高度的方法
Feb 17 Javascript
微信jssdk用法汇总
Jul 16 Javascript
基于JavaScript实现在新的tab页打开url
Aug 04 Javascript
AngularJs 国际化(I18n/L10n)详解
Sep 01 Javascript
JS原型链 详解及示例代码
Sep 06 Javascript
EasyUI学习之Combobox下拉列表(1)
Dec 29 Javascript
jQuery基于Ajax方式提交表单功能示例
Feb 10 Javascript
Vue scrollBehavior 滚动行为实现后退页面显示在上次浏览的位置
May 27 Javascript
关于Node.js中频繁修改代码重启服务器的问题
Oct 15 Javascript
基于jQuery Tipso插件实现消息提示框特效
Mar 16 #Javascript
Jquery技巧(必须掌握)
Mar 16 #Javascript
Javascript的表单验证长度
Mar 16 #Javascript
Uploadify上传文件方法
Mar 16 #Javascript
通过隐藏iframe实现无刷新上传文件操作
Mar 16 #Javascript
原生JS实现平滑回到顶部组件
Mar 16 #Javascript
基于jquery实现百度新闻导航菜单滑动动画
Mar 15 #Javascript
You might like
在线增减.htpasswd内的用户
2006/10/09 PHP
php 静态变量的初始化
2009/11/15 PHP
thinkPHP5.0框架验证码调用及点击图片刷新简单实现方法
2018/09/07 PHP
laravel-admin 管理平台获取当前登陆用户信息的例子
2019/10/08 PHP
在Z-Blog中运行代码[html][/html](纯JS版)
2007/03/25 Javascript
jquery插件实现鼠标经过图片右侧显示大图的效果(类似淘宝)
2013/02/04 Javascript
JavaScript instanceof 的使用方法示例介绍
2013/10/23 Javascript
jQuery实现带渐显效果的人物多级关系图代码
2015/10/16 Javascript
json定义及jquery操作json的方法
2016/09/29 Javascript
VUE使用vuex解决模块间传值问题的方法
2017/06/01 Javascript
jQuery:unbind方法的使用详解
2017/08/14 jQuery
微信小程序开发之IOS和Android兼容的问题
2017/09/26 Javascript
使用selenium抓取淘宝的商品信息实例
2018/02/06 Javascript
解决vue 更改计算属性后select选中值不更改的问题
2018/03/02 Javascript
JS实现的文件拖拽上传功能示例
2018/05/21 Javascript
Vue头像处理方案小结
2018/07/26 Javascript
javascript实现手动点赞效果
2019/04/09 Javascript
Vue监听页面刷新和关闭功能
2019/06/20 Javascript
深入理解javascript prototype的相关知识
2019/09/19 Javascript
浅谈Layui的eleTree树式选择器使用方法
2019/09/25 Javascript
Python入门篇之文件
2014/10/20 Python
python中pandas.DataFrame排除特定行方法示例
2017/03/12 Python
django中模板的html自动转意方法
2018/05/27 Python
Python学习笔记之装饰器
2020/08/06 Python
Lungolivigno Fashion官网:高级时装在线购物
2020/10/17 全球购物
介绍一下sql server的安全性
2014/08/10 面试题
视光学专业毕业生推荐信
2013/10/28 职场文书
测绘工程专业个人自我评价
2013/12/01 职场文书
创业计划书模版
2014/02/05 职场文书
思想品德课教学反思
2014/02/10 职场文书
工程材料采购方案
2014/05/18 职场文书
运动会方队口号
2014/06/07 职场文书
2014年祖国生日寄语
2014/09/19 职场文书
张丽莉事迹观后感
2015/06/16 职场文书
Html5生成验证码的示例代码
2021/05/10 Javascript
JavaScript parseInt0.0000005打印5原理解析
2022/07/23 Javascript