CSS HTML

Offsetting an html anchor to adjust for fixed header

Offsetting an html anchor to adjust for fixed header?

  • You could use CSS without any javascript.
  • Give your anchor a class:
HTML CODE
="<a classanchor" id="top"></a>
  • You can then position the anchor with an offset higher or lower than where it actually appears on the page, by making it a block element by relatively positioning it. -250px will position the anchor upto 250px
CSS CODE
a.anchor 
{
    display: block;
    position: relative;
    top: -250px;
    visibility: hidden;
}

  • This is another solution using HTML  code for offseting an html anchor:
HTML CODE
<a name="mywikianchor">
    <h1 style="padding-top: 40px; margin-top: -40px;">My anchor</h1>
</a>
  • This doesn’t create any gap in the content and anchor links works.

CSS solution :

CSS CODE
a[name] 
{
  padding-top: 40px;
  margin-top: -40px;
  display: inline-block; /* required for webkit browsers */
}
  • In CSS, optionally you may want to add the following if the target is still off the screen:
CSS CODE
 vertical-align: top;

  • This is one of the solution:
CSS CODE
*[id]:before 
{ 
  display: block; 
  content: " "; 
  margin-top: -75px; 
  height: 75px; 
  visibility: hidden; 
}

 HTML :

HTML CODE
<div id="#anchor"></div> <!-- #anchor here is the anchor tag which is on your URL -->

JavaScript :

JAVASCRIPT CODE
 $(function() 
{
  $('a[href*=#]:not([href=#])').click(function() {
    if (location.pathname.replace(/^\//,'') == this.pathname.replace(/^\//,'') 
&& location.hostname == this.hostname) 
{
      var target = $(this.hash);
      target = target.length ? target : $('[name=' + this.hash.slice(1) +']');
      if (target.length) 
{
        $('html,body').animate(
{
          scrollTop: target.offset().top - 125 //offsets for fixed header
        
}
, 1000);return false;     
 }
 } 
 });
  //Executed on page load with URL containing an anchor tag.
  if($(location.href.split("#")[1])) 
{
      var target = $('#'+location.href.split("#")[1]);
      if (target.length) 
{
        $('html,body').animate(
{
          scrollTop: target.offset().top - 125 //offset height of header here too. }, 1000); return false;
}    }});

CSS CODE
a[id]:before 
{
    content:"";
    display:block;
    height:50px;
    margin:-30px 0 0;
}
  • That will append a pseudo-element before every a-tag with an id. Adjust values to match the height of your header.
READ  [ Solved - 11 Answers ] CSS - Changing the color of an hr element

  • For modern browsers, just add the CSS3 :target selector to the page. This will apply to all the anchors automatically.
CSS CODE
:target 
{
    display: block;    
    position: relative;     
    top: -100px;
    visibility: hidden;
}

  • Adjust the height and the negative margin to the offset you need…
CSS CODE
:target:before 
{
    content: "";
    display: inline-block;
    height: 180px;
    margin: -180px 0 0;
}

  • You can include a smooth-scroll effect to the anchor, while making it stop at -60px above the anchor, fitting nicely underneath the fixed bootstrap navigation bar (requires jQuery):
JAVASCRIPT CODE
$(".dropdown-menu a[href^='#']").on('click', function(e) 
{
   // prevent default anchor click behavior
   e.preventDefault();

   // animate
   $('html, body').animate(
{
       scrollTop: $(this.hash).offset().top - 60
 }, 300, function()
{
     });
});

  • We added 40px-height .wiki element holding the anchor before each h1 elements.
HTML CODE
<div class="wiki" id="gherkin"></div>
<div class="page-header">
  <h1>wikitechy</h1>
</div>

CSS:

CSS CODE
.wiki 
{
 height: 40px;
}

About the author

Venkatesan Prabu

Venkatesan Prabu

Wikitechy Founder, Author, International Speaker, and Job Consultant. My role as the CEO of Wikitechy, I help businesses build their next generation digital platforms and help with their product innovation and growth strategy. I'm a frequent speaker at tech conferences and events.

6 Comments

Click here to post a comment