简体   繁体   中英

Align bottom of Bootstrap fixed navbar to top of div

I have a fixed navbar on the top of my page and a scrollspy set up with animated scrolling. However, when I click a navigation link, the page scrolls to the point where the top of the navbar aligns with the top of the anchored div . I'd like the bottom of the navbar to align with the top of the anchored div so as to not cover any content in that anchored div . How can I do this?

As far as my code goes, I am starting from this example from W3schools.

To scroll at the top of each sections instead of the additional offset of 50px, you can just subtract 50 from these two:

$('html, body').animate({
        scrollTop: $(hash).offset().top-50
      }, 800, function(){

        // Add hash (#) to URL when done scrolling (default click behavior)
        window.location.hash = hash-50;
      });

Original snippet: (Scrolls to 50 offset from top)

 <!DOCTYPE html> <html> <head> <title>Bootstrap Example</title> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css"> <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script> <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script> <style> body { position: relative; } #section1 { padding-top: 50px; height: 500px; color: #fff; background-color: #1E88E5; } #section2 { padding-top: 50px; height: 500px; color: #fff; background-color: #673ab7; } #section3 { padding-top: 50px; height: 500px; color: #fff; background-color: #ff9800; } #section41 { padding-top: 50px; height: 500px; color: #fff; background-color: #00bcd4; } #section42 { padding-top: 50px; height: 500px; color: #fff; background-color: #009688; } </style> </head> <body> <nav class="navbar navbar-inverse navbar-fixed-top"> <div class="container-fluid"> <div class="navbar-header"> <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#myNavbar"> <span class="icon-bar"></span> <span class="icon-bar"></span> <span class="icon-bar"></span> </button> <a class="navbar-brand" href="#">WebSiteName</a> </div> <div> <div class="collapse navbar-collapse" id="myNavbar"> <ul class="nav navbar-nav"> <li><a href="#section1">Section 1</a></li> <li><a href="#section2">Section 2</a></li> <li><a href="#section3">Section 3</a></li> <li class="dropdown"><a class="dropdown-toggle" data-toggle="dropdown" href="#">Section 4 <span class="caret"></span></a> <ul class="dropdown-menu"> <li><a href="#section41">Section 4-1</a></li> <li><a href="#section42">Section 4-2</a></li> </ul> </li> </ul> </div> </div> </div> </nav> <div id="section1" class="container-fluid"> <h1>Section 1</h1> <p>Click on the different Section links in the navbar to see the smooth scrolling effect.</p> </div> <div id="section2" class="container-fluid"> <h1>Section 2</h1> <p>Click on the different Section links in the navbar to see the smooth scrolling effect.</p> </div> <div id="section3" class="container-fluid"> <h1>Section 3</h1> <p>Click on the different Section links in the navbar to see the smooth scrolling effect.</p> </div> <div id="section41" class="container-fluid"> <h1>Section 4 Submenu 1</h1> <p>Click on the different Section links in the navbar to see the smooth scrolling effect.</p> </div> <div id="section42" class="container-fluid"> <h1>Section 4 Submenu 2</h1> <p>Click on the different Section links in the navbar to see the smooth scrolling effect.</p> </div> <script> $(document).ready(function() { // Add scrollspy to <body> $('body').scrollspy({ target: ".navbar", offset: 50 }); // Add smooth scrolling on all links inside the navbar $("#myNavbar a").on('click', function(event) { // Make sure this.hash has a value before overriding default behavior if (this.hash !== "") { // Prevent default anchor click behavior event.preventDefault(); // Store hash var hash = this.hash; // Using jQuery's animate() method to add smooth page scroll // The optional number (800) specifies the number of milliseconds it takes to scroll to the specified area $('html, body').animate({ scrollTop: $(hash).offset().top }, 800, function() { // Add hash (#) to URL when done scrolling (default click behavior) window.location.hash = hash; }); } // End if }); }); </script> </body> </html> 

Revised snippet: (Scrolls to to the top of each section)

 <!DOCTYPE html> <html> <head> <title>Bootstrap Example</title> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css"> <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script> <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script> <style> body { position: relative; } #section1 { padding-top: 50px; height: 500px; color: #fff; background-color: #1E88E5; } #section2 { padding-top: 50px; height: 500px; color: #fff; background-color: #673ab7; } #section3 { padding-top: 50px; height: 500px; color: #fff; background-color: #ff9800; } #section41 { padding-top: 50px; height: 500px; color: #fff; background-color: #00bcd4; } #section42 { padding-top: 50px; height: 500px; color: #fff; background-color: #009688; } </style> </head> <body> <nav class="navbar navbar-inverse navbar-fixed-top"> <div class="container-fluid"> <div class="navbar-header"> <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#myNavbar"> <span class="icon-bar"></span> <span class="icon-bar"></span> <span class="icon-bar"></span> </button> <a class="navbar-brand" href="#">WebSiteName</a> </div> <div> <div class="collapse navbar-collapse" id="myNavbar"> <ul class="nav navbar-nav"> <li><a href="#section1">Section 1</a></li> <li><a href="#section2">Section 2</a></li> <li><a href="#section3">Section 3</a></li> <li class="dropdown"><a class="dropdown-toggle" data-toggle="dropdown" href="#">Section 4 <span class="caret"></span></a> <ul class="dropdown-menu"> <li><a href="#section41">Section 4-1</a></li> <li><a href="#section42">Section 4-2</a></li> </ul> </li> </ul> </div> </div> </div> </nav> <div id="section1" class="container-fluid"> <h1>Section 1</h1> <p>Click on the different Section links in the navbar to see the smooth scrolling effect.</p> </div> <div id="section2" class="container-fluid"> <h1>Section 2</h1> <p>Click on the different Section links in the navbar to see the smooth scrolling effect.</p> </div> <div id="section3" class="container-fluid"> <h1>Section 3</h1> <p>Click on the different Section links in the navbar to see the smooth scrolling effect.</p> </div> <div id="section41" class="container-fluid"> <h1>Section 4 Submenu 1</h1> <p>Click on the different Section links in the navbar to see the smooth scrolling effect.</p> </div> <div id="section42" class="container-fluid"> <h1>Section 4 Submenu 2</h1> <p>Click on the different Section links in the navbar to see the smooth scrolling effect.</p> </div> <script> $(document).ready(function() { // Add scrollspy to <body> $('body').scrollspy({ target: ".navbar", offset: 50 }); // Add smooth scrolling on all links inside the navbar $("#myNavbar a").on('click', function(event) { // Make sure this.hash has a value before overriding default behavior if (this.hash !== "") { // Prevent default anchor click behavior event.preventDefault(); // Store hash var hash = this.hash; // Using jQuery's animate() method to add smooth page scroll // The optional number (800) specifies the number of milliseconds it takes to scroll to the specified area $('html, body').animate({ scrollTop: $(hash).offset().top - 50 }, 800, function() { // Add hash (#) to URL when done scrolling (default click behavior) window.location.hash = hash - 50; }); } // End if }); }); </script> </body> </html> 

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM