Skip to content

Instantly share code, notes, and snippets.

@HoundstoothSTL
Created May 3, 2013 15:43
Show Gist options
  • Star 66 You must be signed in to star a gist
  • Fork 8 You must be signed in to fork a gist
  • Save HoundstoothSTL/5510082 to your computer and use it in GitHub Desktop.
Save HoundstoothSTL/5510082 to your computer and use it in GitHub Desktop.
Anchor scroll with fixed header offset
(function($) {
$('a[href*=#]:not([href=#])').click(function()
{
if (location.pathname.replace(/^\//,'') == this.pathname.replace(/^\//,'')
|| location.hostname == this.hostname)
{
var target = $(this.hash),
headerHeight = $(".primary-header").height() + 5; // Get fixed header height
target = target.length ? target : $('[name=' + this.hash.slice(1) +']');
if (target.length)
{
$('html,body').animate({
scrollTop: target.offset().top - headerHeight
}, 500);
return false;
}
}
});
})(jQuery);
@richwertz
Copy link

Many, many thanks for this!

@pork-chop
Copy link

Just recently noticed this script error on my site --

Syntax error, unrecognized expression: a[href*=#]:not([href=#])

The quick update for line 2 in this gist is:

$('a[href*=\\#]:not([href=\\#])').click(function()

@0x44454c
Copy link

I personally don't think this is an efficient way!
Better know the height of header and do add the following in your css
.offset{margin-top: -5em !important; padding-top: 5em !important;} and add the class offset to the desired html element.

NB: Obviously change 5em to your header height!!

@theYogam
Copy link

theYogam commented Mar 1, 2021

Thank you,
But you could simply replace target = target.length ? target : $('[name=' + this.hash.slice(1) +']'); by target = $(this).attr('href');

Anyway, it works for me

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment