แถบนำทางด้านบนปิดกั้นเนื้อหาด้านบนของหน้า


296

ฉันมีรหัส Bootstrap ของ 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 คำถามนั้นถูกโพสต์ในภายหลัง
jazzpi

คำตอบ:


254

เพิ่มใน CSS ของคุณ:

body { 
    padding-top: 65px; 
}

จากBootstrap docs :

แถบนำทางคงที่จะซ้อนทับเนื้อหาอื่น ๆ ของคุณเว้นแต่ว่าคุณจะเพิ่มช่องว่างภายในไปด้านบนของเนื้อหา


11
ดูคำตอบเพิ่มเติมด้านล่างโดย @Spajus สำหรับวิธีการเขียนโค้ดสำหรับการตอบสนอง Bootstrap
Jason Capriotti

4
หมุนคำตอบอื่น ๆ ด้วยความกระชับอีกเล็กน้อยด้วย @media (ความกว้างต่ำสุด: 980px) {body {padding-top: 60px; }}
Ted

3
ในขณะที่คำตอบอื่น ๆ ตอบคำถามนี้อย่างละเอียดมากขึ้นนี่คือคำตอบอย่างเป็นทางการตามที่ระบุไว้ในเอกสาร Bootstrap สำหรับลิงก์
Caffeinius

1
มันจะทำงานอย่างไรถ้าผู้ใช้มีหน้าจอที่แคบกว่าหรือเพียงแค่ปรับขนาดหน้าต่าง เนื้อหาสูงสุดจะถูกบล็อกอีกครั้งโดยส่วนแถบนำทางขยาย
Konrad Viltersten

366

การเพิ่มช่องว่างภายในนั้นไม่เพียงพอหากคุณใช้ bootstrap ที่ตอบสนองต่อ ในกรณีนี้เมื่อคุณปรับขนาดหน้าต่างของคุณคุณจะได้รับช่องว่างระหว่างส่วนบนของหน้าและ navbar โซลูชันที่เหมาะสมมีลักษณะดังนี้:

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

19
สมบูรณ์ นี้ควรรวมเข้ากับ bootstrap อย่างใด คุณควรแยกและส่งคำขอดึง
brittohalloran

1
ทางออกที่ดี แต่ก็ยังมีบางสิ่งที่ไม่สามารถแก้ไขได้ ลองดูคำถามที่ฉันเพิ่งทำไปและดูว่าใครสามารถมอบมันได้ stackoverflow.com/questions/12763707/…
ElPiter

27
กระชับยิ่งขึ้น: @media (ความกว้างต่ำสุด: 981px) {body {padding-top: 60px; }}
เท็ด

4
@Ted สำหรับฉันมันต้องเป็นความกว้างขั้นต่ำ: 980px ;-)
white_gecko

3
@white_gecko lol อ๋อ ที่ 980 อยากจะเป็นเพียงเล็กน้อยพิเศษที่ไม่ซ้ำกันพิเศษ ;-)
เท็ด

143

สำหรับ bootstrap 3 คลาสnavbar-static-topแทนการnavbar-fixed-topป้องกันปัญหานี้เว้นแต่ว่าคุณต้องการ navbar ให้มองเห็นได้เสมอ


2
วิธีนี้ใช้งานได้ แต่อาจเว้นช่องว่างไว้เหนือแถบนำทาง คุณอาจจำเป็นต้องปรับเปลี่ยน site.css และลบ 80px-padding-top จากเนื้อหา
ZZZ

9
ฉันลองทุกอย่างและนี่เป็นคำตอบเดียวที่ใช้ได้ เนื่องจากนี่เป็นวิธีแก้ปัญหาที่ทั่วไปที่สุดและไม่ได้ขึ้นอยู่กับขนาดหน้าจอนี่ควรเป็นคำตอบที่ถูกต้อง
Blairg23

1
วิธีนี้แก้ไขปัญหาได้ ทำไมจึงใช้งานแทน navbar-fixed-top
hlyates

มันไม่ทำงานสำหรับ bootstap 3.3.4 ฉันเห็นตัวอย่างการนำทางคงที่ที่เว็บไซต์ bootstrap getbootstrap.com/examples/navbar-fixed-topจะใช้การเติมด้านบน
Alireza Fattahi

2
ในขณะที่ใช้งานได้มันจะทำให้แถบนำทางคงที่และไม่คงที่ นั่นหมายความว่าเมื่อคุณเลื่อนลงแถบนำทางจะหายไป ... อย่างน้อยสำหรับฉันนั่นไม่ดี
tbkn23

62

โซลูชั่นที่มีประโยชน์มากขึ้นสำหรับการอ้างอิงของคุณมันทำงานได้สมบูรณ์แบบในทุกโครงการของฉัน:

เปลี่ยน 'div' ตัวแรกของคุณจาก

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

ถึง

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

