twitter bootstrap navbar фіксований верхній сайт, що перекривається


347

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

.navbar.navbar-fixed-top
  .navbar-inner
    .container
.container
  .row
    //yield content

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

Відповіді:


527

Ваша відповідь прямо в документах :

Потрібні накладки для тіла

Фіксований навбар буде накладати ваш інший вміст, якщо ви не додасте paddingдо верхньої частини <body>. Спробуйте власні цінності або скористайтеся нашим фрагментом нижче. Порада: за замовчуванням набірна панель має висоту 50 пікселів.

body { padding-top: 70px; }

Не забудьте включити це після основної CSS Bootstrap.

і в Bootstrap 4 документи ...

Виправлена ​​фіксація навбарів використовується: фіксовано, тобто вони витягнуті із звичайного потоку DOM і можуть знадобитися спеціальні CSS (наприклад, накладки на верхній частині) для запобігання перекриття з іншими елементами.


16
Але коли ви мінімізуєте вікно, навібар з'являється після 40 пікселів, як мені це впоратися ..
Аравіндхан

5
Це відображається після 40 пікселів, ймовірно, тому, що ви не "додаєте це після основної CSS Bootstrap і перед необов'язковим CSS".
collimarco

1
Ця відповідь відповідає дійсності, але вона спрацьовує добре лише тоді, коли ви зробите 40px накладкою чуйним стилем, див. Відповідь Дена чи Ніка.
Тоні Батгейт

1
Дивіться відповідь від @ qub1n, якщо ви не хочете додавати прокладки (чи що-небудь ще).
scharfmn

2
@JerSchneid Приклад для navbar-fix-top на w3schools.com показує таку ж поведінку. Я схильний називати це помилкою.
Тоні Мартін

125

Як заявили інші, додавання обшивки до кузова працює чудово. Але коли ви зробите екран вужчим (до ширини стільникового телефону), між наворотом і корпусом виникає зазор. Також переповнений навбар може переходити на багаторядковий рядок, знову перезаписуючи частину вмісту.

Це вирішило такі питання для мене

body { padding-top: 40px; }
@media screen and (max-width: 768px) {
    body { padding-top: 0px; }
}

Це робить прокладку 40px за замовчуванням і 0px, коли менше 768px ширини (що згідно з документами bootstrap є скороченням макета мобільного телефону, де буде створений проміжок)


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

Я використовую Twitter Bootstrap 2.3.2. Я помітив, що документ більше не містить пропозиції 40px, хоча потреба все ще існує.
лінивий ведмідь

1
Е, пропозиція 40px все ще є, вона просто перемістилася. Вибачте за коментар спам.
ленорство

3
від Bootstrap 3. + body { padding-top: 40px; }достатньо
andilabs

8
Це рішення на вірному шляху. Просте нанесення прокладки в тіло, як це зафіксовано, недостатньо, навіть на 3. +. При правильному поєднанні медіа-запитів бажаний ефект може бути досягнутий, коли навиварна панель перемотається з розміром браузера. У моєму випадку мені потрібно змінити прокладку на ширину 1148px, 900px та 768px.
Джон Макканн

34

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

змінити перший рядок з

.navbar.navbar-fixed-top

до

.navbar.navbar-default.navbar-static-top

1
ти просто тролінг? чи я щось наглядав?
chyno

Як це отримало 10 оновлень? navbar-default просто додає колір і колір тла ...
Денні Мюллер

2
navbar-static-top - це зміна, і вона працювала для мене. Дякую!
kevthanewversi

1
navbar-static-top виправив це і для мене. Найменш настирливий.
xpagesbeast

3
Це працює, якщо вам не потрібен навігаційний панель, щоб він завжди був видно вгорі екрана. Навбар-статичний верх не фіксований, він прокручується екраном. Це ілюструє різні стилі навбар
Віктор Іонеску

26

Ця проблема відома, і на веб-сайті завантажувального закладу Twitter є вирішення:

Коли ви закріплюєте навбар, не забудьте врахувати прихований ділянку під ним. Додайте до пікселів 40 пікс. Або більше <body>. Не забудьте додати це після основної CSS Bootstrap та перед необов'язковим CSS.

Це працювало для мене:

body { padding-top: 40px; }

9
Але коли ви мінімізуєте вікно, навібар з'являється після 40 пікселів, як мені це впоратися ..
Aravindhan

1
так, це рішення не дуже добре працює на мобільних розмірах екрана. Насправді в широкоекранному режимі на моєму телефоні це в основному робить сайт марним.
Тоні Батгейт

