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 相关文章推荐
兼容多浏览器的字幕特效Marquee的通用js类
Jul 20 Javascript
关于jquery性能最佳实践的讨论,与求教
Mar 30 Javascript
原生js实现半透明遮罩层效果具体代码
Jun 06 Javascript
JavaScript实现弹出子窗口并传值给父窗口
Dec 18 Javascript
简介JavaScript中用于处理正切的Math.tan()方法
Jun 15 Javascript
jquery插件jquery.confirm弹出确认消息
Dec 22 Javascript
简单的js表格操作
Sep 24 Javascript
RGB和YUV 多媒体编程基础详细介绍
Nov 04 Javascript
node.js+express+mySQL+ejs+bootstrop实现网站登录注册功能
Jan 12 Javascript
Element Input组件分析小结
Oct 11 Javascript
js实现带箭头的进度流程
Mar 26 Javascript
js实现抽奖功能
Nov 24 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
PHP的FTP学习(三)
2006/10/09 PHP
php中转义mysql语句的实现代码
2011/06/24 PHP
php foreach循环中使用引用的问题
2013/11/06 PHP
PHP rsa加密解密使用方法
2015/04/27 PHP
如何实现php图片等比例缩放
2015/07/28 PHP
学习php设计模式 php实现合成模式(composite)
2015/12/08 PHP
jQuery插件 tabBox实现代码
2010/02/09 Javascript
js 页面关闭前的出现提示的实现代码
2011/05/25 Javascript
jQuery实现表单提交时判断的方法
2014/12/13 Javascript
javascript中闭包概念与用法深入理解
2016/12/15 Javascript
vue2笔记 — vue-router路由懒加载的实现
2017/03/03 Javascript
node使用UEditor富文本编辑器的方法实例
2017/07/11 Javascript
vue-quill-editor富文本编辑器简单使用方法
2018/09/21 Javascript
vue-better-scroll 的使用实例代码详解
2018/12/03 Javascript
vue favicon设置以及动态修改favicon的方法
2018/12/21 Javascript
JavaScript实现拖拽盒子效果
2020/02/06 Javascript
[02:44]完美大师赛主赛事淘汰赛第二日观众采访
2017/11/24 DOTA
python设置windows桌面壁纸的实现代码
2013/01/28 Python
Python中的__new__与__init__魔术方法理解笔记
2014/11/08 Python
TensorFlow实现iris数据集线性回归
2018/09/07 Python
python 通过类中一个方法获取另一个方法变量的实例
2019/01/22 Python
Python中类的创建和实例化操作示例
2019/02/27 Python
python实现车牌识别的示例代码
2019/08/05 Python
Python 解码Base64 得到码流格式文本实例
2020/01/09 Python
django queryset相加和筛选教程
2020/05/18 Python
浅谈html5与APP混合开发遇到的问题总结
2018/03/20 HTML / CSS
Boden澳大利亚官网:英国在线服装公司
2018/08/05 全球购物
精彩的推荐信范文
2013/11/26 职场文书
计算机专业毕业生求职信分享
2013/12/24 职场文书
幼儿园保育员岗位职责
2014/04/13 职场文书
小学运动会演讲稿
2014/08/25 职场文书
献爱心大型公益活动策划方案
2014/09/15 职场文书
教师年度考核个人总结
2015/02/12 职场文书
导游词之南京莫愁湖公园
2019/11/13 职场文书
pytorch--之halfTensor的使用详解
2021/05/24 Python
SQL实现LeetCode(176.第二高薪水)
2021/08/04 MySQL