twitter bootstrap navbar แก้ไขเว็บไซต์ที่ทับซ้อนกันด้านบน


347

ฉันใช้ bootstrap บนเว็บไซต์ของฉันและฉันมีปัญหากับ navbar คงที่ เมื่อฉันใช้ navbar ปกติทุกอย่างใช้ได้ดี อย่างไรก็ตามเมื่อฉันพยายามที่จะเปลี่ยนเป็น navbar คงที่ด้านบนเนื้อหาอื่น ๆ ทั้งหมดในเว็บไซต์เลื่อนขึ้นเช่น navbar ไม่ได้อยู่ที่นั่นและ navbar ทับมัน นี่เป็นวิธีที่ฉันวางไว้:

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

ฉันพยายามที่จะคัดลอกตัวอย่าง bootstraps แต่ยังคงมีปัญหานี้เฉพาะเมื่อใช้ navbar คงที่ด้านบน ผมทำอะไรผิดหรือเปล่า?

คำตอบ:


527

คำตอบของคุณถูกต้องในเอกสาร :

ต้องใช้แผ่นรองร่างกาย

แถบนำทางคงที่จะซ้อนทับเนื้อหาอื่น ๆ ของคุณจนกว่าคุณจะเพิ่มไปยังด้านบนของpadding <body>ลองใช้ค่าของคุณเองหรือใช้ตัวอย่างของเราด้านล่าง เคล็ดลับ: โดยค่าเริ่มต้น navbar จะสูง 50px

body { padding-top: 70px; }

ตรวจสอบให้แน่ใจว่าได้รวมสิ่งนี้ไว้หลังจาก Bootstrap core CSS

และในเอกสาร Bootstrap 4 ...

navbars แบบคงที่ใช้ตำแหน่ง: fixed ซึ่งหมายความว่าพวกมันถูกดึงจากโฟลว์ปกติของ DOM และอาจต้องการ CSS แบบกำหนดเอง (เช่น padding-top on) เพื่อป้องกันการทับซ้อนกับองค์ประกอบอื่น ๆ


16
แต่เมื่อคุณกลบเกลื่อนหน้าต่าง navbar ปรากฏขึ้นหลังจาก 40px ว่าฉันควรจะจัดการกับมัน ..
Aravindhan

5
มันปรากฏขึ้นหลังจาก 40px อาจเป็นเพราะคุณไม่ได้ "เพิ่มสิ่งนี้หลังจาก Core Bootstrap CSS และก่อนหน้า CSS ตอบสนองที่เป็นตัวเลือก"
collimarco

1
คำตอบนี้เป็นความจริง แต่มันจะทำงานได้ดีเมื่อคุณสร้าง 40px padding สไตล์การตอบสนองให้ดูที่คำตอบของ Dan หรือ Nick
โทนี่ Bathgate

1
ดูคำตอบจาก @ qub1n หากคุณไม่ต้องการเพิ่มช่องว่างภายใน (หรืออย่างอื่น)
scharfmn

2
@JerSchneid ตัวอย่างสำหรับ navbar-fixed-top บน w3schools.com แสดงพฤติกรรมเดียวกัน ฉันอยากจะเรียกมันว่าบั๊ก
Tony Martin

125

ตามที่คนอื่น ๆ ระบุไว้ว่าการเพิ่มส่วนเสริมด้านบนให้กับร่างกายทำงานได้ดี แต่เมื่อคุณทำให้หน้าจอแคบลง (กับความกว้างของโทรศัพท์มือถือ) จะมีช่องว่างระหว่าง navbar และตัวถัง นอกจากนี้แถบนำทางที่มีผู้ใช้หนาแน่นสามารถห่อลงในแถบหลายบรรทัดเพื่อแทนที่เนื้อหาบางส่วนได้อีกครั้ง

วิธีนี้ช่วยแก้ไขปัญหาเหล่านี้ให้ฉันได้

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

สิ่งนี้ทำให้การ padding 40px เป็นค่าเริ่มต้นและ 0px เมื่อต่ำกว่าความกว้าง 768px (ซึ่งตามเอกสารของ bootstrap คือการตัดเลย์เอาต์ของโทรศัพท์มือถือที่จะสร้างช่องว่าง)


