twitter bootstrap navbar cố định trang web chồng chéo hàng đầu


347

Tôi đang sử dụng bootstrap trên trang web của mình và đang gặp sự cố với thanh điều hướng cố định hàng đầu. Khi tôi chỉ sử dụng thanh điều hướng thông thường, mọi thứ đều ổn. Tuy nhiên, khi tôi cố gắng chuyển nó sang thanh điều hướng cố định trên cùng, tất cả các nội dung khác trên trang web sẽ thay đổi giống như thanh điều hướng không có ở đó và thanh điều hướng chồng lên nó. về cơ bản đây là cách tôi đặt nó ra:

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

tôi đã cố gắng sao chép chính xác các ví dụ bootstraps nhưng vẫn chỉ gặp sự cố này khi sử dụng thanh điều hướng cố định hàng đầu. tôi đang làm gì sai

Câu trả lời:


527

Câu trả lời của bạn là đúng trong các tài liệu :

Yêu cầu đệm cơ thể

Thanh điều hướng cố định sẽ che phủ nội dung khác của bạn, trừ khi bạn thêm paddingvào đầu trang <body>. Hãy thử các giá trị của riêng bạn hoặc sử dụng đoạn trích của chúng tôi dưới đây. Mẹo: Theo mặc định, thanh điều hướng cao 50px.

body { padding-top: 70px; }

Đảm bảo bao gồm điều này sau CSS Bootstrap cốt lõi.

và trong tài liệu Bootstrap 4 ...

Vị trí sử dụng các thanh điều hướng cố định: cố định, nghĩa là chúng được kéo từ luồng thông thường của DOM và có thể yêu cầu CSS tùy chỉnh (ví dụ: phần đệm trên cùng) để tránh chồng chéo với các phần tử khác.


16
Nhưng khi bạn thu nhỏ cửa sổ, thanh điều hướng sẽ xuất hiện sau 40px, tôi nên xử lý nó như thế nào ..
Aravindhan

5
Nó xuất hiện sau 40px có lẽ vì bạn không "thêm cái này sau CSS Bootstrap cốt lõi và trước CSS đáp ứng tùy chọn."
collimarco

1
Câu trả lời này là đúng, nhưng nó chỉ hoạt động tốt khi bạn tạo phần đệm 40px thành kiểu phản ứng nhanh, xem câu trả lời của Dan hoặc Nick.
Tony Bathgate

1
Xem câu trả lời từ @ qub1n nếu bạn không muốn thêm phần đệm (hoặc bất cứ thứ gì khác).
scharfmn

2
@JerSchneid Ví dụ về navbar-fixed-top trên w3schools.com cho thấy hành vi tương tự. Tôi có xu hướng gọi nó là một lỗi.
Tony Martin

125

Như những người khác đã tuyên bố thêm một phần đệm trên cơ thể hoạt động tuyệt vời. Nhưng khi bạn làm cho màn hình hẹp hơn (với chiều rộng của điện thoại di động), có một khoảng cách giữa thanh điều hướng và thân máy. Ngoài ra, một thanh điều hướng đông đúc có thể quấn vào một thanh nhiều dòng, ghi đè lên một số nội dung một lần nữa.

Điều này đã giải quyết những vấn đề này cho tôi

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

Điều này làm cho phần đệm 40px theo mặc định và 0px khi có chiều rộng dưới 768px (theo tài liệu của bootstrap là cách cắt bố cục điện thoại di động nơi tạo khoảng cách sẽ được tạo)


1
Liệu giải pháp này cũng đi giữa CSS Bootstrap cốt lõi và nhập CSS đáp ứng? Tôi vẫn thấy khoảng trống khi chiều rộng cửa sổ nhỏ hơn 980. Tôi đoán lần nhập sau của phần ghi đè CSS đáp ứng. Nếu tôi di chuyển giải pháp này trong quá trình nhập CSS đáp ứng, thì tôi vẫn nhận được phần đệm cơ thể, cộng với một dòng bổ sung trong thanh menu.
lười

Tôi đang sử dụng Twitter Bootstrap 2.3.2. Tôi nhận thấy tài liệu không còn chứa đề xuất 40px, mặc dù nhu cầu vẫn tồn tại.
lười

