在您的示例中,HTML 中有.affix-top
类和data-spy="affix"
属性。
<nav class="navbar scroll-menu affix-top" data-spy="affix" id="myAffix" style="border: 1px solid #f00;">
<ul class="nav navbar-nav" style="font-size: 10px; background: #fff;">
<li><a href="#section1">SECTION ONE</a></li>
<li><a href="#section2">SECTION TWO</a></li>
</ul>
</nav>
这些都不是必需的,因为.affix-top
初始化时由插件动态添加data-spy="affix"
属性也不是必需的,因为您正在使用 JavaScript 对其进行初始化。
所以,你的 HTML 应该是:
<nav id="myAffix" class="navbar scroll-menu" style="border: 1px solid #f00;">
<ul class="nav navbar-nav" style="font-size: 10px; background: #fff;">
<li><a href="#section1">SECTION ONE</a></li>
<li><a href="#section2">SECTION TWO</a></li>
</ul>
</nav>
此外,在文档中还指定了以下内容:
通过数据属性使用 Affix 插件或手动使用您自己的插件
JavaScript。在这两种情况下,您都必须为
附加内容的位置和宽度。
这意味着您应该添加一些 CSS 来设置附加 div 的宽度和位置。
.affix {
top: 40px;
/* This is the desired offset where the affixed div will appear */
width: 100%;
/* This is the desired width where the affixed div will have */
}
通过上述更改,该词缀无论在全屏还是小屏幕下都可以按预期工作。
但后来,我遇到了一个错误!该错误在全屏加载然后调整为小屏幕时出现。
当在小屏幕时,插件会记住offset
全屏初始化的属性。错误是该 affix 插件绑定了一个处理程序window.scroll
永远不会被删除的事件。
这是一个内存泄漏错误(发现here https://stackoverflow.com/questions/21713468/bootstrap-affix-plugin-memory-leak),答案中提到了解决方法。
因此,不要调用:
$(window).off('#myAffix');
您应该调用以下命令来正确删除先前初始化创建的所有事件
$(window).off('.affix');
总而言之,你的 JS 应该是这样的:
$.initAffix = function() {
$('#myAffix').affix({
offset: {
top: function() {
console.log('Offset top from: ' + $('.navbar').offset().top);
return (this.top = $('.navbar').offset().top);
}
}
});
};
$.resetAffix = function() {
console.log('resetAffix');
$(window).off('.affix');
$('#myAffix').removeData('bs.affix').removeClass('affix affix-top affix-bottom');
$.initAffix();
};
$(window).on('resize', $.resetAffix);
$.initAffix();
这是一个工作demo https://jsfiddle.net/codingstill/q9z5dt6a/10/.