1
โซลูชันนี้ยังอยู่ระหว่าง Core Bootstrap CSS และการนำเข้า CSS ที่ตอบสนองหรือไม่ ฉันยังคงเห็นช่องว่างเมื่อความกว้างของหน้าต่างน้อยกว่า 980 ฉันคาดเดาการนำเข้าการแทนที่ CSS ที่ตอบสนองได้ในภายหลัง ถ้าฉันย้ายโซลูชันนี้ภายใต้การนำเข้า CSS ที่ตอบสนองได้ฉันก็ยังได้รับช่องว่างภายในรวมถึงบรรทัดเพิ่มเติมในแถบเมนู
slothbear

ฉันใช้ Twitter Bootstrap 2.3.2 ฉันสังเกตเห็นว่าเอกสารไม่ได้มีข้อเสนอแนะ 40px อีกต่อไปแม้ว่ายังมีความต้องการอยู่
slothbear

1
เอ๊ะคำแนะนำ 40px ยังคงอยู่ที่นั่นมันเพิ่งจะย้าย ขออภัยในความคิดเห็นสแปม
slothbear

3
โดย Bootstrap 3. + body { padding-top: 40px; }ก็เพียงพอแล้ว
andilabs

8
การแก้ปัญหานี้อยู่ในเส้นทางที่ถูกต้อง เพียงแค่ใส่ช่องว่างภายในร่างกายตามที่บันทึกไว้ไม่เพียงพอแม้แต่ในวันที่ 3 + ด้วยการผสมผสานที่เหมาะสมของการสืบค้นสื่อผลที่ต้องการสามารถทำได้เมื่อ navbar ล้อมด้วยการปรับขนาดเบราว์เซอร์ใหม่ ในกรณีของฉันฉันต้องเปลี่ยนการขยายที่ 1148px, 900px และ 768px
John McCann

34

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

เปลี่ยนบรรทัดแรกของคุณจาก

.navbar.navbar-fixed-top

ถึง

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

1
คุณเพียงแค่หมุนรอบ? หรือว่าฉันดูแลบางสิ่ง
chyno

สิ่งนี้ได้รับ 10 upvotes อย่างไร navbar- ค่าเริ่มต้นเพียงเพิ่มสีและสีพื้นหลัง ...
Denny Mueller

2
navbar-static-top เป็นการเปลี่ยนแปลงและมันใช้ได้กับฉัน ขอบคุณ!
kevthanewversi

1
navbar-static-top แก้ไขสำหรับฉันเช่นกัน รบกวนน้อยที่สุด
xpagesbeast

3
การทำงานนี้หากคุณไม่ต้องการให้แถบนำทางปรากฏบนหน้าจอเสมอ navbar-static-top ไม่คงที่ แต่จะเลื่อนพร้อมกับหน้าจอ สิ่งนี้เป็นตัวอย่างสไตล์ navbar ที่แตกต่างกัน: getbootstrap.com/docs/3.3/examples/navbar-static-top
Victor Ionescu

26

ปัญหานี้เป็นที่รู้จักและมีวิธีแก้ปัญหาในเว็บไซต์ bootstrap twitter:

เมื่อคุณติดแถบนำทางอย่าลืมคำนึงถึงพื้นที่ที่ซ่อนอยู่ใต้ เพิ่ม 40px <body>หรือมากกว่าของการขยายไปยัง ตรวจสอบให้แน่ใจว่าได้เพิ่มสิ่งนี้หลังจากแกน Bootstrap CSS และก่อน CSS ตัวเลือกตอบสนอง

สิ่งนี้ใช้ได้กับฉัน:

body { padding-top: 40px; }

9
แต่เมื่อคุณย่อเล็กสุดหน้าต่าง navbar จะปรากฏขึ้นหลังจาก 40px ฉันจะจัดการกับมันได้อย่างไร ..
Aravindhan

1
ใช่โซลูชันนี้ใช้งานไม่ได้กับขนาดหน้าจอมือถือ อันที่จริงแล้วในโหมดไวด์สกรีนบนโทรศัพท์ของฉันมันทำให้เว็บไซต์ไม่มีประโยชน์
โทนี่ Bathgate

สิ่งที่ตอบสนอง CSS ตัวเลือก? ฉันเคยใช้ bootstrap CSS (core) เพียงหนึ่งเดียวเท่านั้น - ฉันกำลังพูดถึงเวอร์ชัน 3.7.x ขึ้นไป; มันแยก CSS ที่แตกต่างกันก่อนเวอร์ชั่น 3.7.x หรือไม่
joedotnot

26

@ Ryan คุณถูกต้องการเขียนโค้ดยากจะทำให้มันทำงานไม่ดีในกรณีที่ navbars กำหนดเอง นี่คือรหัสที่ฉันใช้สำหรับ 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

