Смещение Bootstrap scrollspy на фиксированной панели навигации не работает
Я создал и точную скрипку моей проблемы здесь для тестирования:http://jsfiddle.net/aVBUy/7/
проблема в том, что когда я нажимаю на элементы navbar, у меня есть скрипт, который прокручивается до идентификатора элемента. И я использую scrollspy для выделения элементов навигации, когда страница находится в правильном положении. Однако scrollspy только изменяет активное состояние, когда он попадает в верхнюю часть браузера / устройства. Поскольку моя панель навигации исправлена, мне нужно смещение, примененное к scrollspy, чтобы компенсировать 51px (высота navbar).
Я пробовал все, и я не могу заставить его работать. Пожалуйста, проверьте мою скрипку и посмотрите, можете ли вы найти, где я иду не так, поможет мне так много.
вот мой минимизированный код...
HTML-код
<div class="navbar navbar-inverse navbar-fixed-top">
<div class="navbar-inner">
<div class="container">
<a class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse">
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</a>
<a class="brand" href="#"><img src="img/logo.gif" alt="" /></a>
<div class="nav-collapse collapse">
<ul class="nav">
<li><a href="#welcome" data-scroll="#welcome">Welcome</a></li>
<li><a href="#about" data-scroll="#about">About</a></li>
<li><a href="#route" data-scroll="#route">The Route</a></li>
<li><a href="#bike" data-scroll="#bike">The Bike</a></li>
</ul>
</div>
</div>
</div>
</div>
<div class="container">
<div id="welcome" class="row-fluid">
<div class="span12">
<h3>Welcome</h3>
...
</div>
</div>
<hr />
<div id="about" class="row-fluid">
<div class="span12">
<h3>About the ride</h3>
...
</div>
</div>
<hr />
<div id="route" class="row-fluid">
<div class="span12">
<h3>The Route</h3>
...
</div>
</div>
<hr />
<div id="bike" class="row-fluid">
<div class="span12">
<h3>The Bike</h3>
...
</div>
</div>
<hr>
<footer>
<p class="muted"><small>© 2013 All rights reserved.</small></p>
</footer>
</div>
в CSS
body {
padding: 51px 0 0;
}
/* Override Bootstrap Responsive CSS fixed navbar */
@media (max-width: 979px) {
.navbar-fixed-top, .navbar-fixed-bottom {
position: fixed;
margin-left: 0px;
margin-right: 0px;
}
}
body > .container {
padding: 0 15px;
}
скрипт
var offsetHeight = 51;
$('.nav-collapse').scrollspy({
offset: offsetHeight
});
$('.navbar li a').click(function (event) {
var scrollPos = $('body > .container').find($(this).attr('href')).offset().top - offsetHeight;
$('body,html').animate({
scrollTop: scrollPos
}, 500, function () {
$(".btn-navbar").click();
});
return false;
});
скрипка
6 ответов
вам нужно применить смещение к телу.
$('body').scrollspy({
offset: offsetHeight
});
кроме того, вам нужно будет вычесть хотя бы один из смещения в строке ниже, иначе он не будет работать при прокрутке вверх.
var scrollPos = $('body > .container').find($(this).attr('href')).offset().top - (offsetHeight - 1);
вы также можете достичь этого без javascript (через атрибуты данных), объявив data-offset="51"
кроме data-target
.
источник:http://getbootstrap.com/javascript/#scrollspy-usage
только с javascript он работает так просто:
$( document ).ready(function() {
//Scrollspy offset
$("body").scrollspy({target: "#scroll-nav", offset:200});
});
есть более простой способ сделать это, используя атрибуты тега HTML, который вы хотите шпион on.
<ul class="nav nav-list affix" data-spy="affix" data-offset-top="585" data-offset- bottom="425" id="prepare-navigation">
<li class="nav-header">Where?</li>
<li class="divider"></li>
<li><a href="#at-the-museum-day-time">When?</a></li>
<li class="divider"></li>
<li><a href="#at-the-museum-overnight">Why?</a></li>
</ul>
на data-offset-top и data-offset-bottom атрибуты могут использоваться в сочетании с суммой, которую вы хотите предложить. Гораздо проще!
проверьте эту ссылку для лучшего объяснения:https://stackoverflow.com/a/18326668/335567
небольшая коррекция кода для bootstrap 3 (есть небольшая ошибка, когда не свернутая версия меню clikcked /некоторое мерцание/)
$('.navbar li a').click(function (event) {
var scrollPos = $('body > .container').find($(this).attr('href')).offset().top - (offsetHeight - 1);
$('body,html').animate({
scrollTop: scrollPos
}, 500, function () {
if ($("div.navbar-collapse").hasClass("in")) {
$(".navbar-toggle").click();
} else {
}
});
return false;});