一、簡介
ScrollSpy 就是滾動監聽。設置滾動監聽方式有兩種:
- 標簽 API
- JavaScript 代碼
監聽區域也有兩種可能:
body
標簽- 自定義標簽元素
{注意} ScrollSpy 需要 nav 組件的代碼 支持,才會正確高亮激活項。
二、通過標簽 API
通過標簽 API 設置滾動監聽的方式,就是在要監聽區域上:
- 標記為滾動區域:添加
data-spy="scroll"
。 - 指明在滾動過程中受到激活控制的代碼單元:
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
(完)