1
Ơ, đề nghị 40px vẫn còn đó, nó mới chuyển đi. Xin lỗi vì spam bình luận.
lười

3
bởi Bootstrap 3. + body { padding-top: 40px; }là đủ
andilabs

8
Giải pháp này đang đi đúng hướng. Đơn giản chỉ cần đặt phần đệm vào cơ thể, như được ghi lại, là không đủ, ngay cả trên 3. +. Với sự kết hợp đúng của các truy vấn phương tiện, hiệu ứng mong muốn có thể đạt được khi thanh điều hướng kết thúc với kích thước lại trình duyệt. Trong trường hợp của tôi, tôi cần thay đổi phần đệm ở độ rộng 1148px, 900px và 768px.
John McCann

34

một giải pháp tiện dụng hơn nhiều để bạn tham khảo, nó hoạt động hoàn hảo trong tất cả các dự án của tôi:

thay đổi dòng đầu tiên của bạn từ

.navbar.navbar-fixed-top

đến

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

1
bạn chỉ đang troll? hoặc tôi đã giám sát một cái gì đó?
chyno

Làm thế nào điều này có được 10 upvote? navbar-default chỉ cần thêm màu và màu nền ...
Denny Mueller

2
navbar-static-top là sự thay đổi và nó hoạt động với tôi. Cảm ơn!
kevthanewversi

1
navbar-static-top đã sửa nó cho tôi. Ít xâm nhập nhất.
xpagesbeast

3
Điều này hoạt động nếu bạn không cần thanh điều hướng để luôn hiển thị trên đầu màn hình. Thanh điều hướng-tĩnh-top không cố định, nó cuộn với màn hình. Điều này minh họa cho các kiểu thanh điều hướng khác nhau: getbootstrap.com/docs/3.3/examples/navbar-static-top
Victor Ionescu

26

Vấn đề này đã được biết và có một cách giải quyết trong trang web bootstrap của twitter:

Khi bạn gắn thanh điều hướng, hãy nhớ tính đến vùng ẩn bên dưới. Thêm 40px trở lên của phần đệm vào <body>. Hãy chắc chắn để thêm phần này sau CSS Bootstrap lõi và trước CSS đáp ứng tùy chọn.

Điều này làm việc cho tôi:

body { padding-top: 40px; }

9
Nhưng khi bạn thu nhỏ cửa sổ, thanh điều hướng sẽ xuất hiện sau 40px, tôi nên xử lý nó như thế nào ..
Aravindhan

1
có, giải pháp này không hoạt động tốt trên kích thước màn hình di động. Trong thực tế ở chế độ màn hình rộng trên điện thoại của tôi, về cơ bản nó làm cho trang web trở nên vô dụng.
Tony Bathgate

CSS đáp ứng tùy chọn nào? Tôi đã từng chỉ sử dụng một CSS bootstrap (lõi) - Tôi đang nói ở trên phiên bản 3.7.x UPWARDS; nó có bị phân tách trong các CSS khác nhau trước phiên bản 3.7.x không?
joedotnot

26

@Ryan, bạn nói đúng, mã hóa cứng chiều cao sẽ khiến nó hoạt động kém trong trường hợp điều hướng tùy chỉnh. Đây là mã tôi đang sử dụng cho BS 3.0.0 một cách vui vẻ:

