不幸的是,当函数第一次被调用时,jQuerydata-*
只会拉入一次属性。$().data(...)
并且scrollspy
只在初始化时读取一次选项。scrollspy的refresh
功能不会重新加载任何选项。在同一个元素上再次调用$(..).scrollspy(...)
会忽略任何新的数据选项(使用先前初始化的值)。
但是,scrollspy确实将选项值存储在键下的元素数据中'bs.scrollspy'
。因此,您可以更改该options.offset
数据键内的字段。
要考虑动态变化的导航栏高度和更改 scrollspy 偏移值的需要,您可以将以下示例用于可变高度的固定顶部导航栏。
下面做一些事情。
- 它通过 javascript 初始化 scrollspy(在
window.load
事件触发之后),并从导航栏当前高度的偏移量开始(也将 body 的padding-top
值调整为与导航栏高度相同)。
- 监视调整大小事件并
padding-top
调整正文,并offset
调整滚动间谍以匹配。然后refresh
执行 a 以重新计算锚点偏移量。
HTML
<body>
<style type="text/css">
/* prevent navbar from collapsing on small screens */
#navtop .navbar-nav > li { float: left !important; }
</style>
<nav id="navtop" class="navbar-fixed-top" role="navigation">
<div class="container">
<ul class="nav nav-pills navbar-nav">
<li><a href="#one">One</a></li>
<li><a href="#two">Two</a></li>
<li><a href="#three">Three</a></li>
... some more navlinks, or dynamically added links that affect the height ...
</ul>
</div>
</nav>
<section id="one">
...
</section>
<section id="two">
...
</section>
<section id="three">
...
</section>
....
</body>
JavaScript
$(window).on('load',function(){
var $body = $('body'),
$navtop = $('#navtop'),
offset = $navtop.outerHeight();
// fix body padding (in case navbar size is different than the padding)
$body.css('padding-top', offset);
// Enable scrollSpy with correct offset based on height of navbar
$body.scrollspy({target: '#navtop', offset: offset });
// function to do the tweaking
function fixSpy() {
// grab a copy the scrollspy data for the element
var data = $body.data('bs.scrollspy');
// if there is data, lets fiddle with the offset value
if (data) {
// get the current height of the navbar
offset = $navtop.outerHeight();
// adjust the body's padding top to match
$body.css('padding-top', offset);
// change the data's offset option to match
data.options.offset = offset;
// now stick it back in the element
$body.data('bs.scrollspy', data);
// and finally refresh scrollspy
$body.scrollspy('refresh');
}
}
// Now monitor the resize events and make the tweaks
var resizeTimer;
$(window).resize(function() {
clearTimeout(resizeTimer);
resizeTimer = setTimeout(fixSpy, 200);
});
});
就是这样。不漂亮,但它绝对有效。我上面的 HTML 可能需要一些调整。
如果您将元素动态添加到导航栏,则需要fixSpy()
在插入后调用。或者您可以fixSpy()
通过setInterval(...)
计时器调用以一直运行。