ยกเว้นว่า navbar ของคุณมีความสูงคงที่นี่คือสิ่งที่คุณต้องการ
CraigP

21

ฉันใส่สิ่งนี้ก่อนที่จะใส่ผลตอบแทน:

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

ฉันชอบวิธีการนี้เนื่องจากเป็นเอกสารที่แฮ็คจำเป็นต้องใช้เพื่อให้มันทำงานได้และมันก็ใช้ได้กับ nav มือถือด้วย

แก้ไข - วิธีนี้ใช้งานได้ดีกว่ามาก:

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

16

ปัญหาเกิดขึ้นกับ navbar-fixed-top ซึ่งจะซ้อนทับเนื้อหาของคุณยกเว้นว่าระบุการขยายตัว ไม่มีวิธีการแก้ปัญหาให้ที่นี่ในกรณี 100% วิธีการแก้ปัญหา JQuery กระพริบ / เลื่อนหน้าหลังจากโหลดหน้าซึ่งดูแปลก

ทางออกที่แท้จริงสำหรับฉันคือไม่ใช้ navbar-fixed-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
ใช่มันดีกว่าเนื่องจากการขยายของร่างกายเป็นแบบไดนามิกสำหรับขนาดหน้าจอแต่ละขนาดโซลูชันของพวกเขาไม่ดี
Ronen Festinger

แต่มีแถบพื้นที่สีขาวว่างเปล่าอยู่เหนือแถบนำทาง
user2075599

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
วิธีสมควร upvotes มากขึ้นทำงานได้ดีอย่างสมบูรณ์เป็นที่น่าเกลียดเป็นนรก แต่เพียงรหัส: D
JRsz

ขอบคุณนี่เป็นคำตอบที่สวยงามยิ่งกว่า padding ด้านบนหรือส่วนขยายของพิกเซลและเนื้อหา ...
Pedro Reis

3
น่าเสียดายที่นี่ใช้ไม่ได้กับมือถือเมื่อ navs เข้าใน 1 คอลัมน์
Pedro Reis

16

วิธีการแก้ปัญหาสำหรับ Bootstrap 4 มันทำงานได้สมบูรณ์แบบในทุกโครงการของฉัน:

เปลี่ยนบรรทัดแรกของคุณจาก

navbar-fixed-top

ถึง

sticky-top

การอ้างอิงเอกสาร Bootstrap

เวลาที่พวกเขาทำสิ่งนี้ถูกต้อง: D


บางคนอาจใช้อันดับต้น ๆ เพื่อดูลิงก์ในขณะที่คุณเลื่อนหน้าลง แม้ว่าฟีเจอร์นี้จะมีประโยชน์หากคุณไม่สนใจ :)
knowledge_is_power

โปรดทราบด้วยว่า. Sticky-top ใช้ตำแหน่ง: sticky ซึ่งไม่รองรับอย่างเต็มที่ในทุกเบราว์เซอร์
รักสด

14

โซลูชันก่อนหน้านี้ทั้งหมดจะใช้รหัส 40 พิกเซลใน html หรือ CSS ในแบบเดียวหรืออีกแบบหนึ่งโดยเฉพาะ จะเกิดอะไรขึ้นถ้า navbar มีขนาดตัวอักษรหรือรูปภาพต่างกัน? ถ้าฉันมีเหตุผลที่ดีที่จะไม่ยุ่งกับการบุร่างกายในตอนแรกล่ะ? ฉันได้ค้นหาวิธีแก้ไขปัญหานี้และนี่คือสิ่งที่ฉันมาด้วย:

