верхняя панель навигации, блокирующая верхний контент страницы

296

У меня есть этот код Twitter Bootstrap

  <div class='navbar navbar-fixed-top'>
    <div class='navbar-inner'>
      <div class='container'>
        <a class='btn btn-navbar' data-target='.nav-collapse' data-toggle='collapse'>
          <span class='icon-bar'></span>
          <span class='icon-bar'></span>
          <span class='icon-bar'></span>
        </a>
        <div class='nav-collapse'>
          <ul class='nav'>
            <li class='active'>
              <a href='some_url'>My Home</a>
            </li>
            <li>
              <a href='some_url'>Option 1 </a>
            </li>
            <li>
              <a href='some_url'>Another option</a>
            </li>
            <li>
              <a href='some_url'>Another option</a>
            </li>
          </ul>
        </div>
      </div>
    </div>
  </div>

Но когда я просматриваю начало страницы, панель навигации блокирует часть содержимого, которое находится в верхней части страницы. Любая идея о том, как заставить его опускать остальную часть контента ниже, когда просматривается верхняя часть страницы, чтобы контент не блокировался панелью навигации?

GeekedOut
источник
2
@ user2428107 Этот вопрос был опубликован позже.
Jazzpi

Ответы:

255

Добавьте к своему CSS:

body { 
    padding-top: 65px; 
}

Из документации по начальной загрузке :

Фиксированная панель навигации будет перекрывать ваш другой контент, если вы не добавите отступы в верхней части тела.

Akuta
источник
11
См. Дополнительный ответ ниже @Spajus о том, как кодировать это для отзывчивой Bootstrap
Джейсон Каприотти
4
Определенно используйте другой ответ с немного большей краткостью, используя @media (min-width: 980px) {body {padding-top: 60px; }}
Тед
3
В то время как другие ответы на этот вопрос более красноречивы, это официальный ответ, как отмечено в документации Bootstrap для фиксированной ссылки
Navbar
1
Как это будет работать, если пользователь имеет более узкий экран или просто меняет размер окна? Самое верхнее содержимое будет снова заблокировано расширенным разделом навигационной панели.
Конрад Вилтерстен
366

Добавление такого дополнения недостаточно, если вы используете адаптивную загрузку. В этом случае, когда вы измените размер окна, вы получите разрыв между верхней частью страницы и панелью навигации. Правильное решение выглядит так:

body {
  padding-top: 60px;
}
@media (max-width: 979px) {
  body {
    padding-top: 0px;
  }
}
Spajus
источник
19
Отлично. Это действительно должно быть как-то интегрировано в бутстрап. Вы должны раскошелиться и отправить запрос на получение.
brittohalloran
1
Хорошее решение, но есть еще что-то не решенное. Посмотрите на этот вопрос, который я только что задал, и посмотрите, сможет ли кто-нибудь помочь. stackoverflow.com/questions/12763707/…
ElPiter
27
Еще более кратко: @media (min-width: 981px) {body {padding-top: 60px; }}
Тед
4
@Ted для меня это должно быть min-width: 980px ;-)
white_gecko
3
@white_gecko лол. Ага. Это 980 хотел быть просто немного особенным уникальным ;-)
Тед
143

Для начальной загрузки 3 класс navbar-static-topвместо этого navbar-fixed-topпредотвращает эту проблему, если только вам не требуется, чтобы панель навигации всегда была видимой.

gtrak
источник
2
Это работает, однако, может оставить некоторое пространство над панелью навигации. Вам может понадобиться изменить site.css и удалить 80px padding-top из тела.
ZZZ
9
Я перепробовал все, и это единственный ответ, который сработал. Поскольку это наиболее общее решение и не зависит от размера экрана, это должен быть правильный ответ.
Blairg23
1
Это решило проблему. Почему это работает вместо navbar-fixed-top?
hlyates
Это не сработало для начальной загрузки 3.3.4. Я вижу исправленный пример навигации на сайте начальной загрузки getbootstrap.com/examples/navbar-fixed-top , он использует верхний отступ
Alireza Fattahi,
2
в то время как это работает, он делает navbar статическим и не фиксируется. это означает, что при прокрутке вниз навигационная панель исчезнет ... по крайней мере, для меня это не хорошо.
tbkn23
62

гораздо более удобное решение для вашей справки, оно отлично работает во всех моих проектах:

измените свой первый 'div' от

<div class='navbar navbar-fixed-top'>

в

<div class="navbar navbar-default navbar-static-top">
catsky
источник
28
Статическая навигационная панель исчезает при прокрутке.
Даниэль С. Собрал,
1
Re: @ DanielC.Sobral response - вы можете заменить его на фиксированный в js, если он прокручивается сверху
obie
17

Я использую jQuery для решения этой проблемы. Это фрагмент для BS 3.0.0:

$(window).resize(function () { 
    $('body').css('padding-top', parseInt($('#main-navbar').css("height"))+10);
});

$(window).load(function () { 
    $('body').css('padding-top', parseInt($('#main-navbar').css("height"))+10);        
});
Арам Пароникян
источник
2
Я использовал изображение поверх панели навигации и у меня были реальные проблемы со скрытым контентом. Это сработало отлично! Спасибо!
Ричард Варно
2
Большое спасибо за ваше решение. этот ответ сработал как очарование для меня :) Я хотел бы добавить одну вещь. Когда вы загружаете страницу, тело устанавливается наверх, прежде чем оно автоматически подстраивается, потому что jquery не запускается мгновенно. Чтобы сделать это более плавным, я добавил это в CSS body {padding-top: // начальная высота моей панели навигации; } Это помогает в плавном переходе! Еще раз спасибо!
AAA
1
Спасибо за вдохновляющее программное решение! У меня теперь есть отличная рабочая реализация в GWT с хорошим инкапсулированным хорошо структурированным кодом ... благодаря отсутствию Javascript ;-)
Алекс Уорден
9

Я добился большого успеха в создании фиктивной нефиксированной навигационной панели прямо перед моей настоящей фиксированной навигационной панелью.

<nav class="navbar navbar-default"></nav> <!-- Dummy nav bar -->
<nav class="navbar navbar-default navbar-fixed-top"> <!-- Real nav bar -->
    <!-- Nav bar details -->
</nav>

Интервал отлично работает на всех размерах экрана.

Джейсон Батлер
источник
Сначала я подумал, что это ответ, и все было готово, чтобы поднять голос. Но потом я понял, что это не работает, когда размер становится достаточно узким, чтобы складывать кнопки меню. :-(
Стив Ин CO
Вы правы, это не будет работать со стеком меню без дополнительного кода. Я обычно просто держу свои строки меню на одной линии высоты и превращаю пункты меню в кнопку гамбургера, когда размер сужается.
Джейсон Батлер
Я понятия не имею, почему, но это работает. Вы можете уточнить, почему это работает?
красная охрана
Отличная идея! так как это полезно, когда на некоторых страницах есть панель навигации, а на некоторых нет, так как невозможно отличить ее от файла CSS.
Лоран
Это определенно путь. Он работает на всех устройствах, даже если навигационная панель разбита на две строки. +1
7

В моем проекте, основанном на руководстве по MVC 5, я обнаружил, что изменение подстановки тела не имеет никакого эффекта. У меня сработало следующее:

@media screen and (min-width:768px) and (max-width:991px) {
    body {
        margin-top:100px;
    }
}
@media screen and (min-width:992px) and (max-width:1199px) {
    body {
        margin-top:50px;
    }
}

Это разрешает случаи, когда навигационная панель складывается в 2 или 3 строки. Это может быть вставлено в bootstrap.css в любом месте после строки тела {margin: 0; }

PiersB
источник
6

Начальный шаблон начальной загрузки bootstrap v4 использует:

body {
  padding-top: 5rem;
}
Мартейн Бургер
источник
4

Как видно из этого примера из Twitter, добавьте его перед строкой, включающей объявления адаптивных стилей:

<style> 
    body {
        padding-top: 60px;
    }
</style>

Вот так:

<link href="Z/bootstrap/css/bootstrap.min.css" rel="stylesheet" />
<style type="text/css">
    body {
        padding-top: 60px;
    }
</style>
<link href="Z/bootstrap/css/bootstrap-responsive.min.css" rel="stylesheet" />
Набиль Кадими
источник
2

с navbar navbar-default все работает нормально, но если вы используете navbar-fixed-top, вы должны включить тело собственного стиля {padding-top: 60px;} в противном случае он будет блокировать содержимое внизу.

Эльдияр Талантбек
источник
3
Это не добавляет никакой информации, которой нет в других ответах.
Том
2

Здесь будут две проблемы:

  1. Загрузка страницы (содержимое скрыто)
  2. Внутренние ссылки, подобные этой, будут прокручиваться вверх и скрываться панелью навигации:
<nav>...</nav>              <!-- 70 pixels tall -->
<a href="#hello">hello</a>  <!-- click to scroll down -->
<hr style="margin: 100px">
<h1 id="hello">World</h1>   <!-- Help!  I'm 70 pixels hidden! -->

Bootstrap 4 с внутренними ссылками на страницы

Чтобы исправить 1), как сказал выше Мартин Бургер, стартовый шаблон начальной загрузки bootstrap v4 использует:

body {
  padding-top: 5rem;
}

Чтобы исправить 2) проверить эту проблему . Этот код в основном работает (но не по 2-му щелчку того же хэша):

window.addEventListener("hashchange", function() { scrollBy(0, -70) })

Этот код анимирует ссылки A с помощью jQuery (не slim jQuery):

  // inline theme global code here
  $(document).ready(function() {
    var body = $('html,body'), NAVBAR_HEIGHT = 70;
    function smoothScrollingTo(target) {
      if($(target)) body.animate({scrollTop:$(target).offset().top - NAVBAR_HEIGHT}, 500);
    }
    $('a[href*=\\#]').on('click', function(event){
      event.preventDefault();
      smoothScrollingTo(this.hash);
    });
    $(document).ready(function(){
      smoothScrollingTo(location.hash);
    });
  })
Майкл Коул
источник
2

Лучшее решение, которое я нашел на данный момент, которое не включает жесткие высоты кодирования и точки останова, - это добавить дополнительный <nav...тег в разметку.

<nav class="navbar navbar-expand-md" aria-hidden="true">
    <a class="navbar-brand" href="#">Navbar</a>
</nav>
<nav class="navbar navbar-expand-md navbar-dark bg-dark fixed-top">
    <a class="navbar-brand" href="#">Navbar</a>

Делая это таким образом, @mediaточки останова идентичны, высота идентична (при условии, что ваш navbar-brandсамый высокий объект в, navbarно вы можете легко заменить другой элемент в fixed-topпанели не- navbar).

Где это терпит неудачу, с программами чтения с экрана, которые теперь представят 2 navbar-brandэлемента. Это указывает на необходимость в not-for-srклассе, чтобы этот элемент не отображался для программ чтения с экрана. Однако этот класс не существует https://getbootstrap.com/docs/4.0/utilities/screenreaders/

Я пытался компенсировать проблему чтения с экрана, aria-hidden="true"но https://www.accessibility-developer-guide.com/examples/sensible-aria-usage/hidden/, кажется, указывает, что это, вероятно, не будет работать, когда программа чтения с экрана в режиме фокуса, который, конечно, единственный раз, когда вам действительно нужно, чтобы он работал ...

boatcoder
источник
1

использование percentageгораздо лучшее решение, чем pixels.

body {
  padding-top: 10%; //This works regardless of display size.
}

При необходимости вы все еще можете быть явным, добавив разные, breakpointsкак указано в другом ответе@spajus

Abhilash
источник
1

РЕДАКТИРОВАТЬ: Это решение не подходит для более новых версий Bootstrap, где недоступны классы navbar-inverse и navbar-static-top.

Используя MVC 5, я исправил свой способ, просто добавив свой собственный Site.css, загруженный после других, следующей строкой: body{padding: 0}

и я изменил код в начале _Layout.cshtml, чтобы быть:

<body>
    <div class="navbar navbar-inverse navbar-static-top">
        <div class="container">
            @if (User.Identity.IsAuthenticated) {
                <div class="top-navbar">
Ультроман Такоман
источник
navbar-static-topне определено в Bootstrap4. Ни то, ни другоеnavbar-inverse
Боудкодер
Я думаю, что этот ответ устарел. Я добавлю примечание к ответу.
Ультроман Такоман
0
<div class='navbar' data-spy="affix" data-offset-top="0">

Если ваша панель навигации изначально находится в верхней части страницы, установите значение 0. В противном случае установите значение для data-offset-topзначения содержимого над панелью навигации.

Между тем вам нужно изменить cssкак таковой:

.affix{
  width:100%;
  top:0;
  z-index: 10;
}
веб-фанат
источник
0

Добавь это:

.navbar {
  position: relative;
}
imcoder
источник
0

ты должен добавить

#page {
  padding-top: 65px
}

не разрушать липкий колонтитул или что-то еще

Себастьян Вирек
источник
-1

Добавьте к своему JS:

jQuery(document).ready(function($) {
  $("body").css({
    'padding-top': $(".navbar").outerHeight() + 'px'
  })
});
cottonova
источник
Это не будет работать, если размер окна будет изменен, так как ваш верхний отступ применяется только при готовности документа.
кодек
-2

Вы можете установить маржу в зависимости от разрешения экрана

@media screen and (min-width:768px) and (max-width:991px) {
body {
    margin-top:100px;
}

@media screen and (min-width:992px) and (max-width:1199px) {
  body {
    margin-top:50px;
  }
}

body{
  padding-top: 10%;
}

#nav{
   position: fixed;
   background-color: #8b0000;
   width: 100%;
   top:0;
}
BradDaley
источник