Sticky Scroll to Top Button in LWC
Hi Folks,
This is a very simple requirement but often we get stuck and while googling about it we don't find a solid solution that would directly work in Salesforce LWC.
Here I am writing my blog which can be used in your LWC directly, just need to follow the below points.
Few points before jumping on to the entire code.
- We are going to use the Element.scrollTop property to control the scroll bar.
- This code works if you have a specific Scroll Bar for your element. Meaning you have added a custom scroll bar for your <div>
How to do that?
First, add a topmost div with a class and an onscroll method which would be able to calculate at which position is your scroll bar is currently.<div class="top-most-div" onscroll={onScroll}><!-- All your other code--></div> - Add the CSS for the top-container.top-most-div{overflow-y: scroll;height:80vh;scroll-behavior: smooth;}
- If you want to show the "Scroll To Top" button after scrolling certain pixels then add this kind of logic:onScroll (event) {let knowledgeWidgetElement = this.template.querySelector('.top-most-div');if (this.isInsideEntry && knowledgeWidgetElement.scrollTop > 20 && !this.showContentByIdErrorSVG && this.showCompleteEntry) {this.showBackToTop = true; // Variable that will hide/unhide the button}else {this.showBackToTop = false;}}
- The HTML Code snippet that creates the button:<template if:true={showBackToTop}><div class="container slds-m-top_large"><!-- The "container class is responsible for showing the button as sticky"--><span class="slds-badge slds-badge_inverse move-to-top" onclick={scrollTopHandler}>Scroll to Top<span class="slds-badge__icon slds-badge__icon_right slds-badge__icon_inverse"><span class="slds-icon_container slds-current-color"><lightning-iconicon-name="utility:arrowup"size="xx-small"alternative-text="Scroll to top"></lightning-icon></span></span></span></div></template>
- Implementing the CSS for the container class..container{display: flex;justify-content: center;vertical-align: middle;position: sticky;bottom: 20px;overflow: hidden;}
- Implementing the scrollTopHandler JS Method.scrollTopHandler(event){let knowledgeWidgetElement = this.template.querySelector('.top-most-div');knowledgeWidgetElement.scrollTop=0;}
Note: This 'scrollTop' is the actual code that lets the scroller move to the topmost point of the div. And this only works if we have a specified div for us. In case we don't want to have a specified div then we have to use Element.scrollIntoView().
The whole working code is present HERE.
HTML
<template>
<div class="top-most-div" onscroll={onScroll}>
<p>12Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam eu felis a ipsum faucibus rhoncus. Etiam vitae
elit id est ultricies imperdiet. Fusce in euismod odio, nec accumsan nunc. Nulla facilisi. Pellentesque a
malesuada lacus, in gravida purus. Nam consectetur condimentum lectus at condimentum. Etiam blandit velit at
egestas viverra. Etiam dapibus quis nisi nec cursus. In dictum vestibulum velit, eu mollis leo porttitor sed.
Nullam sollicitudin enim ut tempor imperdiet. Vestibulum aliquet volutpat nulla, vitae posuere nulla vestibulum
iaculis. Quisque commodo, mi cursus condimentum ultricies, mauris neque auctor massa, sed sollicitudin urna quam
ut quam.Etiam diam neque, laoreet at elit in, convallis pulvinar metus. Duis blandit varius dolor, id facilisis
est tempus eu. Aliquam erat volutpat. Morbi ultricies velit ut nunc egestas iaculis. Aliquam blandit mi a tellus
tempus, id consequat mi tristique. Nam tempus sed lacus in semper. Integer cursus leo eu auctor luctus.Fusce nec
molestie est, eu auctor enim. Donec commodo quam eget magna condimentum efficitur non sed lectus. Aliquam
scelerisque libero in vestibulum volutpat. Aliquam et rhoncus nunc, sed pharetra orci. Aenean gravida libero
justo, non euismod eros molestie ut. Nulla eget commodo sem. Nullam ornare hendrerit pharetraIn lectus risus,
venenatis vel magna eget, mollis aliquet nibh. Nullam ac sem hendrerit purus placerat tincidunt. Morbi nec dolor
ac nisl dictum cursus. Sed feugiat elit sed luctus malesuada. Interdum et malesuada fames ac ante ipsum primis in
faucibus. Donec porttitor lectus ac ipsum dictum aliquet. Sed eleifend commodo imperdiet. Sed molestie varius
consequat. Morbi viverra lacus ex. Curabitur a dignissim lorem. Aenean quis congue justo..Lorem ipsum dolor sit
amet, consectetur adipiscing elit. Nullam eu felis a ipsum faucibus rhoncus. Etiam vitae
elit id est ultricies imperdiet. Fusce in euismod odio, nec accumsan nunc. Nulla facilisi. Pellentesque a
malesuada lacus, in gravida purus. Nam consectetur condimentum lectus at condimentum. Etiam blandit velit at
egestas viverra. Etiam dapibus quis nisi nec cursus. In dictum vestibulum velit, eu mollis leo porttitor sed.
Nullam sollicitudin enim ut tempor imperdiet. Vestibulum aliquet volutpat nulla, vitae posuere nulla vestibulum
iaculis. Quisque commodo, mi cursus condimentum ultricies, mauris neque auctor massa, sed sollicitudin urna quam
ut quam.Etiam diam neque, laoreet at elit in, convallis pulvinar metus. Duis blandit varius dolor, id facilisis
est tempus eu. Aliquam erat volutpat. Morbi ultricies velit ut nunc egestas iaculis. Aliquam blandit mi a tellus
tempus, id consequat mi tristique. Nam tempus sed lacus in semper. Integer cursus leo eu auctor luctus.Fusce nec
molestie est, eu auctor enim. Donec commodo quam eget magna condimentum efficitur non sed lectus. Aliquam
scelerisque libero in vestibulum volutpat. Aliquam et rhoncus nunc, sed pharetra orci. Aenean gravida libero
justo, non euismod eros molestie ut. Nulla eget commodo sem. Nullam ornare hendrerit pharetraIn lectus risus,
venenatis vel magna eget, mollis aliquet nibh. Nullam ac sem hendrerit purus placerat tincidunt. Morbi nec dolor
ac nisl dictum cursus. Sed feugiat elit sed luctus malesuada. Interdum et malesuada fames ac ante ipsum primis in
faucibus. Donec porttitor lectus ac ipsum dictum aliquet. Sed eleifend commodo imperdiet. Sed molestie varius
consequat. Morbi viverra lacus ex. Curabitur a dignissim lorem. Aenean quis congue justo..Lorem ipsum dolor sit
amet, consectetur adipiscing elit. Nullam eu felis a ipsum faucibus rhoncus. Etiam vitae
elit id est ultricies imperdiet. Fusce in euismod odio, nec accumsan nunc. Nulla facilisi. Pellentesque a
malesuada lacus, in gravida purus. Nam consectetur condimentum lectus at condimentum. Etiam blandit velit at
egestas viverra. Etiam dapibus quis nisi nec cursus. In dictum vestibulum velit, eu mollis leo porttitor sed.
Nullam sollicitudin enim ut tempor imperdiet. Vestibulum aliquet volutpat nulla, vitae posuere nulla vestibulum
iaculis. Quisque commodo, mi cursus condimentum ultricies, mauris neque auctor massa, sed sollicitudin urna quam
ut quam.Etiam diam neque, laoreet at elit in, convallis pulvinar metus. Duis blandit varius dolor, id facilisis
est tempus eu. Aliquam erat volutpat. Morbi ultricies velit ut nunc egestas iaculis. Aliquam blandit mi a tellus
tempus, id consequat mi tristique. Nam tempus sed lacus in semper. Integer cursus leo eu auctor luctus.Fusce nec
molestie est, eu auctor enim. Donec commodo quam eget magna condimentum efficitur non sed lectus. Aliquam
scelerisque libero in vestibulum volutpat. Aliquam et rhoncus nunc, sed pharetra orci. Aenean gravida libero
justo, non euismod eros molestie ut. Nulla eget commodo sem. Nullam ornare hendrerit pharetraIn lectus risus,
venenatis vel magna eget, mollis aliquet nibh. Nullam ac sem hendrerit purus placerat tincidunt. Morbi nec dolor
ac nisl dictum cursus. Sed feugiat elit sed luctus malesuada. Interdum et malesuada fames ac ante ipsum primis in
faucibus. Donec porttitor lectus ac ipsum dictum aliquet. Sed eleifend commodo imperdiet. Sed molestie varius
consequat. Morbi viverra lacus ex. Curabitur a dignissim lorem. Aenean quis congue justo..Lorem ipsum dolor sit
amet, consectetur adipiscing elit. Nullam eu felis a ipsum faucibus rhoncus. Etiam vitae
elit id est ultricies imperdiet. Fusce in euismod odio, nec accumsan nunc. Nulla facilisi. Pellentesque a
malesuada lacus, in gravida purus. Nam consectetur condimentum lectus at condimentum. Etiam blandit velit at
egestas viverra. Etiam dapibus quis nisi nec cursus. In dictum vestibulum velit, eu mollis leo porttitor sed.
Nullam sollicitudin enim ut tempor imperdiet. Vestibulum aliquet volutpat nulla, vitae posuere nulla vestibulum
iaculis. Quisque commodo, mi cursus condimentum ultricies, mauris neque auctor massa, sed sollicitudin urna quam
ut quam.Etiam diam neque, laoreet at elit in, convallis pulvinar metus. Duis blandit varius dolor, id facilisis
est tempus eu. Aliquam erat volutpat. Morbi ultricies velit ut nunc egestas iaculis. Aliquam blandit mi a tellus
tempus, id consequat mi tristique. Nam tempus sed lacus in semper. Integer cursus leo eu auctor luctus.Fusce nec
molestie est, eu auctor enim. Donec commodo quam eget magna condimentum efficitur non sed lectus. Aliquam
scelerisque libero in vestibulum volutpat. Aliquam et rhoncus nunc, sed pharetra orci. Aenean gravida libero
justo, non euismod eros molestie ut. Nulla eget commodo sem. Nullam ornare hendrerit pharetraIn lectus risus,
venenatis vel magna eget, mollis aliquet nibh. Nullam ac sem hendrerit purus placerat tincidunt. Morbi nec dolor
ac nisl dictum cursus. Sed feugiat elit sed luctus malesuada. Interdum et malesuada fames ac ante ipsum primis in
faucibus. Donec porttitor lectus ac ipsum dictum aliquet. Sed eleifend commodo imperdiet. Sed molestie varius
consequat. Morbi viverra lacus ex. Curabitur a dignissim lorem. Aenean quis congue justo..</p>
<template if:true={showBackToTop}>
<div class="container">
<span class="slds-badge slds-badge_inverse scrollToTopClass"
onclick={scrollToTop}>Scroll to top
<span class="slds-badge__icon slds-badge__icon_right slds-badge__icon_inverse">
<span class="slds-icon_container slds-current-color">
<lightning-icon icon-name="utility:arrowup"
size="xx-small"
alternative-text="Scroll to top">
</lightning-icon>
</span>
</span>
</span>
</div>
</template>
</div>
</template>
JavaScript
CSS
Demo
import { LightningElement } from "lwc";
export default class App extends LightningElement {
showBackToTop = false;
scrollToTop(){
let knowledgeWidgetElement = this.template.querySelector('.top-most-div')
knowledgeWidgetElement.scrollTop=0;
}
onScroll () {
let mydiv = this.template.querySelector('.top-most-div')
if (mydiv.scrollTop > 40) {
this.showBackToTop = true;
}
else {
this.showBackToTop = false;
}
}
}
CSS
.container{
display: flex;
justify-content: center;
height: 24px;
vertical-align: middle;
position: sticky;
position: -webkit-sticky;
bottom: 0;
overflow: hidden;
}
.scrollToTopClass {
background-color: #025316;
color: white;
font-weight: normal;
border-radius: 160px;
cursor: pointer;
}
.top-most-div{
overflow-y: scroll;
height:680px;
scroll-behavior: smooth;
}
Demo
thanks for sharing information
ReplyDeletesalesforce billing course online
salesforce billing classes online