який необов'язковий адаптивний CSS? Я колись використовував лише один (основний) завантажувальний CSS - я говорю вище версії 3.7.x ВПЕРЕД; це було розділено на різних CSS до версії 3.7.x?
Joedotnot

26

@Ryan, ти маєш рацію, якщо жорстке кодування висоти зробить її поганою у разі використання спеціальних навігаційних панелей. Це код, який я щасливо використовую для 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);         
}); 

3
Замість використання parseIntзначень css висоти я просто використовував $('#main-navbar').height(), але в іншому випадку це було дуже корисно і вирішило мою проблему, дякую.
tylerwal

Якщо ваш навбар не має фіксованої висоти, це те, що вам потрібно.
CraigP

21

Я ставлю це перед контейнером з урожаєм:

<div id="fix-for-navbar-fixed-top-spacing" style="height: 42px;">&nbsp;</div>

Мені подобається такий підхід, оскільки він документує хак, необхідний для його роботи, плюс він також працює для мобільних навігацій.

EDIT - це працює набагато краще:

@media (min-width: 980px) {
  body {
    padding-top: 60px;
    padding-bottom: 42px;
  }
}

16

Проблема полягає у навігації з фіксованим верхом, яка буде накладати ваш вміст, якщо не вказати набивання тіла. Тут не передбачено рішення, яке працює в 100% випадках. Рішення JQuery блимає / зміщує сторінку після завантаження сторінки, що виглядає дивно.

Справжнє рішення для мене - використовувати не navbar-fix-top, а navbar-static-top.

.navbar { margin-bottom:0px;} //for jumtron support, see http://stackoverflow.com/questions/23911242/gap-between-navbar-and-jumbotron

<nav class="navbar navbar-inverse navbar-static-top">
...
</nav>

1
Так, це краще, тому що накладка корпусу динамічна для кожного розміру екрана, їх рішення не є гарним.
Ронен Фестінгер

Але тут над смужкою на смузі є смуга порожнього білого простору.
користувач2075599

16

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

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

Проміжок відмінно підходить для всіх розмірів екрана.


Це те, що ми робимо .. розміщуємо вміст тіла в точно потрібному місці без жодного js-коду, здогадок чи чогось іншого. .
FredArters

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

Дякую, це набагато більш елегантне рішення, ніж пікселі та інші пікселі та інше ...
Педро Рейс,

3
На жаль, це не працює для мобільних пристроїв, коли навіси потрапляють в 1 стовпець.
Педро Рейс

16

Рішення для Bootstrap 4, воно ідеально підходить для всіх моїх проектів:

змінити перший рядок з

navbar-fixed-top

до

sticky-top

Довідка на завантажувальну документацію

Про час вони зробили це правильно: D


Деякі люди можуть використовувати фіксований верх, щоб бачити посилання під час прокрутки сторінки; хоча ця функція може бути корисна , якщо ви не дбаєте про те , що :)
knowledge_is_power

Також зауважте, що .sticky-top використовує позицію: липку, яка не повністю підтримується у кожному браузері.
live-love

14

Всі попередні рішення жорстким кодом 40 пікселів, зокрема, в html або CSS тим чи іншим способом. Що робити, якщо на панелі вказівника міститься інший розмір шрифту або зображення? Що робити, якщо у мене є вагомі причини не возитися в першу чергу з накладками на тіло ? Я шукав рішення цієї проблеми, і ось що я придумав:

