NB: Make sure you do a back up of your theme, files and database before attempting the tutorials
Last modified : Aug 23 2022
Estimated reading time : 3 minutes, 42 seconds - 275 words
Share the post "Configuring Anchors: Sticky or Fixed"
With this tutorial, we will show you how to configure anchors at the perfect height with either position sticky or fixed.
We found various ways to pull this off with CSS but we also found additional coding information on the web.
The first thing required is that your fixed or sticky header needs to be measured in pixels to get an approximate height of your header.
Result of anchors with a fixed header.
We can clearly see in our example that the title is in the anchor. Logically, seeing as my ID is above it, we should land above the title.
CSS for your sticky or fixed header
You need to make sure to add the following CSS value: top:0. It’s this value that will position perfectly your anchor at the right spot.
The problem with headers configured with a sticky or fixed position is that the anchor doesn’t always land where you want it to be given there’s a gap caused by the pixel height of the header.
Here our HTML body needs to have the sticky CSS while the header needs position and top.
body.stiky header { position: sticky; background: #fff; z-index: 3; width: 100%; left: 0; top: 0; }
We then found this helpful code which will fix the gap issue.
In our example, the height of our header is 215px.
OFFSET_HEIGHT_PX: 215,
Javascript to add in the footer
<script> (function(document, history, location) { var HISTORY_SUPPORT = !!(history && history.pushState); var anchorScrolls = { ANCHOR_REGEX: /^#[^ ]+$/, OFFSET_HEIGHT_PX: 215, /** * Establish events, and fix initial scroll position if a hash is provided. */ init: function() { this.scrollToCurrent(); $(window).on('hashchange', $.proxy(this, 'scrollToCurrent')); $('body').on('click', 'a', $.proxy(this, 'delegateAnchors')); }, /** * Return the offset amount to deduct from the normal scroll position. * Modify as appropriate to allow for dynamic calculations */ getFixedOffset: function() { return this.OFFSET_HEIGHT_PX; }, /** * If the provided href is an anchor which resolves to an element on the * page, scroll to it. * @param {String} href * @return {Boolean} - Was the href an anchor. */ scrollIfAnchor: function(href, pushToHistory) { var match, anchorOffset; if(!this.ANCHOR_REGEX.test(href)) { return false; } match = document.getElementById(href.slice(1)); if(match) { anchorOffset = $(match).offset().top - this.getFixedOffset(); $('html, body').animate({ scrollTop: anchorOffset}); // Add the state to history as-per normal anchor links if(HISTORY_SUPPORT && pushToHistory) { history.pushState({}, document.title, location.pathname + href); } } return !!match; }, /** * Attempt to scroll to the current location's hash. */ scrollToCurrent: function(e) { if(this.scrollIfAnchor(window.location.hash) && e) { e.preventDefault(); } }, /** * If the click event's target was an anchor, fix the scroll position. */ delegateAnchors: function(e) { var elem = e.target; if(this.scrollIfAnchor(elem.getAttribute('href'), true)) { e.preventDefault(); } } }; $(document).ready($.proxy(anchorScrolls, 'init')); })(window.document, window.history, window.location); </script>
Final result with the anchor
We see that the anchor is positioned exactly where the ID is, i.e. above the title.
Slide effect on the anchor
You can also add a slide effect that drops the ID towards the anchor.
html {scroll-behavior: smooth;}