Загрузочный лоток: анкеры и верхний край/отступы
Я использую Bootstrap с глобальной навигационной панелью, прикрепленной к верхней части тела страницы.
<div class="navbar navbar-fixed-top navbar-inverse">
<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="/">MyBrand</a>
<div class="nav-collapse collapse">
<ul class="nav">
<li><a href="#>Page 1</li>
<li><a href="#>Page 2</li>
<li><a href="#>Page 3</li>
</ul>
</div>
</div>
</div>
</div>
Я добавил поле на 40 пикселей поверх тела, чтобы верхняя часть страницы не лежала на панели навигации.
body {
background-color: #f5f5f5;
position: relative;
margin-top: 40px;
}
До сих пор все работает нормально. Я также использую внутренние привязки, чтобы упростить навигацию внутри страницы, используя те же механизмы, которые Twitter использовал с аффикс-компонентом в документации Bootstrap, что позволяет пользователю перейти к различным разделам на странице (см. http://twitter.github.com/bootstrap/getting-started.html)
<a href="#section1">Section 1</a>
<a href="#section2">Section 2</a>
<a href="#section3">Section 3</a>
[...]
<section id="section1">
[...]
[...]
[...]
</section
<section id="section2">
[...]
[...]
[...]
</section
<section id="section3">
[...]
[...]
[...]
</section>
Моя проблема в том, когда пользователь нажимает, браузер привязывает цель к самой верхней части экрана, содержимое исчезает под навигационной панелью. Я заметил, что Twitter использовал трюк, целевые теги <section>
включают "padding-top: 30px;", ближайший <h1>
включает "margin-top: 10px;"; CSS, чтобы текст отображался ровно на 40 пикселей ниже верхней части экрана.
Я не могу позволить мне "потерять" 40 пикселей между каждой секцией, мой дисплей должен оставаться компактным. Мой вопрос: есть ли способ, чтобы внутренние якоря не придерживались самой верхней части экрана, а оставались в стороне от верхней части экрана произвольной длины?
Ответы
Ответ 1
Наконец, я понял, как легко решить эту проблему:
body {
background-color: #f5f5f5;
position: relative;
margin-top: 40px;
}
section {
padding-top:40px;
margin-top:-40px;
}
Это означает, что в верхней части тела добавляется край 40px, добавление 40px добавляется поверх секций, добавляется отрицательная граница в 40 пикселей, чтобы продвигать свои соответствующие ожидаемые местоположения, вводя невидимый запас, когда браузер обращает дисплей в секцию после щелчка якоря.
Надеюсь на эту помощь.
Ответ 2
Чтобы прокрутить ее до нужной позиции и правильно выбрать элемент меню при прокрутке страницы, вам нужно установить padding-top: 40px;
на якорь и установить margin-bottom: -40px;
на предыдущем брате якоря.
Вы можете добиться этого с помощью фрагмента JS, который найдет элементы из навигационного меню и применит изменения стиля.
$("header .nav a[href!=#]").each(function(){
$($(this).attr("href")).css("padding-top", "40px").prev().css("margin-bottom", "-40px");
});
Ответ 3
Если ваше приложение может применять javascript, то следующий javascript тоже хорошо работает:
function maybeScrollToHash() {
if (window.location.hash && $(window.location.hash).length) {
var newTop = $(window.location.hash).offset().top - $('.navbar-fixed-top').height() + parseInt($('body').css('padding-top'),10);
$(window).scrollTop(newTop);
}
}
$(window).bind('hashchange', function() {
maybeScrollToHash();
});
maybeScrollToHash();
Это небольшая модификация ответа, найденного здесь: https://github.com/twbs/bootstrap/issues/193
Единственное различие заключается в том, что приведенный выше код работает в классе navbar-fixed-top.