I'm building a one-page site with a fixed-positioned navigation bar which scrolls smoothly to the different section elements through anchor links. The default behaviour for scrolling to an element is to align it to the top of the browser window. Instead, I want to align the element to the middle of the screen.
I use this markup for navigation:
<nav class="main-nav"> <a href="#top">Top</a> <a href="#section-1">Section 1</a> <a href="#section-2">Section 2</a> <a href="#section-3">Section 3</a> <a href="#section-4">Section 4</a> <a href="#section-5">Section 5</a> </nav>
I use kswedberg's jQuery Smooth Scroll plugin to smooth the scrolling. I initiate it like this:
$('.main-nav a').smoothScroll({ offset: 0, speed: 700 });
I want to set the offset to be ((window).height / 2) - (element height / 2)
so that it's vertically centered, but I need help to figure out how to execute it properly.
I need it to:
Since there are many anchor links I assume I either need to check the height of the element the anchor link that was clicked links to, or initiate smoothScroll for every anchor link.
Does anybody know how to do this?
In jQuery, the scrollTo() method is used to set or return the vertical scrollbar position for a selected element. This behavior can be used to scroll to the top of the page by applying this method on the window property. Setting the position parameter to 0 scrolls the page to the top.
jQuery scrollTop() Method The scrollTop() method sets or returns the vertical scrollbar position for the selected elements. Tip: When the scrollbar is on the top, the position is 0. When used to return the position: This method returns the vertical position of the scrollbar for the FIRST matched element.
To scroll to an element, just set the y-position to element. offsetTop . The SmoothScroll.
Here's how to do it with plain JQuery using scrollTo()
$('.main-nav a').on('click', function(e) { var el = $( e.target.getAttribute('href') ); var elOffset = el.offset().top; var elHeight = el.height(); var windowHeight = $(window).height(); var offset; if (elHeight < windowHeight) { offset = elOffset - ((windowHeight / 2) - (elHeight / 2)); } else { offset = elOffset; } var speed = 700; $('html, body').animate({scrollTop:offset}, speed); });
This is a combination of straker's code and code from this question: jQuery scrollTo - Center Div in Window Vertically
The API provides a way to execute a smoothScroll not bound to an element. You'll want to execute this method inside an onclick event for the anchor tags so that you can have access to it's target. Then you can calculate what you need to to get to the desired position. Since offset
is now an absolute offset instead of a relative offset, you'll need to get the exact position to scroll to.
$('.main-nav a').on('click', function(e) { var el = $( e.target.getAttribute('href') ); var elOffset = el.offset().top; var elHeight = el.height(); var windowHeight = $(window).height(); var offset; if (elHeight < windowHeight) { offset = elOffset - ((windowHeight / 2) - (elHeight / 2)); } else { offset = elOffset; } $.smoothScroll({ speed: 700 }, offset); return false; });
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With