8.4 滚动监听 8.4.1 通过data-属性实现滚动监听

8.4 滚动监听

滚动监听实际上是一种页面内的导航方式。当页面内容很多时,开发者往往会在页面上方定义一系列导航链接,这些链接并不链接到其他页面,而是链接当前页面的锚点。当用户单击页面上方的链接时,页面将会自动定位到对应锚点所在的位置,这是Web页面开发中常用的技术。
滚动监听对这种导航进行了改进。如果用户在页面内容中通过滚动条进行滚动导航时,当用户滚动到某个锚点时,滚动监听会自动激活对应的导航链接,显示用户当前正在查看的位置。

8.4.1 通过data-*属性实现滚动监听

使用data-*属性实现滚动监听只要在被滚动的内容元素上指定两个属性即可,被滚动的内容元素可以是<div>元素或<body>元素。

属性 描述
data-spy 该属性的值始终是'scroll'字符串。
data-target 该属性的值用于指定对应的导航条,该属性值可以是任意的CSS选择器,通常会使用ID选择器。

程序示例

下面代码示范了如何使用data-*属性实现滚动监听。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
<!DOCTYPE html>
<html>

<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1">
<title> 滚动监听 </title>
<link rel="stylesheet" href="../bootstrap/css/bootstrap.min.css">
<link rel="stylesheet" href="../bootstrap/css/bootstrap-theme.min.css">
<style type="text/css">
.scrollspy-content {
position: relative;
height: 160px;
overflow-y: scroll;
}
</style>
</head>

<body>
<div class="container">
<!-- 导航条 -->
<nav id="fknavbar" class="navbar navbar-default navbar-static">
<div class="container-fluid">
<div class="navbar-header">
<a class="navbar-brand" href="#">滚动监听</a>
</div>
<!-- 导航条 -->
<ul class="nav navbar-nav">
<!-- 定位到锚点 -->
<li class=""><a href="#java">疯狂Java讲义</a></li>
<li class=""><a href="#android">疯狂Android讲义</a></li>
<!-- 下拉菜单 -->
<li class="dropdown">
<!-- 下拉菜单展开收起按钮 -->
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true"
aria-expanded="false">前端图书
<span class="caret"></span>
</a>
<!-- 菜单 -->
<ul class="dropdown-menu">
<li class="active"><a href="#html">疯狂HTML 5讲义</a></li>
<li role="separator" class="divider"></li>
<li><a href="#front">疯狂前端开发讲义</a></li>
</ul>
</li>
</ul>
</div>
</nav>
</div>
<div class="container">
<!-- data-spy="scroll"表示该容器可以滚动, -->
<!-- data-target="#fknavbar"指明控制滚动的导航条 -->
<!-- 1号代码 -->
<div data-spy="scroll" data-target="#fknavbar" class="scrollspy-content">
<h4 id="java">疯狂Java讲义</h4>
<p>s</p>
<p>s</p>
<p>s</p>
<p>s</p>
<p>s</p>
<h4 id="android">疯狂Android讲义</h4>
<p>s</p>
<p>s</p>
<p>s</p>
<p>s</p>
<p>s</p>
<h4 id="html">疯狂HTML 5讲义</h4>
<p>s</p>
<p>s</p>
<p>s</p>
<p>s</p>
<p>s</p>
<h4 id="front">疯狂前端开发讲义</h4>
<p>s</p>
<p>s</p>
<p>s</p>
<p>s</p>
<p>s</p>
</div>
</div>
<script type="text/javascript" src="../jquery-3.1.1.js"></script>
<script type="text/javascript" src="../bootstrap/js/bootstrap.min.js"></script>
</body>

</html>

第一段代码使用<nav>元素定义了一个导航条,在该导航条内先定义了一个品牌图标(该品牌图标并没有导航作用),接下来程序在导航条内定义了3个导航项,其中第三个导航项其实包含了两个导航菜单项。从该导航条的代码来看,每个导航链接都会链接到相应的页面锚点—这与前面介绍的导航条并没有任何区别。
本例的关键在于页面中的1号代码,这行代码指定了data-spy="scroll"data-target="#fknavbar"属性,其中:

  • 第一个属性指定要对该元素执行滚动监听;
  • 第二个属性指定该元素对应的导航条为id为fknavbar的导航条。增加这一行之后,Bootstrap的导航监听插件就会发挥作用了。

为了让页面中被监听的<div>元素中出现滚动条,为该元素指定了.scrollspy-content 样式,该样式的代码如下:

1
2
3
4
5
.scrollspy-content {
position: relative;
height: 160px;
overflow-y: scroll;
}

该样式用于控制目标元素的高度只有160px,这是为了限制目标元素的高度,从而让目标元素上能出现滚动条。此外在该样式中还指定了**overflow-y:scroll,该属性用于设置在垂直方向上显示滚动条**。此外,对于被监听的组件,通常需要设置position:relative;,即采用相对定位的方式。
无论使用何种实现方式,被滚动监听的组件都应该采用相对定位的方式,也就是设置position:relative;。

如何对整个页面进行滚动监听

很多时候,开发者希望直接对页面内容整体进行滚动监听,这其实就是对<body>元素进行滚动监听,为此只要将data-spy="scroll"data-target="导航条选择器"这两个属性添加到<body>元素上即可。