$(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
Thay vì sử dụng parseIntcác giá trị css về chiều cao, tôi chỉ sử dụng $('#main-navbar').height(), nhưng nếu không thì điều này rất hữu ích và giải quyết vấn đề của tôi, cảm ơn bạn.
tylerwal

Trừ khi thanh điều hướng của bạn có chiều cao cố định, đây là những gì bạn cần.
CraigP

21

Tôi đặt cái này trước thùng chứa năng suất:

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

Tôi thích cách tiếp cận này vì nó ghi lại bản hack cần thiết để nó hoạt động, cộng với nó cũng hoạt động cho điều hướng di động.

EDIT - điều này hoạt động tốt hơn nhiều:

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

16

Vấn đề là với navbar-fixed-top, nó sẽ che phủ nội dung của bạn trừ khi chỉ định phần đệm cơ thể. Không có giải pháp được cung cấp ở đây hoạt động trong 100% trường hợp. Giải pháp JQuery nhấp nháy / dịch chuyển trang sau khi trang được tải, trông có vẻ lạ.

Giải pháp thực sự cho tôi không phải là sử dụng navbar-fixed-top, mà là 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
Vâng, điều đó tốt hơn, bởi vì phần đệm của thân máy là động cho từng kích thước màn hình, giải pháp của chúng không tốt.
Ronen Festinger

Nhưng sau đó, có một dải khoảng trắng trống phía trên thanh điều hướng.
dùng2075599

16

Như tôi đã đăng trong một câu hỏi tương tự, tôi đã thành công với việc tạo một thanh điều hướng không cố định giả ngay trước thanh điều hướng cố định thực sự của mình.

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

Khoảng cách hoạt động tuyệt vời trên tất cả các kích thước màn hình.


Đây là những gì chúng tôi làm .. đặt nội dung cơ thể ở vị trí chính xác mà không cần bất kỳ mã js, đoán hoặc bất cứ điều gì. .
FredArters

1
Điều đó xứng đáng nhận được nhiều sự ủng hộ hơn, Hoạt động hoàn toàn tốt, xấu như địa ngục nhưng chỉ có mã: D
JRsz

Cảm ơn, đây là một giải pháp thanh lịch hơn nhiều so với các pixel và phần lề trên cùng ...
Pedro Reis

3
Thật không may, điều này không hoạt động cho điện thoại di động, khi điều hướng vào 1 cột.
Pedro Reis

16

Giải pháp cho Bootstrap 4, nó hoạt động hoàn hảo trong tất cả các dự án của tôi:

thay đổi dòng đầu tiên của bạn từ

navbar-fixed-top

đến

sticky-top

Tài liệu tham khảo Bootstrap

Về thời gian họ đã làm điều này đúng: D


Một số người có thể sử dụng đầu cố định để xem các liên kết khi bạn cuộn xuống trang; mặc dù tính năng này có thể hữu ích nếu bạn không quan tâm đến điều đó :)
kiến

Cũng lưu ý rằng .sticky-top sử dụng vị trí: dính, không được hỗ trợ đầy đủ trong mọi trình duyệt.
sống tình yêu

14

Tất cả các giải pháp trước đây mã cứng 40 pixel cụ thể vào html hoặc CSS theo cách này hay cách khác. Điều gì nếu thanh điều hướng chứa một kích thước phông chữ khác nhau hoặc một hình ảnh? Điều gì sẽ xảy ra nếu tôi có một lý do chính đáng để không gây rối với phần đệm cơ thể ngay từ đầu? Tôi đã tìm kiếm một giải pháp cho vấn đề này, và đây là những gì tôi nghĩ ra:

$(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'});
});

Bạn có thể di chuyển nó lên hoặc xuống bằng cách điều chỉnh '1'. Nó dường như hoạt động với tôi bất kể kích thước của nội dung trong thanh điều hướng, trước và sau khi thay đổi kích thước.

Tôi tò mò những gì người khác nghĩ về điều này: xin vui lòng chia sẻ suy nghĩ của bạn. (Nó sẽ được tái cấu trúc là không lặp lại, btw.) Ngoài việc sử dụng jQuery, có bất kỳ lý do nào khác để không tiếp cận vấn đề theo cách này không? Tôi thậm chí đã làm cho nó hoạt động với một thanh điều hướng thứ cấp như thế này:

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

PS: Trên đây là trên Bootstrap 2.3.2 - nó sẽ hoạt động trong 3.x Miễn là các tên lớp chung vẫn còn ... trên thực tế, nó sẽ hoạt động độc lập với bootstrap, phải không?

EDIT: Đây là một hàm jquery hoàn chỉnh xử lý hai thanh điều hướng cố định xếp chồng, đáp ứng có kích thước động. Nó yêu cầu 3 lớp html (hoặc có thể sử dụng id): user-top, admin-top và 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'
        });
});

