Search code examples
htmlcsshyperlinknavbarfixed

How do I link to top of a section on the page minus the height of a fixed nav-bar?


When I click a link on my fixed navigation bar, it jumps to a specific section on the page, but the fixed nav-bar's height spills over. How can I subtract that height? Will this require javascript/jquery?

<div id="fixedNavWrapper">
    <div id="navLinks">
        <ul>
            <li><a href="#about">ABOUT ME</a></li>
            <li><a href="#portfolio">PORTFOLIO</a></li>
        </ul>
    </div>
</div>

<section id="about" class="section">
    <h2>ABOUT ME</h2>
</section>

.CSS:

#fixedNavWrapper {
  position: fixed;
  z-index: 1;
  width: 100%;
  top: 0;
  left: 0;
}

#navLinks {
  text-align: center;
  width: 100%;
  height: 57px;
  background: #000000;
}

#navLinks ul {
  list-style: none;
  margin: 0;
  padding: 5px;
  display: inline-block;
} 

#navLinks ul li {
  margin: 0;
  padding: 0;
  display: inline;
}

#navLinks ul li a {
  text-decoration: none;
  display: block;
  float: left;
  padding: 0 65px;
  height: 45px;
  line-height: 45px;
}

Solution

  • I think that you can't do it with css. However you can use jQuery to do it. Quite easy:

    HTML (add classes to li elements to identify them in your jQuery code):

    <div id="fixedNavWrapper">
        <div id="navLinks">
            <ul>
                <li class="about"><a href="#about">ABOUT ME</a></li>
                <li class="portfolio"><a href="#portfolio">PORTFOLIO</a></li>
            </ul>
        </div>
    </div>
    
    <section id="about" class="section">
        <h2>ABOUT ME</h2>
    </section>
    

    JS (Use event .click to move your "body" to the correct position )

    $('li.about').click(function(){
     positionabout = $('#about').offset().top - $('#fixedNavWrapper').height(); // Position of #about - nav height = correct position
     $("html, body").animate({scrollTop:positionabout}, '500', 'swing');
    })
    $('li.portfolio').click(function(){
     positionport = $('#portfolio').offset().top - $('#fixedNavWrapper').height();
     $("html, body").animate({scrollTop:positionport}, '500', 'swing');
    })