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"> <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>
元素上即可。