Chỉ cần FYI tôi đang sử dụng cái này và nó hoạt động rất tốt, nhưng vì một số lý do kỳ lạ nếu tôi có hai thanh điều hướng, một kích thước bình thường và một cho màn hình nhỏ, nó chỉ hoạt động trên cái lớn hơn?
NaughtySquid

@LiamDawe có thể bạn có nhiều hơn một '.user-top' (ví dụ) trên trang, trong trường hợp đó .height () có thể bị nhầm lẫn ...?
Ryan

14

Chỉ cần thay đổi fixed-topvới sticky-top. bằng cách này bạn sẽ không phải tính toán phần đệm.
Và nó hoạt động!!


4
Theo BS4, đây sẽ là câu trả lời chính xác. +1
Pedro Sousa

11

Để xử lý các dòng gói trong thanh menu, hãy áp dụng id cho thanh điều hướng, như sau:

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

và thêm tập lệnh nhỏ này vào đầu sau khi bao gồm các câu đố, như thế này:

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

Bằng cách đó, phần đệm trên cùng của cơ thể sẽ tự động được điều chỉnh.


Tôi đã phải thay đổi tham chiếu thứ hai thành chiều cao trong ví dụ của bạn thành $ ('# topnavbar'). Height () và sau đó điều này hoạt động hoàn hảo với tôi. Cảm ơn!
tàn nhẫn

1
Cảm ơn các bình luận! Tôi đã sửa nó trong câu trả lời.
Oliver Konig

Đây là giải pháp tốt nhất tôi gặp phải, hoạt động trên PC, iOS, Android - tất cả các thiết bị. Tất cả những cái khác là giá trị pixel được mã hóa cứng hoặc quá dài và không hoạt động trên tất cả các thiết bị.
Người đàn ông ngoạn mục

Giải pháp tốt đẹp. Tôi đã có một số bù đắp nhỏ mà không được tính đến trong tính toán. Tôi đoán đó là vì thanh điều hướng của tôi có một số lợi nhuận. Thay vào đó, tôi đã chọn thay đổi cuộc gọi chiều cao () cho cuộc gọi bên ngoài () để xem xét điều này.
Leonardo Santos

4

cho Bootstrap 3. +, tôi sẽ sử dụng CSS sau để sửa lỗi thanh điều hướng cố định và vấn đề chồng chéo nhảy lên dựa trên 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; 
}

Vấn đề tương tự, câu trả lời tốt đẹp.
McGrady

2

sử dụng lớp này trong thẻ điều hướng

class = "navbar navbar-extend-lg navbar-light bg-light stick-top "

Dành cho bootstrap 4


Tôi sẽ không bao giờ biết tại sao nó bị hạ cấp, vì nó hoạt động cho tôi và tất cả những người khác.
Kynginthenorth

Chính xác. Vấn đề duy nhất là, tại các tài liệu, nó có nội dung "Tiện ích .sticky-top sử dụng vị trí của CSS: dính, không được hỗ trợ đầy đủ trong tất cả các trình duyệt"
José

1

Tât cả nhưng điêu bạn phải lam la

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

0

Hơn nữa với câu trả lời của Nick Bisby, nếu bạn gặp vấn đề này khi sử dụng HAML trong đường ray và bạn đã áp dụng cách khắc phục của Roberto Barros tại đây:

Tôi đã thay thế yêu cầu trong "bootstrap_and_overrides.css" thành:

= yêu cầu twitter-bootstrap-static / bootstrap.css.erb

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

... bạn cần đặt CSS cơ thể trước câu lệnh yêu cầu như sau:

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

Nếu câu lệnh yêu cầu nằm trước CSS cơ thể, nó sẽ không có hiệu lực.


0

Tôi sẽ làm điều này:

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

Điều này sẽ đảm bảo khối điều hướng không kéo dài trang xuống và bao trùm nội dung trang.


-4

Tôi chỉ quấn thanh điều hướng trong một

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

Không có tiêu điểm ưa thích nhưng nó hoạt động ..


Câu trả lời của bạn không rõ ràng và không giải quyết được vấn đề. Không gì nav-? ??đại diện?
Fragilewindows 7/12/2016
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.