This Vanilla JS code snippet helps you to create a smooth scroll to sections. It comes with a smooth scrolling list in which list items can be clicked and it will smoothly scroll up. You can integrate this code snippet to make a smooth scrolling list.
How to Create Smooth Scroll in Vanilla JS
1. First of all, create the HTML structure as follows:
<ul> <li>CLICK TO SCROLL HERE</li> <li>CLICK TO SCROLL HERE</li> <li>CLICK TO SCROLL HERE</li> <li>CLICK TO SCROLL HERE</li> <li>CLICK TO SCROLL HERE</li> <li>CLICK TO SCROLL HERE</li> <li>CLICK TO SCROLL HERE</li> <li>CLICK TO SCROLL HERE</li> <li>CLICK TO SCROLL HERE</li> <li>CLICK TO SCROLL HERE</li> <li>CLICK TO SCROLL HERE</li> <li>CLICK TO SCROLL HERE</li> <li>CLICK TO SCROLL HERE</li> <li>CLICK TO SCROLL HERE</li> <li>CLICK TO SCROLL HERE</li> <li>CLICK TO SCROLL HERE</li> <li>CLICK TO SCROLL HERE</li> <li>CLICK TO SCROLL HERE</li> <li>CLICK TO SCROLL HERE</li> <li>CLICK TO SCROLL HERE</li> </ul>
2. After that, add the following CSS styles to your project:
* {
margin: 0;
padding: 0;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
-webkit-overflow-scrolling: touch;
-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
-moz-tap-highlight-color: rgba(0, 0, 0, 0);
tap-highlight-color: rgba(0, 0, 0, 0);
}
ul li:nth-child(1) {
color: rgba(60, 60, 80, 0.8);
background: rgba(0, 0, 255, 0.0333333333);
}
ul li:nth-child(2) {
color: rgba(120, 120, 160, 0.8);
background: rgba(0, 0, 255, 0.0666666667);
}
ul li:nth-child(3) {
color: rgba(180, 180, 240, 0.8);
background: rgba(0, 0, 255, 0.1);
}
ul li:nth-child(4) {
color: rgba(240, 240, 255, 0.8);
background: rgba(0, 0, 255, 0.1333333333);
}
ul li:nth-child(5) {
color: rgba(255, 255, 255, 0.8);
background: rgba(0, 0, 255, 0.1666666667);
}
ul li:nth-child(6) {
color: rgba(255, 255, 255, 0.8);
background: rgba(0, 0, 255, 0.2);
}
ul li:nth-child(7) {
color: rgba(255, 255, 255, 0.8);
background: rgba(0, 0, 255, 0.2333333333);
}
ul li:nth-child(8) {
color: rgba(255, 255, 255, 0.8);
background: rgba(0, 0, 255, 0.2666666667);
}
ul li:nth-child(9) {
color: rgba(255, 255, 255, 0.8);
background: rgba(0, 0, 255, 0.3);
}
ul li:nth-child(10) {
color: rgba(255, 255, 255, 0.8);
background: rgba(0, 0, 255, 0.3333333333);
}
ul li:nth-child(11) {
color: rgba(255, 255, 255, 0.8);
background: rgba(0, 0, 255, 0.3666666667);
}
ul li:nth-child(12) {
color: rgba(255, 255, 255, 0.8);
background: rgba(0, 0, 255, 0.4);
}
ul li:nth-child(13) {
color: rgba(255, 255, 255, 0.8);
background: rgba(0, 0, 255, 0.4333333333);
}
ul li:nth-child(14) {
color: rgba(255, 255, 255, 0.8);
background: rgba(0, 0, 255, 0.4666666667);
}
ul li:nth-child(15) {
color: rgba(255, 255, 255, 0.8);
background: rgba(0, 0, 255, 0.5);
}
ul li:nth-child(16) {
color: rgba(255, 255, 255, 0.8);
background: rgba(0, 0, 255, 0.5333333333);
}
ul li:nth-child(17) {
color: rgba(255, 255, 255, 0.8);
background: rgba(0, 0, 255, 0.5666666667);
}
ul li:nth-child(18) {
color: rgba(255, 255, 255, 0.8);
background: rgba(0, 0, 255, 0.6);
}
ul li:nth-child(19) {
color: rgba(255, 255, 255, 0.8);
background: rgba(0, 0, 255, 0.6333333333);
}
ul li:nth-child(20) {
color: rgba(255, 255, 255, 0.8);
background: rgba(0, 0, 255, 0.6666666667);
}
ul {
position: relative;
top: 0;
right: 0;
bottom: 0;
left: 0;
width: 90%;
max-width: 300px;
height: 640px;
overflow: auto;
margin: auto;
border-radius: 4px;
box-shadow: 0 3px 6px rgba(0, 0, 0, 0.16), 0 3px 6px rgba(0, 0, 0, 0.23);
}
ul li {
width: 100%;
height: 80px;
font: 300 12px/80px Arial, sans-serif;
color: rgba(255, 255, 255, 0.5);
text-align: center;
list-style: none;
cursor: pointer;
}
ul li.is-selected {
background: #fbfbfb;
color: rgba(0, 0, 255, 0.5);
}
3. Finally, add the following JavaScript code and done.
document.
querySelector('ul').
addEventListener('click', function (e) {
smoothScrollTo(selected(e.target, this).offsetTop, this);
});
function smoothScrollTo(destination, parent, time) {
let scroll = init();
requestAnimationFrame(shouldScroll);
function init() {
let start = parent.scrollTop;
let ticks = time || 30;
let i = 0;
let positionY = () => (destination - start) * i / ticks + start;
let isFinished = () => i++ >= ticks;
return { positionY, isFinished };
}
function shouldScroll() {
if (scroll.isFinished()) return;
parent.scrollTop = scroll.positionY();
requestAnimationFrame(shouldScroll);
}
}
function selected(elem, parent) {
for (let i = 0; i < parent.children.length; i++) {
parent.children[i].classList.remove('is-selected');
}
elem.classList.add('is-selected');
return elem;
}
That’s all! hopefully, you have successfully integrated this smooth scroll code snippet into your project. If you have any questions or facing any issues, feel free to comment below.
Similar Code Snippets:

I code and create web elements for amazing people around the world. I like work with new people. New people new Experiences.
I truly enjoy what I’m doing, which makes me more passionate about web development and coding. I am always ready to do challenging tasks whether it is about creating a custom CMS from scratch or customizing an existing system.