$(document).ready(function(){
    $('.contentwrap') .css({'margin-top': (($('.navbar-fixed-top').height()) + 1 )+'px'});
    $(window).resize(function(){
        $('.contentwrap') .css({'margin-top': (($('.navbar-fixed-top').height()) + 1 )+'px'});
});

Ви можете переміщати її вгору або вниз, регулюючи значення "1". Здається, він працює для мене незалежно від розміру вмісту в навігаційній панелі до і після зміни розміру.

Мені цікаво, що про це думають інші: будь ласка, поділіться своїми думками. (Буде відновлено, що не повториться, btw.) Окрім використання jQuery, чи є інші причини, щоб не підходити до проблеми таким чином? У мене навіть це працює з вторинним навбаром, як це:

$('.contentwrap') .css({'margin-top': (($('.navbar-fixed-top').height())
        + $('.admin-nav').height() + 1 )+'px'});

PS: Нагорі на Bootstrap 2.3.2 - чи буде він працювати в 3.x Доти, поки залишаться загальні назви класів ... насправді, він повинен працювати незалежно від завантажувальної програми, правда?

EDIT: Ось повна функція jquery, яка обробляє два складених, чуйних фіксованих навбарних панелей динамічного розміру. Для цього потрібні 3 html-класи (або вони можуть використовувати ідентифікатори): user-top, admin-top та contentwrap:

$(document).ready(function(){

    $('.admin-top').css({'margin-top':($('.user-top').height()+0)+'px'});
    $('.contentwrap') .css({'padding-top': (
        $('.user-top').height()
         + $('.admin-top').height()
         + 0 )+'px'
    });

    $(window).resize(function(){
        $('.admin-top').css({'margin-top':($('.user-top').height()+0)+'px'});
        $('.contentwrap') .css({'padding-top': (
            $('.user-top').height()
             + $('.admin-top').height()
             + 0 )+'px'
        });
});

Просто FYI, я використовую це, і він чудово працює, але з якоїсь дивної причини, якщо у мене є два навбар, один нормальний розмір і один для маленьких екранів, він працює лише на більшому?
NaughtySquid

@LiamDawe, можливо, у вас на сторінці більше ".user-top" (наприклад), і в цьому випадку .height () може заплутатися ...?
Райан


11

Для обробки рядків обгортки в панелі меню застосуйте ідентифікатор до панелі навігації, наприклад:

<div class="navbar navbar-default navbar-fixed-top" role="navigation" id="topnavbar">

і додайте цей маленький сценарій в голову після включення jquery, як це:

<script>
    $(document).ready(function(){
        $(document.body).css('padding-top', $('#topnavbar').height() + 10);
        $(window).resize(function(){
            $(document.body).css('padding-top', $('#topnavbar').height() + 10);
        });
    });
</script>

Таким чином, верхня підкладка корпусу автоматично регулюється.


Мені довелося змінити друге посилання на висоту у вашому прикладі на $ ('# topnavbar'). Height (), і тоді це прекрасно працювало для мене. Дякую!
беззаконне

1
Дякуємо за коментар! Я це зафіксував у відповіді.
Олівер Коніг

Це найкраще рішення, яке я натрапив на роботу на ПК, iOS, Android - на всіх пристроях. Усі інші або мають жорстке значення пікселів або занадто тривалі і не працюють на всіх пристроях.
Oracular Man

Приємне рішення. У мене були невеликі компенсації, які не враховувались при розрахунку. Я думаю, це було тому, що мій навігаційний бар мав деякі запаси. Я вирішив змінити виклик висоти () для виклику externalHeight (), щоб врахувати це.
Леонардо Сантос

4

для Bootstrap 3. +, я б скористався наступним CSS, щоб виправити навігаційну фіксовану верхівку, а проблему стрибка якоря накладено на основі https://github.com/twbs/bootstrap/isissue/1768

/* fix fixed-bar */
body { padding-top: 40px; }
@media screen and (max-width: 768px) {
  body { padding-top: 40px; }
}

/* fix fixed-bar jumping to in-page anchor issue */
*[id]:before { 
  display: block; 
  content: " "; 
  margin-top: -75px; 
  height: 75px; 
  visibility: hidden; 
}

Те саме питання, приємна відповідь.
МакГрейді

2

використовувати цей клас всередині тегу nav

class = "navbar navbar-expand-lg navbar-light bg-light sticky-top "

Для завантажувальної програми 4


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

Це вірно. Єдине питання полягає в тому, що в документах написано: "Утиліта .sticky-top використовує позицію CSS: липке, яке підтримується не в усіх браузерах"
Хосе,


0

Далі до відповіді Ніка Бісбі, якщо ви отримали цю проблему, використовуючи HAML в рейках, і ви застосували тут виправлення Роберто Барроса:

Я замінив вимогу в "bootstrap_and_overrides.css" на:

= вимагати twitter-bootstrap-static / bootstrap.css.erb

(Див. Https://github.com/seyhunak/twitter-bootstrap-rails/isissue/91 )

... вам потрібно поставити CSS тіла перед оператором вимагати наступного:

@import "twitter/bootstrap/bootstrap";
body { padding-top: 40px; }
@import "twitter/bootstrap/responsive";
=require twitter-bootstrap-static/bootstrap.css.erb

Якщо заява вимагається перед CSS тіла, воно не набере чинності.


0

Я б це зробив:

// add appropriate media query if required to target mobile nav only
.nav { overflow-y: hidden !important }

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


-4

Я просто загорнув навбар у

<div width="100%">
<div class="nav-? ??">
...
</nav>
</div>

Ніяких фантазійних хокусів, але це спрацювало ..


Ваша відповідь незрозуміла і не може вирішити це питання. Що nav-? ??являє собою?
fragilewindows
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.