$(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' ดูเหมือนว่าจะใช้งานได้สำหรับฉันไม่ว่าขนาดของเนื้อหาในแถบนำทางจะเป็นอย่างไรก่อนและหลังการปรับขนาด

ฉันอยากรู้ว่าคนอื่นคิดอย่างไรเกี่ยวกับเรื่องนี้: โปรดแบ่งปันความคิดของคุณ (มันจะถูก refactored ว่าจะไม่ทำซ้ำ btw.) นอกเหนือจากการใช้ jQuery มีเหตุผลอื่นที่จะไม่เข้าหาปัญหาด้วยวิธีนี้หรือไม่? ฉันได้ทำงานกับ navbar รองเช่นนี้:

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

PS: ด้านบนอยู่บน Bootstrap 2.3.2 - มันจะทำงานใน 3.x ตราบใดที่ชื่อคลาสทั่วไปยังคงอยู่ ... ในความเป็นจริงมันควรจะทำงานโดยอิสระจาก bootstrap ใช่ไหม?

แก้ไข: นี่คือฟังก์ชั่น jquery ที่สมบูรณ์ที่จัดการสอง navbars คงที่ตอบสนองคงขนาดแบบไดนามิก มันต้องการคลาส 3 html (หรืออาจใช้ id): 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 ฉันใช้นี่และมันใช้งานได้ดี แต่ด้วยเหตุผลแปลก ๆ บางอย่างถ้าฉันมี navbars สองอันขนาดปกติหนึ่งอันและอีกอันสำหรับหน้าจอขนาดเล็กมันใช้ได้กับอันที่ใหญ่กว่าเท่านั้น?
NaughtySquid

@LiamDawe บางทีคุณอาจมี '.user-top' (ตัวอย่าง) มากกว่าหนึ่งรายการในหน้าซึ่งในกรณีนี้. high () อาจสับสน ...
Ryan


11

สำหรับการจัดการการพันบรรทัดในเมนูบาร์ให้ใช้ id กับ navbar เช่นนี้

<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 () จากนั้นก็ใช้งานได้อย่างสมบูรณ์แบบสำหรับฉัน ขอบคุณ!
notruthless

1
ขอบคุณสำหรับความคิดเห็น! ฉันแก้ไขมันในคำตอบ
Oliver Konig

นี่เป็นทางออกที่ดีที่สุดที่ฉันได้พบซึ่งใช้ได้กับพีซี, iOS, Android - อุปกรณ์ทั้งหมด อื่น ๆ ทั้งหมดเป็นค่าพิกเซลแบบตายตัวหรือยาวเกินไปและไม่สามารถใช้งานได้กับอุปกรณ์ทั้งหมด
Oracular Man

ทางออกที่ดี ฉันมีออฟเซ็ตขนาดเล็กที่ไม่ได้นำมาใช้ในการคำนวณ ฉันเดาว่าคงเป็นเพราะแถบนำทางของฉันมีระยะขอบบ้าง ฉันเลือกที่จะเปลี่ยนการเรียก height () สำหรับการเรียก outerHeight () แทนเพื่อพิจารณาสิ่งนี้
Leonardo Santos

4

สำหรับ Bootstrap 3 + ฉันจะใช้ CSS ต่อไปนี้เพื่อแก้ไข navbar-fixed-top และปัญหาการกระโดดข้ามจุดยึดโยงกับ https://github.com/twbs/bootstrap/issues/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; 
}

ปัญหาเดียวกันคำตอบที่ดี
McGrady

2

ใช้คลาสนี้ภายในแท็ก nav

class = "navbar navbar-expand-lg navbar-light bg-light กาวเหนียว "

สำหรับ bootstrap 4


ฉันจะไม่มีทางรู้ว่าทำไมมันจึงถูกลดระดับลงเนื่องจากทำงานให้ฉันและคนอื่น ๆ ทั้งหมด
Kynginthenorth

สิ่งนี้ถูกต้อง ปัญหาเดียวก็คือที่เอกสารมันบอกว่า "ยูทิลิตี้. Sticky-top ใช้ตำแหน่งของ CSS: เหนียวซึ่งไม่ได้รับการสนับสนุนอย่างเต็มที่ในทุกเบราว์เซอร์"
โฮเซ


0

เพิ่มเติมจากคำตอบของ Nick Bisby หากคุณพบปัญหานี้โดยใช้ HAML ในรางและคุณได้แก้ไขปัญหาของ Roberto Barros ที่นี่:

ฉันแทนที่ต้องการใน "bootstrap_and_overrides.css" เป็น:

= ต้องการ twitter-bootstrap-static / bootstrap.css.erb

(ดูhttps://github.com/seyhunak/twitter-bootstrap-rails/issues/91 )

... คุณต้องวาง CSS เนื้อหาไว้ข้างหน้าข้อความสั่งดังนี้:

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

หากข้อความสั่ง require อยู่ก่อน CSS ของเนื้อความจะไม่มีผล


0

ฉันจะทำสิ่งนี้:

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

สิ่งนี้ควรตรวจสอบให้แน่ใจว่าบล็อก nav ไม่ขยายหน้าเว็บและครอบคลุมเนื้อหาของหน้า


-4

ฉันเพิ่งห่อแถบนำทางไว้ใน

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

ไม่มีโฟกัสแบบแฟนซี แต่มันใช้งานได้ ..


คำตอบของคุณไม่ชัดเจนและไม่สามารถแก้ไขปัญหาได้ สิ่งที่nav-? ??เป็นตัวแทน?
เปราะบางหน้าต่าง
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.