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


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.