верхній панель навігації, що блокує верхній вміст сторінки


296

У мене є цей код завантаження у Twitter

  <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>

Але коли я переглядаю початок сторінки, панель навігації блокує частину вмісту, що знаходиться вгорі сторінки. Будь-яка ідея, як змусити її натискати на решту вмісту нижче, коли переглядається верхню частину сторінки, щоб вміст не блокувався панеллю навігації?



2
@ user2428107 Це питання було розміщено пізніше.
джазпі

Відповіді:


254

Додати у свій CSS:

body { 
    padding-top: 65px; 
}

З документів Bootstrap :

Фіксований навбар буде накладати ваш інший вміст, якщо ви не додасте накладки на верхню частину тіла.


11
Дивіться додаткову відповідь нижче від @Spajus про те, як кодувати це для
чуйного

4
Однозначно розгорніть з іншою відповіддю трохи більше лаконічності за допомогою @media (min-width: 980px) {body {padding-top: 60px; }}
Тед

3
Хоча інші відповіді вирішують це красномовніше, це офіційна відповідь, як зазначено в документації Bootstrap для посилання
Caffeinius

1
Як це буде працювати, якщо користувач має більш вузький екран або просто змінює розмір вікна? Верхній вміст буде знову заблоковано розгорнутою секцією навігаційної панелі.
Конрад Вільтерстен

366

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

body {
  padding-top: 60px;
}
@media (max-width: 979px) {
  body {
    padding-top: 0px;
  }
}

19
Ідеально. Це дійсно має бути якось інтегровано у завантажувальний інструмент. Вам слід розпрощатися та подати запит на тягу.
brittohalloran

1
Гарне рішення, але все-таки щось не вирішено. Погляньте на це питання, яке я щойно висловив, і подивіться, чи може хтось подати руку на це. stackoverflow.com/questions/12763707 / ...
ElPiter

27
Ще більш лаконічно: @media (min-width: 981px) {body {padding-top: 60px; }}
Тед

4
@Тед для мене він повинен бути мінімальної ширини: 980px ;-)
white_gecko

3
@white_gecko lol Так. Той 980 рік хотів бути лише трохи додатковим унікальним ;-)
Тед

143

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


2
Однак це може залишити трохи місця над панеллю навігації. Можливо, вам доведеться змінити site.css і видалити padding-top 80px з тіла.
ZZZ

9
Я спробував усе, і це єдина відповідь, яка спрацювала. Оскільки це найбільш загальне рішення і не залежить від розміру екрана, це має бути правильною відповіддю.
Blairg23

1
Це вирішило проблему. Чому це працює замість навбар-фіксованого верху?
Хлатес

Він не працював для завантаження 3.3.4. Я бачу приклад фіксованого навігаційного веб-сайту на завантажувальному веб-сайті getbootstrap.com/examples/navbar-fixed-top , він використовує padding-top
Аліреза Фаттахі

2
поки це працює, він робить навбар статичним і не фіксованим. це означає, що коли ви прокрутите вниз, навибар зникне ... принаймні для мене це не добре.
tbkn23

62

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

змінити перший "div" з

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

до

<div class="navbar navbar-default navbar-static-top">

28
Статичний навбар зникає під час прокрутки.
Даніель К. Собрал

1
Re: @ DanielC.Sobral відповідь - ви можете вимкнути його для фіксованого в 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 ;-)
Alex Worden

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 від 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; }



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- fix -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! -->

Завантажувальна програма 4 вт / посилання на внутрішню сторінку

Щоб виправити 1), як сказала вище Мартійн Бургер, в css шаблоні запуску bootstrap v4 використовується:

body {
  padding-top: 5rem;
}

Щоб виправити 2) перевірте цю проблему . Цей код здебільшого працює (але не на другому клацанні того ж хеша):

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

Цей код оживляє посилання на jQuery (не тонкий 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 ненові панелі.

Якщо це не вдається - з екранами, які тепер представлять 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/, мабуть, вказує, що це, ймовірно, не спрацює, коли зчитувач екрана у режимі фокусування, що, звичайно, єдиний раз, коли вам це потрібно для роботи ...


1

використання percentageнабагато кращого рішення, ніж pixels.

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

Якщо потрібно, ви все одно можете бути явними, додаючи різні, breakpointsяк згадується в іншій відповіді@spajus


1

EDIT: Це рішення не є життєздатним для новіших версій 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;
}



-1

Додайте до свого JS:

jQuery(document).ready(function($) {
  $("body").css({
    'padding-top': $(".navbar").outerHeight() + 'px'
  })
});

Це не буде працювати, якщо змінити розмір вікна, оскільки ваш padding-top застосовується лише під час готовності документа.
boatcoder

-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;
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.