Bootstrap 的 ScrollSpy

一、简介

ScrollSpy 就是滚动监听。设置滚动监听方式有两种:

  1. 标签 API
  2. JavaScript 代码

监听区域也有两种可能:

  1. body 标签
  2. 自定义标签元素

{注意} ScrollSpy 需要 nav 组件的代码 支持,才会正确高亮激活项。

二、通过标签 API

通过标签 API 设置滚动监听的方式,就是在要监听区域上:

  1. 标记为滚动区域:添加 data-spy="scroll"
  2. 指明在滚动过程中受到激活控制的代码单元:data-target="#navbarWrapper"

2.1 借助 body 标签

body {
    margin-top: 51px;
}

article {
    height: 500px;
}
<body data-spy="scroll" data-offset="71" data-target="#navbarWrapper">
    <div id="navbarWrapper" class="navbar navbar-default navbar-fixed-top">
        <div class="navbar-header">
            <a class="navbar-brand" href="#">Project name</a>
        </div>
        <ul class="nav navbar-nav navbar-right">
            <li><a href="#home">Home</a></li>
            <li><a href="#profile">Profile</a></li>
            <li><a href="#messages">Messages</a></li>
        </ul>
    </div>
    <div id="contentWrapper" class="container">
        <article id="home"><h2>Home</h2><P>...</P></article>
        <article id="profile"><h2>Profile</h2><P>...</P></article>
        <article id="messages"><h2>Messages</h2><P>...</P></article>
    </div>
</body>

这里使用了 固定在顶部的导航条,导航条本身有高度 51px,为了不会遮挡住 #contentWrapper 内容区域,需要给 body 设置 margin-top: 51px;内容区域中,#home 中的 h2 标签默认有样式 margin-top: 20px

那么页面加载完成后,若想让 #home 导航项激活,需要给滚动区域(这里指 <body>)添加偏移量 data-offset="71"(至少为 51px + 20px = 71px)。

2.2 借助自定义标签

这里 是完整的例子。

#scrollableWrapper {
    height:200px;
    overflow:auto;
    position: relative;
}

article {
    height: 500px;
}
<div id="navbarWrapper" class="navbar navbar-default navbar-static">
    <div class="navbar-header">
        <a class="navbar-brand" href="#">Project name</a>
    </div>
    <ul class="nav navbar-nav pull-right">
        <li><a href="#home">Home</a></li>
        <li><a href="#profile">Profile</a></li>
        <li><a href="#messages">Messages</a></li>
    </ul>
</div>
<div id="scrollableWrapper" data-spy="scroll" data-offset="20" data-target="#navbarWrapper">
    <article id="home"><h2>Home</h2></article>
    <article id="profile"><h2>Profile</h2></article>
    <article id="messages"><h2>Messages</h2></article>
</div>

因为 #home 中的 h2 标签有默认样式 margin-top: 20px,所以还需要给滚动区域(这里指 #scrollableWrapper)添加偏移量 data-offset="20"

三、通过 JavaScript 代码

3.1 借助 body 标签

body {
    margin-top: 51px;
}

article {
    height: 500px;
}
<body>
    <div id="navbarWrapper" class="navbar navbar-default navbar-fixed-top">
        <!-- some code -->
    </div>
    <!-- some code -->
</body>
$('body').scrollspy({
    target: '#navbarWrapper',
    offset: 71
})

3.2 借助自定义标签

#scrollableWrapper {
    height:200px;
    overflow:auto;
    position: relative;
}

article {
    height: 500px;
}
<div id="navbarWrapper" class="navbar navbar-default navbar-static">
    <!-- some code -->
</div>
<div id="scrollableWrapper">
    <!-- some code -->
</div>
$('#scrollableWrapper').scrollspy({
    target: '#navbarWrapper',
    offset: 20
})

四、ScrollSpy 的事件回调

在滚动监听过程中,每当激活一个导航项,都会触发一个事件 activate.bs.scrollspy。必要时,可在这个事件的回调函数里写些业务逻辑。

$('#navbarWrapper').on('activate.bs.scrollspy', function (e) {
    console.log(e.target);
})

五、参考链接

http://getbootstrap.com/javascript/#scrollspy

(完)

posted @ 2017-03-20 16:19  Hi!张宝  阅读(1769)  评论(0编辑  收藏  举报