Smooth Animated Scrolling with JavaScript

In the past, many plugins (e.g. jQuery) have enabled the ability to cause a page to scroll down in a smooth animated fashion, rather than the sudden jarring fashion that occurs by default. This technique is often used for same-page (local) links that jump to specific sections of longform content. The following script and demo shows how you can do smooth animated in-page scrolling with plain JavaScript and no libraries or plugins.

Suppose the page has the following list of local links, followed by paragraphs of text separated by headings that have IDs that match the local links:

<ul class="links">
    <li><a href="#one">Section One</a></li>
    <li><a href="#two">Section Two</a></li>
    <li><a href="#three">Section Three</a></li>
    <li><a href="#four">Section Four</a></li>
    <li><a href="#five">Section Five</a></li>
    <li><a href="#six">Section Six</a></li>
</ul>

We can use the following JavaScript to enable smooth animated scrolling to the different section headings:

let btns = document.querySelectorAll('.links a'); 

for (i of btns) { 
  (function(i) { 
    i.addEventListener('click', function(e) { 
      document.getElementById(this.hash.split('#')[1]).scrollIntoView({ 
        behavior: 'smooth' 
      }); 
      e.preventDefault(); 
    }); 
  })(i); 
}

The code above loops through all the targeted links, adding an event listener to each one and it uses the scrollIntoView() method to scroll to the specified element. The method takes an optional options object that defines the scroll behavior.

We can also include a “Scroll back to top” button that smooth-scrolls back to the top of the page:

document.querySelector('.top').addEventListener('click', function () { 
  window.scrollTo({ 
    top: 0, 
    behavior: 'smooth' 
  }) 
}, false);

This time we’re using the scrollTo() method which can also define the scroll behavior. See the demo below for a full working example.

Note: To the best of our knowledge, the information above and the snippet are accurate and up to date. However, in case you notice something wrong, please report snippet or leave a comment below.
Back to Snippets
Scroll to Top