28
Navbar แบบคงที่จะหายไปเมื่อเลื่อน
Daniel C. Sobral

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
ฉันใช้รูปภาพเหนือแถบนำทางและมีปัญหาจริงกับเนื้อหาที่ถูกซ่อนอยู่ มันทำงานได้อย่างสมบูรณ์แบบ! ขอบคุณ!
Richard Varno

2
ขอบคุณมากสำหรับการแก้ปัญหาของคุณ คำตอบนี้ทำงานเหมือนมีเสน่ห์สำหรับฉัน :) ฉันต้องการเพิ่มสิ่งหนึ่ง เมื่อคุณโหลดหน้าเว็บ body จะถูกตั้งค่าเป็นอันดับสูงสุดก่อนที่มันจะปรับตัวเองโดยอัตโนมัติเนื่องจาก jquery ไม่ทำงานทันที เพื่อเพิ่มความราบรื่นฉันเพิ่มสิ่งนี้ในเนื้อหา CSS {padding-top: // ความสูงเริ่มต้นของ navbar ของฉัน } สิ่งนี้ช่วยในการเปลี่ยนที่ราบรื่น! ขอขอบคุณอีกครั้ง!
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>

ระยะห่างใช้งานได้ดีในทุกขนาดหน้าจอ


ฉันคิดว่านี่เป็นคำตอบในตอนแรกและพร้อมที่จะให้ upvote แต่ฉันก็รู้ว่ามันไม่ทำงานเมื่อขนาดแคบพอที่จะให้ปุ่มเมนูซ้อนกัน :-(
Steve In CO

คุณพูดถูกมันจะไม่ทำงานกับการซ้อนเมนูโดยไม่มีรหัสเพิ่มเติม ฉันมักจะเก็บแถบเมนูไว้ที่ความสูงหนึ่งบรรทัดและเปลี่ยนตัวเลือกเมนูเป็นปุ่มแฮมเบอร์เกอร์เมื่อขนาดแคบลง
Jason Butler

ฉันไม่รู้ว่าทำไม แต่ใช้งานได้ คุณสามารถอธิบายรายละเอียดเกี่ยวกับสาเหตุที่ใช้งานได้หรือไม่
ระบบรักษาความปลอดภัยสีแดง

ความคิดที่ดี! เนื่องจากมีประโยชน์เมื่อบางหน้ามีแถบนำทางและบางหน้าไม่มีเนื่องจากไม่สามารถแยกความแตกต่างจากไฟล์ css
Laurent

นี่คือวิธีที่จะไปแน่นอน ใช้งานได้กับทุกอุปกรณ์แม้ในขณะที่ navbar แบ่งเป็นสองบรรทัด +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;
    }
}

มันแก้ไขกรณีที่ navbar พับเป็น 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ทำงานได้ดี แต่ถ้าคุณใช้navbar-fixed-topคุณจะต้องรวมเนื้อหาสไตล์ที่กำหนดเอง {padding-top: 60px;} มิฉะนั้นจะบล็อกเนื้อหาที่อยู่ด้านล่าง


3
นี่ไม่ได้เพิ่มข้อมูลใด ๆ ที่ยังไม่ได้ตอบอยู่
Tom Zych

2

สองปัญหาจะเกิดขึ้นที่นี่:

  1. โหลดหน้า (ซ่อนเนื้อหา)
  2. ลิงก์ภายในเช่นนี้จะเลื่อนไปด้านบนและซ่อนไว้โดย navbar:
<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 w / ลิงค์หน้าภายใน

ในการแก้ไข 1) ตามที่ Martijn Burger กล่าวข้างต้น bootstrap v4 เทมเพลตเริ่มต้น css ใช้:

body {
  padding-top: 5rem;
}

เพื่อแก้ไข 2) ตรวจสอบปัญหานี้ รหัสนี้ใช้งานได้เป็นส่วนใหญ่ (แต่ไม่ใช่เมื่อคลิกแฮชเดียวกันครั้งที่ 2):

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

รหัสนี้ทำให้แอนิเมชั่นลิงก์กับ 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/ดูเหมือนว่าจะไม่ทำงานเมื่อตัวอ่านหน้าจอเป็น ในโหมดโฟกัสซึ่งแน่นอนว่าครั้งเดียวที่คุณต้องการใช้งานจริง ...


1

ใช้เป็นวิธีการแก้ปัญหาที่ดีกว่าpercentagepixels

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

หากจำเป็นคุณยังสามารถระบุได้อย่างชัดเจนโดยการเพิ่มbreakpointsคำตอบต่าง ๆตามที่กล่าวไว้ใน@spajus


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
boatcoder

ฉันเดาคำตอบนี้ล้าสมัยแล้ว ฉันจะเพิ่มบันทึกย่อให้กับคำตอบ
Ultroman the Tacoman

0
<div class='navbar' data-spy="affix" data-offset-top="0">

หาก navbar ของคุณอยู่ด้านบนของหน้าให้ตั้งค่าเป็น 0 มิฉะนั้นให้ตั้งค่าdata-offset-topเป็นค่าของเนื้อหาเหนือ navbar ของคุณ

ในขณะเดียวกันคุณต้องแก้ไข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;
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.